[서버운영] 스쿨 가상서버에 Ubuntu 14.04 설치하기 + ksplice

[서버운영] 스쿨 가상서버에 Ubuntu 14.04 설치하기 + ksplice



우분투 14.04 LTS 버전이 출시된 지도 이제 넉 달이 되었네요. 이쯤 되면 안정성도 꽤나 높아집니다. 

그러나 아직 스쿨호스팅 가상서버는 우분투 12.04까지밖에 제공하지 않으므로 

14.04를 써보고 싶다면 직접 업그레이드하는 과정이 필요합니다. 



========= ※ 경 고 ※ ========= 


아래의 내용을 따라하시다가 서버가 먹통이 되거나 데이터를 날려먹을 경우 저는 책임을 지지 않습니다. 

아래의 내용은 새로 설치한 가상서버 기준입니다. 장기간 운영하던 서버라면 절대 따라하지 마세요. 


만약 2014년 가을 이후에 이 글을 읽고 계신 분은 스쿨호스팅에서 공식적으로 우분투 14.04를 지원하는지 

다시 한 번 확인해 보세요. 만약 공식적으로 지원한다면 그냥 우분투 14.04로 신청하시는 것이 훨씬 편합니다. 


우분투 14.04는 아파치 2.4, PHP 5.5, MySQL 5.5가 포함되어 있습니다. 

특히 아파치 2.4는 기존의 2.2와 달라진 부분이 많아서 

사용하시던 .htaccess 규칙들이 에러를 뿜을 가능성이 있으니 주의하시기 바랍니다. 

심지어 아주 간단한 deny from all 이런 것조차 에러를 뿜습니다 ㅠㅠ 



========= ※ 순 서 ※ ========= 


0. 스쿨호스팅에서 가상서버를 신청합니다. OS는 우분투 12.04로 하고, 가능하면 APM 설치나 보안설정은 신청하지 않습니다. 

프로그램이 많이 설치되어 있거나 커스터마이징을 할수록 업그레이드 도중에 에러가 발생할 확률이 증가하기 때문입니다. 


1. 가상서버에 ssh로 접속합니다. 리눅스 서버라면 여기까지는 기본이죠? 


2. 가상서버는 ssh 호스트 키가 OS 템플릿에 함께 저장되어 있는 경우가 종종 있습니다. 

이걸 그대로 두면 같은 호스팅 업체에서 생성한 가상서버는 모두 같은 호스트 키를 사용하는 문제가 생깁니다. 

ssh의 중간자 공격을 막는 유일한 수단인 호스트 키가 쓸모없게 되어 버리는 거죠. 

그래서 저는 가상서버를 신청할 때마다 제일 먼저 ssh 호스트 키를 확인하곤 합니다. 


한번 확인해 볼까요? 


    ls -l /etc/ssh/ssh_host_* 


헐~ ssh 호스트 키 생성일이 모두 2012년 5월 18일입니다. 템플릿 생성 날짜인 것으로 보입니다. 

이대로 두면 안됩니다. 호스트 키를 다시 생성해 줘야 합니다. 


    rm /etc/ssh/ssh_host_* 

    ssh-keygen -A 


이렇게 하고 ssh 연결을 끊었다가 다시 접속하면 호스트 키가 바뀌었다고 에러가 나옵니다. 

맥 또는 리눅스 환경에서 에러를 해결하려면 아래와 같은 명령으로 기존의 키 정보를 삭제한 후 다시 접속하면 됩니다. 


    ssh-keygen -f "~/.ssh/known_hosts" -R 서버IP주소 


윈도우에서 PuTTY를 사용하는 경우에는 경고 나왔을 때 적당한 단추를 클릭해 주기만 하면 됩니다. 


3. 일단 모든 패키지를 최신 상태로 업그레이드합니다. 


    apt-get update 

    apt-get dist-upgrade 


4. 이제 업그레이드할 준비가 다 되었습니다. 


    do-release-upgrade 


설치 도중 연결이 끊길 경우에 대비하여 ssh 데몬을 추가로 실행하겠냐고 물어봅니다. 

y를 눌러 확인하고, 포트 번호를 기억해 둡니다. 

만약 중간에 끊길 경우 여기로 접속해서 screen -x 하면 끊긴 곳부터 다시 진행할 수 있습니다. 


5. 업그레이드를 진행합니다. 


  - 엔터를 몇 번 치다 보면 몇 개의 패키지를 업그레이드할 예정이고 몇 MB가 소요된다고 묻는 화면이 나옵니다. 

    y를 눌러 확인해 줍니다. 

  - ssh 루트 로그인을 금지하는 부분은 No를 선택합니다. 지금 루트로 로그인되어 있잖아요. 

  - 패키지 업그레이드 도중 서비스 자동 재시작은 Yes를 선택해도 됩니다. 

  - grub header 파일을 교체하겠냐고 물으면 y를 누릅니다. 

  - 패키지 삭제를 물으면 y를 누릅니다. 

  - 시스템 재시작 여부를 물으면 y를 누릅니다. 


6. 시스템 재시작이 끝난 후 다시 ssh로 접속해 봅니다. 

몇 분이 지나도 접속이 안 된다면 어딘가 문제가 있는 것이니 스쿨호스팅에 도움을 요청하거나 

OS 재설치 신청하세요 (5,500원 ㅠㅠ) 


7. 스쿨호스팅 가상서버는 VMware 기반입니다. 

최상의 성능을 얻으려면 가상서버 내부에서 vmtools 데몬이 돌아가야 합니다. 

그런데 우분투를 업그레이드하면 이게 중단되어 버리는 경우가 있습니다. 

아래의 명령으로 vmtools 데몬이 실행중인지 확인합니다. 


    ps -C vmtoolsd 


실행중이지 않다면 아래의 명령으로 vmtools를 다시 설정합니다. 


    apt-get purge open-vm-tools 

    /usr/bin/vmware-config-tools.pl 


엔터를 몇 번 쳐주면 됩니다. 


8. 다시 한번 재부팅을 해봅니다. 정상적으로 연결이 된다면 무사히 업그레이드를 마치신 것입니다. 추카~!!! 



==== ※ 보너스 : ksplice 설치 ※ ==== 


스쿨호스팅은 전가상화 방식이므로 커널을 직접 관리해야 합니다. 

(반면, KT uCloud처럼 반가상화 방식으로 운영되는 서버는 커널을 직접 관리할 필요가 없습니다.) 

그런데 우분투는 커널 업데이트가 잦습니다. 특히 LTS 버전이 나온 후 최초 몇 개월간은 업데이트를 밥먹듯이 해요. 


이걸 적용하자니 재부팅을 해야 하고, 적용하지 않자니 보안 취약점이나 버그가 걱정되죠. 

그래서 재부팅 없이 커널 업데이트가 가능한 ksplice를 설치해 봅시다. 

ksplice는 오라클에서 제공하는 유료 서비스이지만, 우분투 사용자에게는 무료로 제공됩니다. 


우선 https://www.ksplice.com/uptrack/key 에서 메일주소를 입력하여 Access Key를 발급받습니다. 


그 다음에 /etc/apt/sources.list.d/ksplice.list 파일을 생성하여 아래의 내용을 추가합니다. 


    deb http://www.ksplice.com/apt trusty ksplice 

    deb-src http://www.ksplice.com/apt trusty ksplice 


ksplice 저장소의 공개키를 apt에 추가합니다. 


    wget -N https://www.ksplice.com/apt/ksplice-archive.asc 

    apt-key add ksplice-archive.asc 


저장소 정보를 업데이트하고, uptrack을 설치합니다. 


    apt-get update 

    apt-get install uptrack 


설치 도중 키를 물어보면 메일로 받은 키를 입력해 줍니다. 


이제부터 재부팅 없이 커널을 업그레이드하려면 uptrack-upgrade -y 명령을 사용하면 됩니다. 

apt-get에서 커널 업데이트 후 재부팅하라고 하면 무시해도 됩니다.

[서버운영] 웹 재요청 방지 및 트래픽 감소를 위한 방법

[서버운영] 웹 재요청 방지 및 트래픽 감소를 위한 방법


... 좀더 예쁜 모양으로 보고 싶다면 링크타고가서 보시오. 


from cache 

서버에 요청자체를 하지 않는다. 

가장 효과가 좋다.(요청 자체가 없으므로) 

최초 한번 데이터를 가져오면, 그 후로는 웹 브라우저의 캐시에서 데이터를 가져온다. 

즉, 서버와의 통신이 없어진다. 

하지만 F5를 누를 경우 새로 데이터가 전송된다.(HTTP Code 200 발생) 

관련 응답 해더 및 PHP 적용법 ($g는 캐시 기간(초)) 

header('Cache-Control:public, max-age='.$g); // HTTP/1.1 

지정 초 이전까지는 재요청하지 않도록 권장함 (새로 고침에서는 무시됨) 

header("Expires: ".gmdate("D, d M Y H:i:s", time()+$g)." GMT"); //캐시 

지정 시간까지는 재요청 하지 않도록 권장함 (새로 고침에서는 무시됨) 

apache의 경우 mod_expires 적용 



304 Not Modified 

요청은 하지만, 트래픽이 아주 적게 발생된다.(해더 전송 정도만 발생) 

F5로 새로 요청해도 Etag나 Last-Modified의 조건에 맞으면 HTTP Code는 304가 발생된다.(실제 데이터 전송은 없음) 

(ctrl+F5의 경우 etag와 Last-Modified 가 없이 요청되므로 새로 가져온다.) 

관련 응답 해더 및 PHP적용법 

header("Etag: ".$etag_key); //etag 

파일의 수정내역을 Etag로 만들어서 출력한다. 

클라이언트가 같은 Etag로 요청하면, 304코드를 알려준다. 

아파치의 경우 FileETag 부분 참고 

파일 수정 시간을 사용할 경우 문제가 될 수 있다. 

서버를 여러대 사용할 경우 서버 간의 파일의 시간 차가 발생될 수 있기 때문이다. 

여러서버를 묶어쓰는(L4에 연결 해서) 경우 사용안하는게 좋다 

PHP에서 처리할 경우 요청에서 HTTP_IF_NONE_MATCH 관련 처리가 필요 

header('Last-Modified: '.gmdate("D, d M Y H:i:s", time()+$g)." GMT"); 

지정 시간까지는 파일이 수정되지 않는다는 것을 나타낸다. 

즉, 그 시간에 재요청해봤자 304 코드가 반환된다. 

apache의 경우 mod_expires 적용 

PHP에서 처리할 경우 요청에서 HTTP_IF_MODIFIED_SINCE 관련 처리가 필요

[설치/설정] 아파치에서 외장하드를 DocumentRoot로 쓸 때...

[설치/설정] 아파치에서 외장하드를 DocumentRoot로 쓸 때...


민트리눅스가 좋아졌길래 

윈도우를 밀어버리고 

100%리눅스로 가려하고 있습니다. 


하지만, 리눅스를 작업용으로 쓰려고 이런저런 설정을 하고 

외장하드를 DocumentRoot로 설정하고 접속하려는 순간~~~ 제명이 됐... 아..아니.. 

403 에러를 뿜어내는 것이었습니다. 


윈도우에 비해 보안이 철저한 나머지 내 외장하드에 내가 접속하겠다는데도 403에러를 내보내내요. 


알고보니 쉬운(사실은 이 것 때문에 2시간정도 허비했었죠. ㅠ_ㅠ) 



[핵심] 

-------------------------------------------------------------------------------- 

(외장하드는 NTFS로 되어있어서 chmod, chown 이 안먹히는 상황, 나혼자만 보면 되는 시험서버) 


/etc/apache2/envars 

화일에서 


export APACHE_RUN_USER=[당신의ID] 

export APACHE_RUN_GROUP=[당신의모임ID] 


이부분을 고쳐주기만 하면 됩니다. 


예를 들어 wooyg라는 계정으로 리눅스를 로그인 한다면 

[당신의ID] 부분은 

export APACHE_RUN_USER=wooyg 

-------------------------------------------------------------------------------- 

이렇게 되겠죠. ^^ 


알고보니 별거 아닌데 ㅠ_ㅠ

서버운영_웹 재요청 방지 및 트래픽 감소를 위한 방법

서버운영_웹 재요청 방지 및 트래픽 감소를 위한 방법


from cache 

서버에 요청자체를 하지 않는다. 

가장 효과가 좋다.(요청 자체가 없으므로) 

최초 한번 데이터를 가져오면, 그 후로는 웹 브라우저의 캐시에서 데이터를 가져온다. 

즉, 서버와의 통신이 없어진다. 

하지만 F5를 누를 경우 새로 데이터가 전송된다.(HTTP Code 200 발생) 

관련 응답 해더 및 PHP 적용법 ($g는 캐시 기간(초)) 

header('Cache-Control:public, max-age='.$g); // HTTP/1.1 

지정 초 이전까지는 재요청하지 않도록 권장함 (새로 고침에서는 무시됨) 

header("Expires: ".gmdate("D, d M Y H:i:s", time()+$g)." GMT"); //캐시 

지정 시간까지는 재요청 하지 않도록 권장함 (새로 고침에서는 무시됨) 

apache의 경우 mod_expires 적용 



304 Not Modified 

요청은 하지만, 트래픽이 아주 적게 발생된다.(해더 전송 정도만 발생) 

F5로 새로 요청해도 Etag나 Last-Modified의 조건에 맞으면 HTTP Code는 304가 발생된다.(실제 데이터 전송은 없음) 

(ctrl+F5의 경우 etag와 Last-Modified 가 없이 요청되므로 새로 가져온다.) 

관련 응답 해더 및 PHP적용법 

header("Etag: ".$etag_key); //etag 

파일의 수정내역을 Etag로 만들어서 출력한다. 

클라이언트가 같은 Etag로 요청하면, 304코드를 알려준다. 

아파치의 경우 FileETag 부분 참고 

파일 수정 시간을 사용할 경우 문제가 될 수 있다. 

서버를 여러대 사용할 경우 서버 간의 파일의 시간 차가 발생될 수 있기 때문이다. 

여러서버를 묶어쓰는(L4에 연결 해서) 경우 사용안하는게 좋다 

PHP에서 처리할 경우 요청에서 HTTP_IF_NONE_MATCH 관련 처리가 필요 

header('Last-Modified: '.gmdate("D, d M Y H:i:s", time()+$g)." GMT"); 

지정 시간까지는 파일이 수정되지 않는다는 것을 나타낸다. 

즉, 그 시간에 재요청해봤자 304 코드가 반환된다. 

apache의 경우 mod_expires 적용 

PHP에서 처리할 경우 요청에서 HTTP_IF_MODIFIED_SINCE 관련 처리가 필요


관련 링크 : http://www.mins01.com/home/board/board.php?type=read&b_id=tech&page=1&b_idx=903&t=1414993105