/etc/nginx/nginx.conf 톺아보기
nginx/site-available/default에서 안내해준 공식 문서를 살펴보면 더욱 nginx를 잘 쓸 수 있다.
www.nginx.com/resources/wiki/start/
nginx.conf 위치 확인하기
/etc/nginx/nginx.conf는 nginx 전반 대한 설정을 담당합니다.
컴파일로 설치했다면 다른 경로로 설치되었을 것입니다.
nginx.conf의 위치를 확인하고 싶다면 다음 명령어를 사용해봅시다.
find / -name nginx.conf
nginx.conf 전체 구조
아무것도 건드리지 않고, 기본적으로 설정되어 있는 nginx.conf입니다.
큰 줄기는 아래 처럼 생겼습니다. (1)어느 블록에 속하지 않는 directive 4개와 (2)이벤트 블록, (3)http 블록으로 구성되어 있습니다.
이 구성은 설정에 따라 바꿔줄 수도 있는 부분입니다. ㅇㅇ
# main context에 놓인 directive
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
# 이벤트 블록
events {
...
}
# http 블록
http {
...
}
메인 컨텍스트에 위치한, 코어 모듈 부분
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
nginx.conf의 최상단에 위치하는 core 블록 부분을 살펴보겠습니다.
user는 nginx 프로세스가 실행되는 권한입니다. www-data, nobody, root 등으로 설정할 수 있습니다. 만약 user의 값이 root로 되어 있다면 워커 프로세스를 root의 권한으로 동작하게 되는 것인데 프로세스 권한을 누군가가 악의적으로 취득한 경우 문제가 될 수 있기 때문에 가급적이면 root를 적지 않아야 합니다.
worker_processes 는 몇 개의 워커 프로세스를 생성할 것인를 지정한다. 1이면 모든 요청을 하나의 프로세스로 실행하겠다는 거다. 멀티코어 CPU인데 1로 설명하면 멀티 코어를 쓰는 이유가 없다. auto로 놓자!
error_log는 말그대로 nginx 에러 발생시 로그가 쌓일 경로입니다.
pid는 nginx의 마스터 프로세스 id 정보가 저장됩니다.
Event 블록
events {
worker_connections 768;
# multi_accept on;
}
이벤트 블락을 살펴보겠습니다. nginx는 비동기 이벤트 처리 방식을 사용하고 있는데 events는 그와 관련된 설정을 하는 곳입니다.
worker_connections는 하나의 프로세스가 처리할 수 있는 커넥션의 수로 최대값이자 디폴트는 768입니다.
앞서 살펴본 메인 컨텍스트에 있는 worker_processes와 함께 계산해서 최대 커넥션 수를 도출할 수 있습니다.
최대 접속자 수(커넥션 수) = worker_processes(실행 가능한 프로세스의 수) * worker_connections(한 프로세스가 처리할 수 있는 커넥션 수)
Http 블록
http 블록 부분을 살펴보겠습니다. http 블록은 server, location 블록의 루트 블록입니다.
애초에 server 블록은 http 블록 내부에 작성되며 location 블록은 server 블록 내부에 작성되니 당연합니다.
위계구조를 시각해보자면 다음과 같이 정리될 수 있습니다.
실제 작동하는 코드는 아닙니다! 대략적인 항목을 살펴보기 쉽게 가급적 verbose하게 나열한 것 뿐입니다.
## 프로토콜.
http {
## http 단에서 설정
include /etc/nginx/mime.types;
default_type application/actet-stream;
## server block
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
try_files $uri /index.html;
## location block
location / {
proxy_set_header X-Forwarded-For $remote_addr;
client_max_body_size 0;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass "http://localhost:3000";
}
}
}
각 위계에 따라 설정할 수 있는 것들을 살펴보도록하겠습니다.
#1. http block
keepalive_timeout 은 접속시 커넥션을 몇 초 동안 유지할 것인지를 결정합니다. 종종 코딩하면서 응답이 없어서 timeout을 겪어보셨을 것입니다. 여기서는 65초로 설정되어 있습니다. 이 값이 너무 높으면 불필요한 커넥션을 유지하는 꼴이 되ㅣ 때문에 낮은 값으로 설정하는 것이 좋다고 합니다.
server_tokens는 헤더에 nginx의 버전을 숨기는 역할을 합니다. 보안상 off으로 설정하는 것이 좋습니다.
server_names_hash_bucket_size : NGINX 웹 서버에서 처리할 수 있는 호스트의 최대 개수를 설정할 수 있다.
server_names_hash_max_size: 호스트의 도메인 이름 길이 제한
이 값들이 낮을 경우 가상 호스트 도메인이 많이 연결되거나, 도메인의 이름이 길어지게 될 경우 공간이 부족해질 수 있다.
default값은 각각 32, 512입니다.
include는 설정을 불러와 적용하는 것입니다. 반복되는 옵션 항목을 쉽게 적용하기 위한 것입니다.
include /etc/nginx/mime.types; 같은 경우 /etc/nginx/mime.types를 불러와 미디어 타입을 지정해주었습니다.
실제로 출력해서 좀 확인해볼까요?
*를 사용해서 특정 폴더 하에 있는 모든 파일을 가져와 사용할 수도 있습니다.
include /etc/nginx/sites-enabled/*;
sites-enabled은 sites-available에 설정한 파일을 심볼릭 링크로 추가하여 실제 운영에 사용할 설정파일들이다.
쉽게 말해서, nginx.conf에 모든 것을 작성할 필요 없이 sites-available에 작성한 서버 블록이 여기에 등록된다는 것이다.
site-availabe/default를 조금 가져와봐서 쉽게 이해해보자. 이 내용들은 nginx.conf에 작성해도 되지만 site-availabe에 작성해도 된다.
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
server_name _;
location / {
...
}
}
upstream
nginx는 downstream고 python이던, C++ 이던 작성한 WAS는 upstream에 해당한다.
여러 서버를 지정해두고, 가중치(weight)를 줘서 로드 밸런싱을 구현할 수 있다.
#2. server block
가상 호스트 : 따로 포스트를 정리해놨습니다. darrengwon.tistory.com/543?category=895377
listen은 사용할 포트
root에는 우리가 만든 정적 파일들이 존재하는 곳으로 연결시켜 놓고
server_name에는 우리가 사용할 도메인 주소를 적어놓고
index에는 그 곳에서 기본적으로 렌더할 파일을 지정합니다.
서버 블락은 아래와 같이 if문을 통해서 특정 변수의 값에 따라 특정한 행동을 하게 만들수도 있습니다.
여기서는 $host, $request_uri 변수만 사용했습니다.
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
}
listen: 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
SSL 관련 설정
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
ssl on;
ssl_certificate /usr/local/nginx/ssl/www.ucert.co.kr.pem;
ssl_certificate_key /usr/local/nginx/ssl/www.ucert.co.kr.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 ; # TLS 1.2버전만 사용합니다.
# 범용 알고리즘을 적용합니다.
ssl_ciphers "ECDHE-RSA-AES2... 생략";
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
#3. location block
헤더 세팅, proxy http version, 경로 등을 설정해줄 수 있습니다.
location / {
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
client_max_body_size 0;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass "http://localhost:3000";
}
Nginx의 변수
앞서 server 블록에서 $host 변수를 사용했는데, 사용 가능한 nginx의 변수는 아래 공식 문서를 참고합시다. 엄청나게 많습니다.
nginx.org/en/docs/varindex.html
아무리 많다고는 하지만 일단 자주 사용하는 변수는 알아두자는 생각에 포스트에서 정보를 좀 가져와봤습니다.
http://example.com:80/production/module/index.php?type=module&id=12
- $host : opentutorials.org
- $uri : /production/module/index.php
- $args : type=module&id=12
- $server_addr : 115.68.24.88
- $server_name : localhost
- $server_port : 80
- $server_protocol : HTTP/1.1
- $arg_type : module
- $request_uri : /production/module/index.php?type=module&id=12
- $request_filename : /usr/local/nginx/html/production/module/index.php
구성한 nginx.conf 반영하기
만약 nginx.conf를 수정하고 이를 반영하고자 한다면 nginx를 재시작해야 합니다.
service nginx restart : 재시작
참고한 글
architectophile.tistory.com/12
https://extrememanual.net/9976
https://velog.io/@minholee_93/Nginx-Configuration-ntk600tiut
https://whatisthenext.tistory.com/123