본문 바로가기
미들웨어/Nginx

NGINX의 설정에 대해 쉽게 알아보자.

by leedonggeun 2023. 5. 10.
지난 포스트에서는 NGINX를 설치해 보았습니다.
이제 우리는 이 웹서버를 적절히 사용하기 위해 설정에 대해 알아보고자 합니다.

NGINX 웹서버

0. 들어가기에 앞서서

Apache, NGINX 등 모든 웹서버는 아마 설정에 따라 성능이 천차만별일 것입니다.
이에 어느 설정이 있는지, 그 설정이 어떠한 역할을 하는지에 대해 아는 것이 중요합니다.

이에 이번 포스트는 NGINX가 제공하는 기본 설정에 대해 쉽게 알아보겠습니다.

1. nginx.conf

NGINX의 기본 설정 파일입니다.

[user@server /]# cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
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;

    include /etc/nginx/conf.d/*.conf;
}
Core Module
user NGINX process가 어느 사용자/그룹 으로 동작될 지의 설정입니다.
root로 설정 시 프로세스가 모든 권한을 갖게 되므로 자제 필요
worker_processes 발생되는 이벤트를 처리하는 작업자 프로세스 수에 대한 설정입니다.
보통의 경우 CPU 코어 수로 설정하지만, 감이 안올 땐 auto로 설정하기도 합니다.
error_log NGINX의 에러 로그를 저장하는 파일명을 지정합니다.
pid NGINX 실행 후 Process ID를 저장하는 경로를 지정합니다.
events 블록
worker_connections 하나의 worker process가 동시 처리할 수 있는 커넥션 수입니다.
worker_processes가 2이며, 이 설정이 1024로 설정되어있다면 한 번에 2048개의 커넥션을 처리할 수 있습니다.
*이 때, 클라이언트와의 커넥션 뿐만 아니라 프록시되는 서버와의 커넥션도 포함된다는 점을 인지해야 합니다.
HTTP 블록
include 특정 파일을 포함하는 설정입니다.
기본적으로는 /etc/nginx/mime.types 및 conf 디렉토리의 하위 conf를 포함합니다.

이 mime.types는 특정 파일에 대한 클라이언트의 요청이 들어올 경우, 해당 파일이 어떠한 Content-Type인지를 지정하여 전달합니다.

이에 이 파일은 잘못 설정되어있을 경우 사용자에게 잘못된 응답을 반환할 수 있습니다.
(ex. .html 파일이 text/html이 아닌 text/plain 으로 반환 되도록 설정되어있다면 브라우저는 html을 파싱하지 않고 plain text로 보여줍니다.)
default_type 이 웹서버의 기본 Content-Type을 지정합니다.
이 웹서버에서 해석할 수 없는 요청이라면 이 설정의 Content-Type을 반환합니다.
log_format 작성되는 로그의 포맷을 지정합니다.
사용되는 변수는 이곳에서 확인이 가능합니다.
access_log 클라이언트가 access할 때의 로그에 대한 설정입니다.
access_log {저장 위치} {log_format명}
sendfile 리눅스 서버의 sendfile() 시스템 콜을 사용할지 말지에 대한 설정입니다.
이 설정을 on으로 할 경우, 커널에서 최적화된 알고리즘을 통해 파일 전송 속도가 빨라지며 전송에 대한 메모리 사용이 감소되어 고성능 웹서버 구축에 매우 유용합니다.
keepalive_timeout 클라이언트의 접속 유지 시간을 지정합니다.
tcp_nopush TCP 연결을 맺은 클라이언트에게 데이터를 즉시 보낼지, 버퍼를 두고 보낼지에 대한 설정입니다.

ON으로 설정할 경우, 성능적인 이점이 있을 수 있지만 반환 데이터의 크기가 매우 클 경우 오히려 느려질 수 있으며, SSL/TLS 환경에서는 즉시 보내는 것을 보안적인 이유로 권장되지 않습니다.

그러므로 애플리케이션의 특성과 보안적인 요구사항을 생각하여 고려해야합니다.

 

2. default.conf

default.conf는 위의 nginx.conf의 http 블록에서 include 되어 있습니다.

server 블록을 사용해 각각의 도메인에 따라 별도의 서비스를 수행할 수 있습니다.
(같은 웹서버에서 다른 도메인으로 들어올 경우 다른 WAS 혹은 페이지로 보낼 수 있다.)

💡 굳이 default.conf로 만들지 않아도 되며, nginx.conf에 server 블록을 선언해도 상관 없으며,
      여러 conf로 나누어도 상관 없다.

 

nginx.conf의 http 블록에서 ./conf.d 디렉토리의 모든 .conf 파일을 포함한다.

[user@server nginx]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  localhost;

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

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
server 블록
listen 접근 포트를 지정할 수 있습니다.
포트를 80/443 등으로 나누어 각 server 블록에서 처리할 수 있도록 합니다.
server_name 호스트 네임을 지정합니다.
ex) localhost, www.example.org, www.naver.com
access_log 이 server 블록에 설정된 hostname으로 접근 시 access_log의 저장 위치를 별도로 지정합니다. (nginx의 http 블록과 별개)
error_page error_page {error_code_list} {error_page} 형태로 구성되며

클라이언트의 HTTP 요청이 error_code_list에 설정된 에러일 경우 지정한 error_page로 보여줍니다.

(ex.www.example.org/abcdefg404 로 접근 시 페이지가 없고 HTTP 상태 코드가 404일 경우 /404.html을 보여주도록 설정)
location


위의 예시로 들자면,

http://example.org/ 로 접근 시 index.html로 초기 페이지를 지정해주는 설정

 

3. 마치며...

기본적인 NGINX의 설정을 확인해 보았습니다.
제 딴엔 쉽게 풀어갈 수 있도록 설명했다고 하는데 잘 이해가 가실지 모르겠습니다.

이후에는 deny/allow 등 조금 더 실무적인 내용에 대해 알아보겠습니다.

댓글