All Articles

Nginx 서버 설치와 환경 설정

Nginx Fundamentals 수업을 듣고 정리한 내용입니다.

목차

패키지 매니저를 사용하여 Nginx 서버 설치하기

Nginx서버를 설치하는 방법은 먼저 리눅스 운영체제의 패키지 매니저를 사용하여 설치하는 방법이 있다. 이 방법은 쉽고 빠르게 설치가 가능하지만 설치 가능한 옵션이 제한되어 있고 추가적인 모듈에 대한 지원이 어렵다. 따라서 이 방법은 가장 기초적인 웹서버만을 필요로 할 때 사용할만한 방법이다. 우분투는 apt라는 패키지 매니저를 사용한다.

먼저 apt 패키지 매니저를 업데이트한다.

sudo apt-get update

다음 명령어로 nginx를 설치한다.

sudo apt-get install nginx

설치가 완료되면 설치만 완료된 것이 아니라 디폴트로 nginx 서버를 구동시켜준다. 이를 다음 명령어를 통해 확인해보자.

ps aux | grep nginx

위 명령을 치면 다음과 같이 현재 구동중인 nginx 서버 프로세스에 대한 정보가 나온다.

root     13915  0.0  0.1 141112  1548 ?        Ss   06:35   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 13917  0.0  0.6 143788  6348 ?        S    06:35   0:00 nginx: worker process
ubuntu   14015  0.0  0.0  14856  1004 pts/0    S+   06:37   0:00 grep --color=auto nginx

nginx 서버 환경설정 파일들은 다음의 경로에서 확인해 볼 수 있다.

ls -l /etc/nginx/
total 64
drwxr-xr-x 2 root root 4096 Jan 10 19:18 conf.d
-rw-r--r-- 1 root root 1077 Apr  6  2018 fastcgi.conf
-rw-r--r-- 1 root root 1007 Apr  6  2018 fastcgi_params
-rw-r--r-- 1 root root 2837 Apr  6  2018 koi-utf
-rw-r--r-- 1 root root 2223 Apr  6  2018 koi-win
-rw-r--r-- 1 root root 3957 Apr  6  2018 mime.types
drwxr-xr-x 2 root root 4096 Jan 10 19:18 modules-available
drwxr-xr-x 2 root root 4096 Feb  8 06:35 modules-enabled
-rw-r--r-- 1 root root 1482 Apr  6  2018 nginx.conf
-rw-r--r-- 1 root root  180 Apr  6  2018 proxy_params
-rw-r--r-- 1 root root  636 Apr  6  2018 scgi_params
drwxr-xr-x 2 root root 4096 Feb  8 06:35 sites-available
drwxr-xr-x 2 root root 4096 Feb  8 06:35 sites-enabled
drwxr-xr-x 2 root root 4096 Feb  8 06:35 snippets
-rw-r--r-- 1 root root  664 Apr  6  2018 uwsgi_params
-rw-r--r-- 1 root root 3071 Apr  6  2018 win-utf

맨 위로 가기

Nginx 서버 소스 설치하기 & 모듈 추가하기

위에서 우분투 패키지 매니저를 사용하여 nginx 서버를 설치하는 방법을 알아보았다. 여기서는 nignx 서버를 소스 설치하는 방법을 알아본다. 먼저 기존에 패키지 매니저로 설치한 nginx 서버를 제거해야 한다. /etc/ 폴더 디렉토리에서 다음 명령을 통해 nginx 서버가 설치된 폴더를 삭제하면 된다.

sudo rm -rf nginx

다음은 먼저 nginx 소스 코드를 다운받는다. nginx.org 사이트에서 nginx 소스 코드를 다운 받을 수 있다. Mainline version의 nginx 소스코드를 다운받을 수 있는 경로를 복사하여 다음과 같은 명령어를 통해 다운받는다.

wget https://nginx.org/download/nginx-1.17.8.tar.gz

압축 파일이 다운받아졌을 것이고 다음 명령을 통해 압축을 풀어준다.

tar -zxvf nginx-1.17.8.tar.gz

압축이 풀리면 nginx 폴더가 생길 것이고 해당 폴더로 이동한다.

cd nginx-1.17.8/

먼저 nginx 서버를 빌드하기 위해 소스코드 환경설정을 해야 한다. 이를 위해 소스코드 디렉토리에서 환경설정 스크립트를 실행해야 한다.

./configure

위 명령어를 치면 다음과 같이 C compiler가 없다고 에러 메시지가 나온다.

checking for OS
 + Linux 4.15.0-1057-aws x86_64
checking for C compiler ... not found

./configure: error: C compiler cc is not found

다음 명령어로 C 컴파일러를 포함하여 nginx를 컴파일하는데 필요한 모든 도구를 다운받는다.

sudo apt-get install build-essential

이제 다시 환경설정 스크립트를 실행하면 이제 에러가 발생하지 않고 스크립트가 잘 실행된다. 스크립트 실행 마지막 부분에서 다음과 같은 에러가 발생하는데 HTTP rewrite 모듈은 PCRE 라이브러리를 필요로 하는데 해당 라이브러리가 컴퓨터에 설치가 되어있지 않기 때문에 발생하는 에러이다.

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

다음 명령어를 통해 추가적으로 필요한 라이브러리를 설치한다.

sudo apt-get install libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

이제 다시 환경설정 스크립트를 실행하면 에러없이 실행이 잘된다. 이제 nginx 소스코드를 컴파일할 준비가 되었다. 그 전에 커스텀 환경설정 플래그를 추가해야 한다. 다음 명령어로 가능한 모든 환경설정 옵션을 확인할 수 있다. 하지만 여기에는 각 옵션에 대한 설명이 나와있지 않아 처음에는 이해하기 어렵다. nginx 공식문서에 이에 대한 설명이 잘 나와있으니 참고해보면 된다.

./configure --help

다음 명령과 같이 환경설정을 다시 설정할 수 있다. 첫번째 옵션 -sbin-path=/usr/bin/nginx를 통해 nginx 서버를 실행하고 멈출 수 있는 실행가능한 파일들(executables)이 /usr/bin/nginx에 생성이 되도록 설정을 한다. --with-pcre 옵션은 Nginx 서버가 정규표현식을 사용할 때 시스템의 PCRE 라이브러리를 사용하도록 하는 옵션이다.

./configure --sbin-path=/usr/bin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre --pid-path=/var/run/nginx.pid

Nginx 서버를 소스코드 설치함으로서 얻을 수 있는 가장 중요한 이득은 커스텀 모듈을 추가할 수 있다는 점과 기존의 표준 Nginx 기능들을 확장할 수 있다는 점이다. 이는 그냥 패키지 매니저를 사용하여 Nginx 서버를 설치했을 때는 할 수 없는 일들이다.

Nginx 모듈에는 두 가지 형태가 있다. 하나는 번들 모듈(bundled modules)이고 다른 하나는 써드파티 모듈이다(third party module). 써드파티 모듈은 다른 개발자에 의해 만들어진 모듈이고 이를 사용하기 위해서는 다운로드를 받고 컴파일해야 한다. 반면, 번들 모듈은 Nginx에 포함된 모듈을 의미한다. 예를들어 --with-http__ssl_module 옵션을 주면 Nginx는 빌드를 할 때 이 모듈을 포함시킨다.

최종적으로 다음과 같이 환경설정을 하여 엔터를 치면 해당 설정대로 적용이 된다.

./configure --sbin-path=/usr/bin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-pcre --pid-path=/var/run/nginx.pid --with-http__ssl_module

설정 작업이 끝나면 다음과 같이 설정 내용에 대한 요약(Summary)을 정리해서 보여준다.

Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/bin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/etc/nginx"
  nginx configuration file: "/etc/nginx/nginx.conf"
  nginx pid file: "/var/run/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

아무런 이상이 없이 여기까지 완료되었으면 다음 명령어로 이 환경설정이 적용된 소스를 컴파일한다.

make

그다음 다음 명령어를 통해 컴파일 된 소스를 설치하면 된다.

make install

다음 명령어를 통해 nginx가 설치된 디렉토리를 확인해보자

ls -l /etc/nginx
total 68
-rw-r--r-- 1 root root 1077 Feb  8 11:12 fastcgi.conf
-rw-r--r-- 1 root root 1077 Feb  8 11:12 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 Feb  8 11:12 fastcgi_params
-rw-r--r-- 1 root root 1007 Feb  8 11:12 fastcgi_params.default
-rw-r--r-- 1 root root 2837 Feb  8 11:12 koi-utf
-rw-r--r-- 1 root root 2223 Feb  8 11:12 koi-win
-rw-r--r-- 1 root root 5231 Feb  8 11:12 mime.types
-rw-r--r-- 1 root root 5231 Feb  8 11:12 mime.types.default
-rw-r--r-- 1 root root 2656 Feb  8 11:12 nginx.conf
-rw-r--r-- 1 root root 2656 Feb  8 11:12 nginx.conf.default
-rw-r--r-- 1 root root  636 Feb  8 11:12 scgi_params
-rw-r--r-- 1 root root  636 Feb  8 11:12 scgi_params.default
-rw-r--r-- 1 root root  664 Feb  8 11:12 uwsgi_params
-rw-r--r-- 1 root root  664 Feb  8 11:12 uwsgi_params.default
-rw-r--r-- 1 root root 3610 Feb  8 11:12 win-utf

그리고 다음 명령어로 Nginx 버전을 확인해보면 버전과 함께 환경 설정 옵션을 보여준다.

nginx -V
nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-GkiujU/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

다음 명령어를 통해 Nginx 서버를 start 시킨다.

nginx

다음 명령어를 통해 실행중인 Nginx 서버 프로세스를 확인한다.

ps aux | grep nginx

다음 명령어를 통해 Nginx 서버를 중단시킨다.

service nginx stop

맨 위로 가기

Nginx Service 추가하기

위의 과정을 통해 Nginx 소스 설치를 하였다. 이제는 Nginx 시스템 서비스를 추가하는 방법을 알아보자. 리눅스에는 systemd라는 시스템 서비스가 있다. 이 링크systemd가 무엇인지에 대한 설명이 다음과 같이 자세히 나와있는 것 같지만 정확히 이해하기 쉽지는 않은 것 같다. 여기서는 systemd라는 시스템 서비스를 통해 Nginx 서버를 start, stop, restart, reload(configuration), start on boot 시킬 수 있다는 것 정도 이해하면 될 것 같다. 위키피디아 글을 읽어보니 systemd의 목표는 리눅스 시스템 전반에서 서비스 환경설정과 행동을 제어하는 일련의 통일된 명령 집합을 제공한다고 한다.

systemd를 알아보기 전에 nginx 스탠다드 커맨드 툴을 사용하여 nginx를 제어할 수 있다. 다음 명령어를 통해 nginx 제어 옵션을 확인해보자.

nginx -h
nginx version: nginx/1.14.0 (Ubuntu)
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file

이 중 -s 옵션으로 다음과 같이 nginx 서버를 멈출 수 있다. 하지만 스탠다드 커맨드 툴로는 할 수 있는게 제한적이기 때문에 systemd 서비스를 추가한다.

nginx -s stop

systemd 서비스를 활성화하기 위해서는 작은 스크립트를 추가해야 한다. 이 스크립트는 nginx 공식 사이트에서 가져온다.

해당 스크립트를 이 사이트에서 지정해준 경로의 파일(/lib/systemd/system/nginx.service)에 저장해야 한다. 이를 위해 해당 경로에 파일을 만들고 nano를 사용하여 해당 파일에 스크립트를 추가할 수 있도록 한다.

touch /lib/systemd/system/nginx.service
nano /lib/systemd/system/nginx.service

지금 내가 수정하는 시점에서는 해당 파일에 필요한 스크립트가 자동으로 추가되도록 변경이 된 것 같다. 해당 파일이 이미 디폴트로 생성되어 있었고 필요한 스크립트가 이미 있다. 하지만 환경설정을 할 때 옵션을 준대로 스크립트에 몇가지 파일 경로를 수정해야 한다. /sbin/ 경로를 /bin/으로 변경하면 된다.

이제 systemd를 사용하여 nginx 서버를 제어할 수 있다. 다음 명령어를 통해 nginx 서버를 구동시킨다.

systemctl start nginx

이전에 하던 것처럼 ps aux | grep nginx 말고 systemd를 사용하여 nginx 서버의 구동 상태를 확인할 수도 있다.

systemctl status nginx
Warning: The unit file, source configuration file or drop-ins of nginx.service changed on disk. Run 'systemctl daemon-reload' to reload uni
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-02-09 07:54:33 UTC; 5min ago
     Docs: man:nginx(8)
  Process: 13011 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=1/FAILURE)
  Process: 13059 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 13050 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 13061 (nginx)
    Tasks: 2 (limit: 1152)
   CGroup: /system.slice/nginx.service
           ├─13061 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─13063 nginx: worker process

Feb 09 07:54:33 ip-172-31-32-158 systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 09 07:54:33 ip-172-31-32-158 systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument
Feb 09 07:54:33 ip-172-31-32-158 systemd[1]: Started A high performance web server and a reverse proxy server.

nginx 서버 stop 명령어이다.

sudo systemctl stop nginx

서버 컴퓨터가 처음에 부팅이 될때 nginx 서버가 자동으로 구동이 되도록 하고 싶으면 다음과 같이 해준다.

systemctl enable nginx

다음 명령어로 서버 컴퓨터를 재부팅한다.

reboot

서버 컴퓨터가 재부팅되면 다시 서버로 ssh 접속을 하고 nginx의 상태를 확인해보면 자동으로 구동이 된 것을 확인해 볼 수 있다.

맨 위로 가기

Nginx 환경설정 용어

directive - 환경설정 파일에서 셋팅된 환경설정 옵션을 지칭한다. ex) server_name mydomain.com
context - 환경설정 파일에서 하나의 섹션을 의미한다. 스코프와 같다. 스코프 처럼 컨텍스트는 부모 안에 중첩되어 있다. 아래의 예시에서 server 컨텐스트는 http 컨텍스트 내부에 중첩되어 있다.

worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   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   html;
        }
    }
}

맨 위로 가기

가상 호스트(virtual host) 생성하기

여기서 주로 설정할 메인 환경설정 파일은 다음 경로의 nginx.conf 파일이다.

ls -l /etc/nginx/
total 68
-rw-r--r-- 1 root root 1077 Feb  8 11:12 fastcgi.conf
-rw-r--r-- 1 root root 1077 Feb  8 11:12 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 Feb  8 11:12 fastcgi_params
-rw-r--r-- 1 root root 1007 Feb  8 11:12 fastcgi_params.default
-rw-r--r-- 1 root root 2837 Feb  8 11:12 koi-utf
-rw-r--r-- 1 root root 2223 Feb  8 11:12 koi-win
-rw-r--r-- 1 root root 5231 Feb  8 11:12 mime.types
-rw-r--r-- 1 root root 5231 Feb  8 11:12 mime.types.default
-rw-r--r-- 1 root root 2656 Feb  8 11:12 nginx.conf
-rw-r--r-- 1 root root 2656 Feb  8 11:12 nginx.conf.default
-rw-r--r-- 1 root root  636 Feb  8 11:12 scgi_params
-rw-r--r-- 1 root root  636 Feb  8 11:12 scgi_params.default
-rw-r--r-- 1 root root  664 Feb  8 11:12 uwsgi_params
-rw-r--r-- 1 root root  664 Feb  8 11:12 uwsgi_params.default
-rw-r--r-- 1 root root 3610 Feb  8 11:12 win-utf

여기서는 nginx.conf 파일의 events 컨텍스트에는 아무것도 추가하지 않을 것이지만 환경 설정파일의 유효성을 위해 events 컨텍스트는 적어줘야 한다.

/etc/nginx/nginx.conf

events {}
...

여기서 첫번째로 해줘야 할 것은 가상 호스트를 정의하는 것이다. 각 가상 호스트는 새로운 server 컨텍스트 또는 서버 블록이 된다. 이는 해당 포트를 listening하는 역할을 하게 된다. 일반적으로 http 요청은 80번 포트, https 요청은 443번 포트에서 listening을 하게 된다.

http{
  server {
    listen 80;
  }
}

그 다음으로는 server_name을 지정해준다. 도메인, 서브도메인 또는 ip 주소가 된다.

http{
  server {
    listen 80;
    server_name 13.209.4.7;
  }
}

마지막으로는 root directive를 추가한다. 이 루트 path 에서 Nginx는 클라이언트의 정적파일에 대한 요청을 처리한다. 예를들어 만약 클라이언트에서 /images/cat.png 파일에 대한 요청이 들어오면 nginx는 디폴트로 /root/path/images/cat.png에서 해당 파일을 찾는다.

http{
  server {
    listen 80;
    server_name 13.209.4.7;

    root /sites/demo;
  }
}

여기까지 설정에 대한 내용이 적용이 되려면 systemd 서비스를 사용하여 nginx 환경설정을 reload 해야 한다. restart 보다는 reload 명령어를 사용하여 downtime(시간이 더 걸리는 것)을 방지할 수 있다. 만약 환경설정 파일에 에러가 있다면 reload는 실패하게 된다. 하지만 변경 전의 환경설정을 그대로 유지하며 nginx가 stop되지 않는다. 반면에 restart는 먼저 nginx 서버를 stop 시키고 만약 새로운 환경설정 파일에 에러가 있다면 nginx서버를 start 시키지 않는다.

만약 새로 적용한 환경설정 파일이 의도대로 reload 되지 않는다면 다음 명령을 사용하여 nginx를 test 해봐야 한다.

nginx -t

위의 환결설정 파일에서 설정한 root /sites/demo 다이렉티브의 경로 /sites/demo는 서버 컴퓨터의 루트 경로에서의 /sites/demo를 의미한다. 이제 /sites/demo 경로에 간단한 커스텀 html과 css파일을 넣고 nginx를 reload하고 이 서버의 ip에 접속한 웹브라우저를 새로고침하면 방금 적용한 커스텀 html 파일이 뜨는 것을 확인해 볼 수 있다.

하지만 여기서 문제점은 화면에 css가 적용이 안되는 점이다. Nginx가 style sheet에 잘못된 MIME TYPE을 보내기 때문이다. 다음과 같이 curl를 사용하여 서버에 style.css 헤더를 요청하여 이를 확인해볼 수 있다.

$curl -I http://13.209.4.7/style.css
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Wed, 12 Feb 2020 02:45:03 GMT
Content-Type: text/plain
Content-Length: 980
Last-Modified: Wed, 12 Feb 2020 01:27:53 GMT
Connection: keep-alive
ETag: "5e435499-3d4"
Accept-Ranges: bytes

Content-Typetext/plain으로 잘못 설정되어 있기 때문이다. 이를 제대로 설정하기 위해서는 Nginx에 해당 파일 확장자에 대한 Content-Type을 지정해줘야 한다. 이는 Nginx 환경설정 파일에서 새로운 컨텍스트를 지정함으로써 설정을 할 수 있다.

//nginx.conf

http {
  types {
    text/html html;
    text/css css;
  }

  server {
    ...
  }
}

하지만 더 쉬운 방법이 있다. nginx는 설정 파일의 일부분을 다른 파일로부터 가져와서 설정할 수 있도록 할 수 있다. 예를들어 이미 존재하는 설정가능한 다른 파일 중에 mime.types 파일이 다음의 디렉토리에 있다.

ls -l /etc/nginx/
total 68
-rw-r--r-- 1 root root 1077 Feb  8 11:12 fastcgi.conf
-rw-r--r-- 1 root root 1077 Feb  8 11:12 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 Feb  8 11:12 fastcgi_params
-rw-r--r-- 1 root root 1007 Feb  8 11:12 fastcgi_params.default
-rw-r--r-- 1 root root 2837 Feb  8 11:12 koi-utf
-rw-r--r-- 1 root root 2223 Feb  8 11:12 koi-win
-rw-r--r-- 1 root root 5231 Feb  8 11:12 mime.types
-rw-r--r-- 1 root root 5231 Feb  8 11:12 mime.types.default
-rw-r--r-- 1 root root   93 Feb 12 02:13 nginx.conf
-rw-r--r-- 1 root root 2656 Feb  8 11:12 nginx.conf.default
-rw-r--r-- 1 root root  636 Feb  8 11:12 scgi_params
-rw-r--r-- 1 root root  636 Feb  8 11:12 scgi_params.default
-rw-r--r-- 1 root root  664 Feb  8 11:12 uwsgi_params
-rw-r--r-- 1 root root  664 Feb  8 11:12 uwsgi_params.default
-rw-r--r-- 1 root root 3610 Feb  8 11:12 win-utf

cat을 사용하여 해당 파일을 확인해보면 다음과 같은 내용들이 있다.

cat /etc/nginx/mime.types

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;
...

참고로 MIME type이란 데이터의 타입을 나타내는 라벨이다. 이를 지정함으로서 소프트웨어 어플리케이션이 데이터를 어떻게 처리해야 하는지를 알 수 있다. what is mime type 참고

다음과 같이 Nginx 설정파일에서 이미 정의된 MIME type 을 바라보게 하여 설정을 할 수 있다.

//nginx.conf
http {
  include mime.types;
}

설정후 nginx를 reload하고 curl를 사용하여 다시 style.css 헤더를 확인해보면 다음과 같이 Content-Type 이 text/css로 올바르게 적용된 것을 확인해 볼 수 있다. 그리고 웹브라우저를 새로고침하면 css가 올바르게 적용된 화면을 볼 수 있다.

curl -I http://13.209.4.7/style.css
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Wed, 12 Feb 2020 03:09:40 GMT
Content-Type: text/css
Content-Length: 980
Last-Modified: Wed, 12 Feb 2020 01:27:53 GMT
Connection: keep-alive
ETag: "5e435499-3d4"
Accept-Ranges: bytes

맨 위로 가기

Location Blocks

location block은 위에서 살펴본 대로 단순히 요청에 대한 정적파일을 서비스하는 것이 아니라 해당 요청을 가로채서(intercept) 다른 일을 처리 할 수 있도록 해준다.

server {
 location uri {

 }
}

예를들어 현재는 서버에 /greet에 해당하는 리소스가 없기 때문에 해당 uri로 요청을 보내면 404 페이지가 뜬다. 여기서는 해당 요청이 들어왔을때 요청을 가로채서 다른 일을 처리하도록 정의해본다. 다음과 같이 location block을 정의해주고 Nginx를 reload를 하면 이제는 /greet로 요청을 보내면 아래에서 정의한 text가 return 되어 웹브라우저에 뜨는 것을 확인해 볼 수 있다.

server {
  ...

 location /greet {
   return 200 'Hello from nginx "/greet" location';
 }
}

이렇게 정의한 location 블록은 prefix match라고 한다. 즉, /greeting도 매치가 되고 /greeting/more같은 요청도 매치가 된다. 다음과 같이 /greet 앞에 =을 붙여주면 exact match가 되어 반드시 해당 uri 와 일치하는 요청이 들어왔을 때만 이를 처리한다.

server {
 ...

location = /greet {
  return 200 'Hello from nginx "/greet" location';
}
}

다음과 같이 정규표현식을 사용하여 매치가 되도록 정의할 수 있다. Nginx를 설치할 때 PCRE 라이브러리를 설치하였기 때문에 이를 사용한다. uri 앞에 ~를 붙여줌으로써 uri를 정규표현식을 사용하여 매칭할 것임을 알려준다. 여기서 정규표현식을 사용하면 case sensitive하게 된다. 대소문자를 구분한다는 하기때문에 대문자 소문자까지 정확히 일치해야 한다.

server {
 ...

location ~ /greet[0-9] {
  return 200 'Hello from nginx "/greet" location';
}
}

대소문자를 구분하고 싶지 않다면 다음과 같이 정의하면 된다. ~ 뒤에 *를 붙여주면 된다.

server {
 ...

location ~* /greet[0-9] {
  return 200 'Hello from nginx "/greet" location';
}
}

이와 같은 매칭 방법에서는 정규표현식(REGEX)을 사용한 매치가 prefix match보다 우선 매칭된다. prefix match를 정의한 location 블록이 정규표현식 매치보다 위에 정의되어 있더라도 마찬가지이다.

마지막 매칭 방법에는 preferential prefix match가 있다. 이는 기본적으로 정규표현식 매치와 동일하게 동작하지만 일반 정규표현식보다 더 우선순위에 매치가 된다. ~ 앞에 ^를 붙여주면 된다.

server {
 ...

location ^~ /Greet2 {
  return 200 'Hello from nginx "/greet" location';
}

location ~* /greet[0-9] {
  return 200 'Hello from nginx "/greet" location -REGEX MATCH INSENSITIVE';
}
}

위에서 살펴본 4가지 매칭 방법에 대한 우선순위는 Exact match > preferential prefix match > REGEX match > prefix match 가 된다.

맨 위로 가기

Variables

미리정의된 Nginx 모듈 변수는 nginx 공식사이트에서 확인해 볼수 있다. 다음과 같이 사용할 수 있다.

http {
  ...
  server {
    ...

    location /inspect {
      return 200 "$host\n$uri\n$args";
    }
  }
}

위와 같이 설정 후 nginx reload 후 서버에 요청을 보내면 다음과 같이 응답한다.

//요청
http://13.209.4.7/inspect?asfd=hi

//응답
13.209.4.7
/inspect
asfd=hi

``

다음과 같이 구성 후의 응답에 대한 요청은 다음과 같다. name 파라미터의 값을 가져올 수 있는 것이다.

http {
  ...
  server {
    ...

    location /inspect {
      return 200 "$arg_name";
    }
  }
}
//요청
http://13.209.4.7/inspect?name=john

//응답
john

location 컨텍스트에서 if문은 사용되지 않기를 권장된다. Nginx 공식 사이트에 if is Evil 이라는 포스팅까지 있으니..

내가 사용할 커스텀 변수도 정의할 수 있다.

http {

  server {
    ...

    set $weekend 'No';

    if ( $date_local ~ 'Saturday|Sunday' ) {
      set $weekend 'Yes';
    }

    location /is_weekend {
      return 200 $weekend;
    }

  }
}

맨 위로 가기

Rewrites & Redirects