월별 글 목록: 2014년 1월월

Apache > Nginx 교체했습니다.

기록을 남기기 위한 포스트…

Nginx 소개

일단 위키와 엔하위키 링크를 걸어드립니다. (어째 요새는 엔하위키 자료가 훨씬 실한 것이…)
http://ko.wikipedia.org/wiki/Nginx
http://mirror.enha.kr/wiki/Nginx

여튼 요약하자면 아파치를 무섭게 위협하고 있는 신예 서버입니다. 더 자세한 내용이 궁금하신 분들은 제 블로그를 보실게 아니고 얼른 구글링을 하세요.

Nginx로 갈아타게 된 계기

Nginx에 대한 얘기는 그동안 많이 들어왔지만, 사실 귀찮기도 하고 그냥 알고만 있는 수준으로 지냈습니다. 그러다 최근 가장 Nginx에 대한 매력을 준 포스트가 있었습니다. 레이니걸님의 일간 워스트 개장기였습니다. 제 주변에서도 이 글을 통해서 Nginx를 알게 되셨다는 분들도 계시더군요.

최근 회사에서 Nginx로 작업된 서버를 인수인계 받아서 설정도 바꾸고 이래저래 작업을 할 일이 있었습니다. 그러다 nginx.conf를 뜯어볼 일이 있었는데요, 쉽다 쉽다 말은 들었지만 열어서 막상 보니 신세계더군요. 물론 서버에 대한 지식이 얕으니 속속들이 다 알 수는 없지만, httpd.conf와 비교하면 정말 어마어마하게 설정이 쉽습니다.

이고잉님의 포스트에서 설정 파일을 잠깐 빌려오자면, 다음과 같이 생겼습니다.

server {
    listen       80;
    server_name  localhost;
 
    root   /usr/share/nginx/html;
    location / {
        index  index.html index.htm index.php;
    }
 
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

그 외에도 Fast CGI를 이용한 처리로 대규모 접속시의 유용성 등이 있겠습니다만 그건 저같은 영세 개발자에겐 ‘먼 훗날 한번쯤 그런걸 고민하는 날이 올려나’싶죠.

Nginx로 이전하는데 있어서의 걱정

걱정스러운 부분들로는 .htaccess 같은 부분들이 있었습니다. 제가 주력으로 사용하는 프레임워크는 CodeIgniter고, CMS로 WordPress를 사용하고 있습니다. 둘 다 .htaccess가 무척 중요하게 활용되죠. .htaccess 파일은 아파치 서버의 기술이니, Nginx로 서버를 바꾸게 되면 대체할 수 있는 다른 기술을 사용해야 합니다.

사실 .htaccess 사용할 때에도 쓸 줄을 몰라서 검색하고 붙여넣는 수준이었는데, 응용이라도 할라치면 내가 할 수 있을까 하는 걱정들이 들기 시작했습니다.

그 외에 뭐 그냥 막연한 걱정들이 여럿 들었지만, 어떻게 검색해보면 답이 있겠지 하는 마음으로 서버 변경을 결심했습니다.

현재 서버의 세팅

  • Apache
  • PHP 5.3
  • MariaDB 5.6

이제 여기에서 Apache를 비활성화하고 Nginx를 실행시킬겁니다.
PHP 5.4부터는 php-fpm이 기본포함이지만 현재 서버는 5.3이므로 php-fpm은 별도로 설치하기로 합니다. Nginx는 아파치와 몇 가지 개념들이 다릅니다. 우선 PHP를 직접 처리하지 않습니다. php의 처리 자체는 php-fpm이 하고요, Nginx가 php-fpm과 통신하는 방식으로 동작합니다. 이 때문에 소규모의 접속에서는 속도상의 이점이 발생하지는 않습니다.
대략적인 작업 방향이 정해졌으니 설치부터 진행해 보기로 합니다.

Nginx 설치

yum을 이용해서 nginx를 설치하기로 합니다. 그런데 기본 저장소는 1.0에 대한 설치만 지원하고 있습니다. 최신 버전은 1.4.4 입니다. yum 저장소를 추가해야 하는데 Nginx Wiki에 설치방법이 자세히 나와있습니다.

vim /etc/yum.repos.d/nginx.repo

해서, 저장소에 대한 정보를 저장해줍니다. 저는 CentOS 이므로

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

이렇게 넣어주고 저장했습니다.

yum install nginx

nginx가 잘 설치됩니다.

PHP-FPM 설치

이건 뭐… 간단하죠.

yum install php-fpm

최근 php5.3 기준으로 기본 저장소가 다 업데이트 되어서, php5-fpm 같은 이름을 넣을 필요가 없는 부분만 조심하시면 됩니다.

nginx.conf 설정

저 같은 경우엔 /etc/nginx/nginx.conf 위치에 파일이 있었습니다. 혹시 경로가 달라지시는 분들은 검색해보시고 변경하세요.

user  nginx;
worker_processes  1; # CPU 개수만큼 적어주면 된다고 합니다. 저는 1개...

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # 여기까지는 기본 설정입니다. 아래부터는 서버에 맞게 수정한 부분들입니다.

    # server_name을 지정하려면 필요합니다.
    # 에러는 32 이상 넣으라고 나오던데 검색해보니 64를 넣으라길래 순종적으로 64를 넣었습니다.
    server_names_hash_bucket_size 64; 

    # 제 블로그 관련 Virtual Host 입니다.
    server {
        listen  80;
        server_name  blog.grotesq.com;

        access_log  /var/log/nginx/blog.access.log;
        error_log  /var/log/nginx/blog.error.log;

        root  /var/www/html/grotesq_blog;
        index  index.php index.html index.htm;

        # .php 확장자인 모든 파일에 PHP-FPM을 사용하겠다는 location 설정입니다.
        location ~ \.php$ {
            try_files $uri =404;
            # 이고잉님의 강좌와 다르게 .sock 파일에 연결하지 않고 로컬호스트의 9000 포트로 연결했습니다.
            fastcgi_pass   127.0.0.1:9000; 
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        # 이 아래 두 location 설정은 WordPress Codex에서 검색한 결과를 넣었습니다.
        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
               access_log off; log_not_found off; expires max;
        }
    }

    # 이건 제 연구 페이지에 대한 Virtual Host 설정입니다. CodeIgniter에서 평소 쓰던 .htaccess를 대체하는게 관건이었습니다.
    server {
        listen  80;
        server_name  lab.grotesq.com;

        access_log  /var/log/nginx/lab.access.log;
        error_log  /var/log/nginx/lab.error.log;

        root  /var/www/html/lab;
        index  index.php index.html index.htm;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        # 기본 Rewrite Rule에 대한 설정입니다.
        location / {
                # Check if a file or directory index file exists, else route it to index.php.
                try_files $uri $uri/ /index.php;
        }

        # 기본 Rewrite Rule에 대한 예외 설정입니다.
        # .htaccess에서는 폴더단위로 예외를 지정했었는데 검색해보니 파일 확장자 단위로 에외를 적용하는 방법을 추천해서, 적용해 보았습니다.
        location ~* \.(ico|css|js|gif|jpe?g|png|woff|eot|ttf|swf)(\?[0-9]+)?$ {
                expires max;
                log_not_found off;
        }

    }

    # 기본으로 설정 되어있는 외부 설정파일 인클루드입니다.
    # 상기의 server 항목들을 낱개의 파일로 저장해 한 폴더에 묶어두고 include site-enabled/*.conf 같은 식으로 처리하는 경우도 많더군요.
    include  conf.d/*.conf;
}

Nginx 시작

아파치를 정지하고, Nginx를 시작합니다.

service httpd stop
/etc/rc.d/init.d/nginx start

아, 팁을 하나 추가하자면…
혹시 nginx.conf를 변경할 일이 생겼을 때엔 서버를 굳이 재시작 하지 않아도 됩니다.

/etc/rc.d/init.d/nginx reload

이런 식으로 설정 파일만 reload 해서 재시작 할 수 있습니다.

주의점

아직 사용시간이 많이 되지 않아 딱히 제가 느낀 주의점은 아니고… 검색 과정에서 알게 된 것들인데요. Nginx를 사용할 때엔 php에 대한 부분을 php-fpm이 담당하게 되니 php.ini를 변경하고 난 다음에는 php-fpm을 재시작 해줘야 합니다. 아파치 쓰던 느낌으로 Nginx만 백날 재시작 해봐야 적용되지 않습니다…

끝.
감사합니다.