Nginx?
- 다중 접속자 처리에 특화된 웹 서버 프로그램
- Apache와 유사한 동작을 하나 소모되는 리소스가 더 적고 더 빠름
- 사전에 지정된 conf 파일에 따라 해당 주소로 요청을 전달하는 전달자 역할을 하므로 리소스 소모가 거의 없다
특징
- 리버스 프록시 기능
- 클라이언트로부터 받은 요청을 프로토콜/포트에 따라 분리해 다른 주소로 재분배. 클라이언트가 요청하는 것은 어디까지나 Nginx로, 뒷단에서 실제 비즈니스 로직이 돌아가는 어플리케이션 서버의 주소를 알 수 없으므로 외부의 공격에서 실제 서버는 안전함
- 로드밸런싱
- upstream 블록으로 특정 서버들을 하나로 묶어 처리할 수 있어 외부에서 들어온 요청에 대해 수동으로 로드밸런싱이 가능. 서로 다른 스펙의 서버에서 동일한 어프리케이션을 서비스해야 할 경우 사용 가능하다.
- 비동기 요청 처리
- 각 요청에 직접 프로세스를 분배하지 않고, 들어오는 각 요청마다 마스터 프로세스가 워커 프로세스를 만들어 워커 프로세스가 작업 핸들러에 요청을 전달하는 식이기 때문에 응답 지연시간이 동기식 프로그래밍보다 더 짧음.
구성
nginx:
- mime_types
nginx.conf
conf.d:
- default.conf
...
nginx.conf
- nginx 초기 설정파일로, nginx 어플리케이션의 전체적인 동작 및 include로 지정할 conf 파일을 설정할 수 있다. 요청을 분배할 프로토콜/서버를 지정하는 것도 이곳이며, 특정 서버에 특정 요청의 conf를 include하도록 할 수 있다.
- 내부에 프로토콜 레벨 및 프로세스, pid같은 low level의 설정들을 세팅하는 것이 일반적. 물론 이 파일 하나에 모든 설정을 다 때려박아 만드는 것도 방법이지만, 설정 파일의 가독성이 떨어지고 유지 및 MicroServiceArchitecture 구현이 불편해지기 때문에 프로토콜 레벨의 디자인은 이 파일에서, 서버 레벨의 디자인은 각 서버에 include할 conf 파일에서 해주는 것이 좋다.
conf.d/default.conf
사실 이 경로는 꼭 정해진 것은 아니고, nginx.conf 파일에서 include하는 디렉토리를 어떻게 바꿔주느냐의 차이다. conf.d라는 이름이 맘에 안들면 i_am_server/ 같은 이름으로 폴더를 만들고 include로 참조할 디렉토리만 바꿔주면 그만.
기본 세팅은 HTTP 프로토콜에 conf.d/default.conf 라는 파일을 include하고 있다.
defualt.conf
server { # 해당 config 파일이 include 되어있는 프로토콜의 해당 포트를 listen (HTTP/80) listen 80; listen [::]:80; server_name localhost; # 접속 로그가 남겨질 위치 및 파일명 #access_log /var/log/nginx/host.access.log main; # location 뒤의 설정된 주소로 접속 시도시 연결될 파일 location / { root /usr/share/nginx/html; # root 권한으로 해당 파일을 open index index.html index.htm; # index.html을 index.htm으로도 취급 # proxy_pass http://localhost:9000 # 해당 url로 리디렉션 } # 오류 발생시 redirect될 페이지 #error_page 404 /404.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; #} }
default.conf example
# 로드밸런싱: url이 선언되는 경우 하기 2개의 서버가 랜덤하게 요청을 나눠가짐.
# 각 서버에 wegiths=INTEGER 옵션을 줄 경우, INTEGER의 숫자에 따라 해당 서버가 더 많은 요청을 받음
upstream backend {
server 172.11.0.11:8080;
server 172.11.0.12:8080;
}
server {
listen 8080;
listen [::]:8080;
server_name localhost;
access_log /logs/access.log;
error_log /logs/error.log;
location / {
proxy_pass http://backend;
}
location /s1 {
proxy_pass http://172.11.0.11:8080;
# 실제 서버에 http://172.11.0.11:8080/s1으로 돌아가고 있는 서버가 있어야함. 아닐경우 404
}
location /s2 {
proxy_pass http://172.11.0.12:8080;
}
}
예제 파일
https://github.com/Jangab-water/nginx-training.git
'Infra' 카테고리의 다른 글
Hadoop 구축하기 (0) | 2021.11.06 |
---|---|
[Kafka] Kafka 3.0.0 출시 및 Kraft의 근황 (0) | 2021.09.27 |
Hadoop - Spark 연동 - 3. Spark 설치 (0) | 2021.04.23 |
Hadoop - Spark 연동 - 2. Hadoop 설치 (0) | 2021.04.23 |
Hadoop - Spark 연동 - 1. 우분투 설정 (0) | 2021.04.21 |