Technology/Nginx
[Nginx] - Nginx란 정의, 사용법, 설정, 명령어 알아보기
nam_ji
2024. 12. 12. 17:03
Nginx 정의 사용법, 설정, SSL, Load Balancing, 명령어, 에러 알아보기
Nginx 정의
- Nginx는 경량 웹 서버입니다.
- 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 합니다.
Nginx 흐름
- Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 요청들을 Concurrency(동시성)하게 처리할 수 있습니다.
- 위 그림에서 보듯이 Nginx는 새로운 요청이 들어오더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에 프로세스와 쓰레드 생성 비용이 존재하지 않고, 적은 자원으로도 효율적인 운용이 가능합니다.
- 이러한 Nginx의 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있습니다.
- Event-Driven
- apache의 C10K 문제점 해결(한 시스템에 동시 접속자 수가 1만명이 넘어갈 때 효율적 방안)을 위해 만들어진 Event-Driven 구조의 웹 서버 소프트웨어라고 합니다.
- OSI7 Layer 중 application Level 아래의 level에서 Nginx 같은 웹 서버가 HTTP 통신을 담당합니다.
- Event-Driven
Nginx 구조
- Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행됩니다. Master Process는 설정 파일을 읽고, 유효성 검사 및 Worker Process를 관리합니다.
- 모든 요청은 Worker Process에서 처리합니다.
- Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용합니다.
- Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정됩니다.
Nginx SSL 설정
1. nginx.conf 설정
#nginx.conf
server {
listen 8443 ssl http2;
server_name XXXXX.XXXXX.co.kr;
include /sw/nginx/nginx/conf/ssl.conf;
location / {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://XXXXX;
.
.
error_page 404 /index.html;
error_page 500 502 503 504 /50x.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root /sw/nginx/app/xxx/static/error/;
}
}
2. ssl.conf
#ssl_conf
ssl_certificate /sw/nginx/ssl/XXXX_crt.pem;
ssl_certificate_key /sw/nginx/ssl/XXXX_key.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:1m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESXXXXXXXXXXXXXXXXX:XXXXX:XXXX:XXX;
ssl_prefer_server_ciphers on;
3. nginx reload
# systemctl restart nginx
# nginx -s reload
Nginx Loal Balancing
1. 프록시 설정
- 한 웹 서버 안에는 여러 서버가 있을 수 있습니다.
- 그 각각의 서버들도 자기의 서버가 있고 웹 서버 안에 있는 이상 메인 도메인(퍼블릭 ip) 안에서 프라이빗 ip를 가지고 있는 것입니다.
- 프록시 설정을 하면 퍼블릭 ip를 거친 요청만이 프라이빗 ip로의 요청 마무리를 통해 요청을 통한 원하는 응답을 가질 수 있습니다.
- 클라이언트가 서버의 자원을 컨트롤하지 못하게 하려면 퍼블릭 ip, 웹 서버 안에서의 프라이빗 ip를 모두 알면 안됩니다.
- 클라이언트는 퍼블릭 ip만 알고 있는 상황에서 요청을 하고, 이 퍼블릭 ip를 거치는 과정에서 여러 보안적 이슈를 해결할 수 있습니다.
- 그 다음에 프록시의 역할
즉, 요청하는 프라이빗 ip로의 연결을 대리(proxy)하는 것이 바로 프록시 서버의 역할입니다. - 여기서의 보안적 장점, 그리고 안전한 요청만을 받아 웹 서버 안에서 자동으로 요청하는 서버 ip로 연결해준다는 것에서 프록시 설정이 중요해지는 것입니다.
2. 로드밸런싱
- 로드밸런싱도 프록시와 원리는 비슷합니다.
- 웹 서버의 퍼블릭 ip(DNS)로의 요청을 받아 웹 서버 안에서 원하는 서버에 그 요청을 전달하는 것입니다.
- 여기서 요청들을 웹 서버 안에서 서로 다른 여러 서버에 나눈다는 것은 아니고 한 웹 서버에 같은 서버를 여러 개 배치(쌍둥이)하고 수 많은 클라이언트의 같은 자원 요청을 했을 때, 한 서버에 그 요청을 링크하는 것이 아니고 여러 개의 같은 서버(쌍둥이)에 그 요청들을 나누는 것입니다.
- 어차피 그 서버들은 쌍둥이
즉, 같은 내용이기 때문에 응답 또한 당연히 같습니다. - 반복되는 요청을 여러 같은 서버들이 나누어 전담함으로써 과부하로 인한 서버에러를 피할 수 있는 것입니다.
Nginx 명령어
1. 상용 기본 명령어 및 설정
명령어 | 설명 |
nginx | 기동 |
nginx -s stop | 정지 |
nginx -s reload | 재기동 |
nginx -t | 설정 파일 체크 |
/etc/nginx | main 설정 파일 위치 |
/etc/nginx/conf.d/ | 각 서버용 설정 파일 위치 |
2. Nginx 명령의 옵션
명령어 | 설명 |
-?, -h | nginx 명령어의 도움말 표시 |
-v | nginx version |
-V | nginx를 make 했을 시, 컴파일러 또는 configure 옵션 표시 |
-t, -q | nginx 설정 파일 오류 체크 (오류 체크 시, nginx 정지 상태에서 실행, 정상 메세지 출력) |
-s stop | 강제 종료 |
-s quit | 실행 중 requestㅊ 처리 종료하고 nginx 정리 |
-s reload | 설정 파일 다시 읽기 |
-s reopen | nginx 재기동 중 로그 파일을 다시 오픈 |
-c 설정파일 | 지정한 설정 파일로 nginx 기동 |
-g global 디렉티스 설정 | 지정한 global 디렉티브의 설정으로 nginx를 기동 (부하 실험 등) |
-p prefix | default=/usr/local/nginx |
Nginx 504 Gateway Time-out
- nginx를 사용하다 보면 504 Gateway Time-out Error가 발생할 때가 있습니다.
- 그 이유는 서버와 클라이언트간 proxy 연결 시간이 default인 60초를 넘어서 나타나는 것입니다.
- 이를 해결하기 위한 방법은 server에서 설정을 바꿔주면 됩니다.
- 60초 -> 300초
-
#nginx.conf server { listen 8443 ssl http2; server_name XXXXXXXX.com; location / { proxy_pass http://server-proxy; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; send_timeout 300; } }
-
Nginx 413 Request Entity Too Large 에러
- nginx의 파일 업로드 크기를 정해야 합니다.
- 설정되지 않은 경우 1MB가 넘는 경우 에러가 발생할 수 있습니다.
- nginx의 허용 사이즈를 설정하는 방법은
-
$ vi /sw/nginx/nginx.conf
-
- 설정된 부분으로 이동한 후 http {내용} 부분에 해당 속성과 값을 추가하거나 변경하도록 합니다.
- 이때 client_max_body_size 속성과 값을 설정해야 합니다.
-
#nginx.conf http { # Set client upload size - 100Mbyte client_max_body_size 100M; ... .. . }
-
- 이제 업르드 크기가 설정되었습니다. nginx를 재시작합니다.
-
nginx -s reload
-
- 또는 server를 재시작할 수도 있습니다.
-
service nginx restart
-