imhamburger 님의 블로그
엔진엑스(NGINX) - NGINX 로드밸런싱 설정하기 본문
NGINX 설정 파일은 기본적으로 /etc/nginx 디렉터리에 위치한다.
메인 설정 파일:
/etc/nginx/nginx.conf
해당 디렉토리 안에 conf 파일은 NGINX의 메인 설정 파일이며, 이 파일에서 전역 설정과 기본 서버 블록 설정 등을 정의할 수 있다.
개별 서버 설정 파일:
/etc/nginx/conf.d/
이 디렉터리 안에 추가적인 설정 파일을 둘 수 있다. 일반적으로 새로운 사이트나 서비스에 대한 설정 파일은 이곳에 생성한다. 예를 들어, <이름지정>.conf 같은 개별 설정 파일을 여기에 두면 NGINX가 자동으로 로드한다.
나는 개별 서버 설정파일을 만들었다.
nginx가 로드밸런싱하기 위해서는 upstream 블록이 필요하다.
서버 요청을 분산시키지 않을 경우에는 upstream 블록이 필요 없다. upstream은 여러 서버에 요청을 분산(로드 밸런싱)할 때 사용되므로, 단일 서버로만 요청을 전달할 경우에는 proxy_pass에서 직접 서버의 IP 주소나 도메인을 지정하면 된다.
1. NGINX 설정 파일
1-1. upstream 블록 (로드밸런싱없이 할 경우 skip)
upstream <애플리케이션 이름> {
server <프라이빗 IP주소>:<PORT>;
}
upstream <애플리케이션 이름> {
server <프라이빗 IP주소>:<PORT>;
}
- server <프라이빗 IP 주소>:<PORT>;는 요청이 전달될 서버의 IP 주소와 포트를 지정하는 부분이다. 여러 서버를 여기에 추가하면 로드 밸런싱이 적용된다.
1-2. server 블록
server 블록은 NGINX에서 서버 구성을 정의하는 핵심이다. server 블록 안에서 NGINX가 어떤 요청을 어떻게 처리할지를 설정한다.
server {
listen 80;
server_name <입력>;
location /<입력>/ {
proxy_pass http://<입력>/;
}
location /<입력>/ {
proxy_pass http://<입력>/;
}
}
listen 80;
- NGINX가 어떤 포트에서 요청을 받을지 정의
- 80은 HTTP의 기본 포트로 클라이언트가 http://example.com으로 요청을 보내면 80번 포트에서 처리
- 만약 HTTPS를 사용할 경우 listen 443 ssl 로 설정할 수 있다.
server_name
- server_name은 어떤 도메인 이름으로 요청을 받을지 지정하는 부분
- 만약 server_name abc.com 으로 되어있다면, abc.com은 서버가 처리할 도메인이 된다.
- 여러 도메인이나 서브도메인을 사용할 수 있다: server_name abc.com http://www.abc.com;
location /
- location은 어떤 경로로 들어오는 요청을 어떻게 처리할지 정의. /는 루트 경로
- 예를 들어 /app/로 설정하면 http://example.com/app/ ~~~으로 들어오는 요청을 처리
- proxy_pass http://<입력>; <입력> 부분은 요청을 어디로 전달할지 정의하면 된다. 만약, upstream 블록에 애플리케이션이 있다면 해당 애플리케이션 이름으로 똑같이 지정해줘야 한다.
- 실제 서버의 IP나 도메인으로 요청을 전달할 수도 있다. 예를 들어: proxy_pass http://192.168.0.10:8001;
예시를 통해 이해하기
만약 내가 http://abc.com/app/으로 접속하면, NGINX는 이 요청을 받는다.
server 블록에 server_name은 도메인 abc.com과 일치하는지 확인하고, 그다음 location /app/에서 해당 요청을 처리한다.
여기서 설정된 프록시 서버가 proxy_pass http://backend_server/; 일때 (backend_server)로 요청을 전달한다.
nginx 설정파일을 수정하였다면, 아래 명령어를 통해 변경사항을 테스트를 해야한다. 설정 파일에 오류가 있는지 확인할 수 있다.
nginx -t
변경 사항을 nginx에 적용해야 하려면, 다음 명령어를 실행한다.
nginx -s reload
+ 만약 실시간으로 NGINX 접근 로그를 모니터링 하고싶다면, 로그 형식과 로그 파일 경로를 NGINX 설정 파일에서 정의해줘야 한다.
기본적으로 NGINX는 접근 로그와 에러 로그를 기록하지만, 특정한 로그 형식이나 경로를 지정하려면 설정 파일을 수정해야 한다.
2. NGINX 로그 설정하기
NGINX의 로그 설정은 nginx.conf 또는 개별 사이트 설정 파일에 추가할 수 있다.
2-1. 접근 로그 설정 (Access Log)
# 로그 형식 지정 (선택 사항)
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name hamburger.local;
# 접근 로그 파일 경로와 형식 설정
access_log /var/log/nginx/access.log custom;
location / {
proxy_pass http://172.17.0.1:8000;
}
}
로그 출력 예시
2-2. 에러 로그 설정 (Error Log)
에러 로그는 NGINX의 오류를 기록하는 파일이다. error_log 디렉티브를 사용하여 에러 로그의 경로와 로그 레벨을 지정할 수 있다.
# 로그 형식 지정 (선택 사항)
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name hamburger.local;
# 접근 로그 파일 경로와 형식 설정
access_log /var/log/nginx/access.log custom;
# 에러 로그 파일 설정
error_log /var/log/nginx/error.log warn;
location / {
proxy_pass http://172.17.0.1:8000;
}
}
- error_log /var/log/nginx/error.log warn; 에러 로그를 /var/log/nginx/error.log 파일에 기록하며, 로그 레벨을 warn으로 설정
- 로그 레벨은 debug, info, notice, warn, error, crit, alert, emerg 등이 있으며, 심각도에 따라 필터링된다.
2-3. 실시간 로그 모니터링
로그 파일이 설정되었다면, tail -f 명령어를 사용하여 실시간으로 모니터링할 수 있다.
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log #에러로그 모니터링
3. NGINX 캐시 설정하기
3-1. 캐시 저장 위치 및 설정 디렉토리 생성
먼저, NGINX 캐시 파일을 저장할 디렉토리를 생성해야 한다. 이 디렉토리는 캐시된 파일을 저장할 위치이다.
sudo mkdir /etc/nginx/cache
sudo chmod 700 /etc/nginx/cache
3-2. nginx 캐시 기본 설정
NGINX의 설정 파일에서 proxy_cache_path를 정의하여 캐시 파일 저장소를 설정한다.
/etc/nginx/nginx.conf 또는 개별 서버 블록 설정 파일인 /etc/nginx/conf.d/ 에 추가할 수 있다.
http {
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_pass http://<입력>;
}
}
}
- levels=1:2: 캐시 디렉토리의 하위 디렉토리 구조
- keys_zone=my_cache:10m: 캐시 키를 저장할 메모리 영역 (10m은 10MB 크기의 캐시 영역을 의미)
- max_size=1g: 캐시 디렉토리의 최대 크기(1GB)
- inactive=60m: 사용되지 않은 캐시가 삭제되기까지의 시간(60분)
- use_temp_path=off: 임시 디렉토리 사용 여부 설정
- proxy_cache: 특정 요청에 대해 캐시를 활성화하기 위한 설정
- proxy_cache_valid: 상태 코드에 따라 캐시의 유효 기간을 설정. 예를 들어, 200 및 302 응답은 10분 동안 캐시되고, 404 응답은 1분 동안 캐시
- proxy_pass: 실제로 http://<입력>으로 요청을 전달하는 설정
'끄적끄적' 카테고리의 다른 글
데이터엔지니어 부트캠프 - json-server로 간단하게 CRUD 실습해보기 (0) | 2024.10.28 |
---|---|
자바(Java) - 자바기초, 전위형증감, 후위형증감, switch 사용방법 (0) | 2024.10.15 |
Firebase - Deploy 해도 화면이 안나오는 이유 (0) | 2024.08.29 |
카프카(Kafka) - 파티션 자동할당, 수동할당 (0) | 2024.08.23 |
성능 테스트 도구 nGrinder 이해하기 (0) | 2024.08.12 |