brunch

You can make anything
by writing

C.S.Lewis

by 서오석 Jan 19. 2016


Nginx 설정

for CentOS 6.7 

뭐.. 이곳저곳 예제가 많아서 굳이 쓸 필요가 있을까 싶지만.. 

그래도 혹시나 필요할까 싶어서 적어본다. 


일단 centOS에서 yum으로 컴파일에 필요한 걸 install 하자.

> yum install gcc-c++


pcre, openssl, zlib는 다운받자.  (추가적인 라이브러리 3가지를 쓴다.)

> tar xvfs openssl-1.0.2e.tar.gz
> tar xvfz zlib-1.2.8.tar.gz
> tar xvfz pcre-8.38.tar.gz   (pcre2 말고 pcre를 받아야 한다.)

configure로 설정을 하자. (설정은 필요하면 추가하고 필요 없으면 빼자.)

> ./configure --prefix=~/program/nginx-1.9.9 \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-zlib=./zlib-1.2.8 \
--with-openssl=./openssl-1.0.2e \
--with-pcre=./pcre-8.38 \
--user=fennecfox \
--group=fennecfox


Apache Http Server하고 다른 부분은 apache의 경우 pcre같은 걸 모두 컴파일하고난 결과 path를 configure로 잡지만 nginx는 source path를 설정하면 같이 컴파일 한다. 


컴파일을 해보자

> make

줄줄줄.. 줄줄줄..

에러를 만나면.. 둘 중 하나이다. path를 잘못 설정했거나 추가하려는 모듈이 없는 경우다. 

찾아서 설치하거나 수정하자.


> sudo make install (root로 해서 make install 해도 된다.)


설치 완료. 


심볼링 링크를 걸자.

ln -s nginx-1.9.9 nginx 

prefix에 버전을 넣고 심볼릭 링크를 거는 이유는 다른 사람이 봤을 때 nginx 버전을 쉽게 확인하게 하기 위해서이다. 안그럼 따로 버전을 확인해야 한다. 


기본 설정에서 쓸 설정들을 바꿔보자 (자세한 건 여기에서  확인하자. 예제는 여기에서 확인하자.)

user  fennecfox;

nginx가 구동 될 때 해당 유저명으로 구동된다. 
(80포트는 원래 root로 배정되기 때문에 nginx를 해당 유저가 start, stop 할 수는 없다. )

worker_processes  8;

nginx의 worker 프로세서 갯수를 지정한다. 최소 cpu core 갯수 정도로 설정해두자.

error_log  logs/error.log warn;
error_log  logs/error.info.log  info;

에러로그를 남길 위치 및 레벨을 지정한다. warn으로 해두면 warn, error가 해당 로그에 찍힌다.

pid        logs/nginx.pid;

nginx의 pid를 파일로 남긴다.

events {
    worker_connections  2048;
}

processer 당 처리할 수 있는 connections 갯수를 설정한다.  위에 8개를 설정했으니 8 * 2048개의 요청을 처리하게 된다. 해당 숫자보다 더 많은 요청이 들어오면 nginx가 쳐내버린다.

max값은 'ulimit -n' 보다 작아야 한다. 

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

로그 포멧을 설정한다.  위 설정대로 하면 로그 포멧이 다음과 같이 나온다.

127.0.0.1 - - [19/Jan/2016:03:12:32 +0900] "POST /send HTTP/1.1" 200 72 "-" "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5" "-"
    access_log  logs/access.log  main;

말 그대로 access_log이다. 

    sendfile        on;
    keepalive_timeout  65;

keepalive가 무엇인지는 여기에서 참조한다. 불특정 다수에게 서비스하는 서버의 경우 keepalive를 끄는 것이 맞고 특정 서버만을 대상으로 서비스하는 경우 키는 것이 좋다. 

    gzip  on;
    gzip_static on;
    gzip_disable "msie6";
    gzip_types application/x-javascript application/javascript application/xml text/javascript application/json text/json text/css text/plain application/xhtml+xml;

plane text의 경우 response를 압축해서 전송한다. 모듈 설명은 여기를 참조한다.


server 설정은 서버를 어떻게 구축하느냐에 따라 조금씩 달라져서 내용에 추가적으로 쓰진 않고 대충 proxy로 넘겨서 처리하는 부분에 대해서만 설정을 복사해서 남긴다.


이 설정은 nginx를 단순히 80->8080으로 port forward하는 용도로만 사용할 때 지정했던 것이다.

        upstream fennec-api {
        server 127.0.0.1:8080;
        keepalive 200;
    }
    server {
        listen       80;
        server_name  api.fennec.fox.io;
        charset utf-8;
        access_log  logs/api.access.log  main;
        location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_cookie_domain localhost api.fennec.fox.io;
            proxy_pass http://fennec-api/api/;
            proxy_redirect default;
            proxy_cookie_path /api/ /;         
        }
        location ~* \. (js|css|png|jpg|jpeg|gif|ico) {
            access_log off;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

위 설정은 upstream을 이용해서 포트 포워딩을 하면서 tomcat의 docbase를 기준으로 /api로 만들어지는 uri를 /로 변경하는 것 까지  설정되어 있다.


서버 설정 리로드는 다음과 같다.

> sbin/nginx -s signal

stop

 — fast shutdown

quit

 — graceful shutdown

reload

 — reloading the configuration file

reopen

 — reopening the log files


config 테스트는 다음과 같다.

>sbin/nginx -t

서버 시작은 그냥 nginx를 실행하면 된다.

>sbin/nginx


nginx 로그는 cronolog를 사용해서 split할 수 없기 때문에 logrotate를 사용해서 처리한다.

>cat > /etc/logrotate.d/nginx
/home/fennecfox/logs/nginx/*.log {
        daily
        missingok
        maxage 10
        compress
        delaycompress
        notifempty
        nomail
        create 640 fennecfox fennecfox
        sharedscripts        
        postrotate
                [ -f /home/fennecfox/logs/nginx/nginx.pid ] && kill -USR1 `cat /home/fennecfox/logs/nginx/nginx.pid`
        endscript
}
ctrl + c


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari