[Web] Nginx 설정 파일 정리
업데이트:
1. 당근🥕 Nginx
“항상 곁에 nginx가 있다” 를 표현하고 싶었는데, 표현이 되었나요?
(당신 근처에!! 죄송합니다…😅)
사실 회사에 있으면 웹서버로 로드 밸런서를 직접 구축할 일은 거의(아예) 없습니다.
이미 openshift 기반의 인프라 세팅이 모두 되어 있어서 pod 수 정도 조절하는게 전부죠.
하지만 nginx는 단순히 로드 밸런서 역할로만 사용되는 것이 아니라서 생각보다 많이 사용하는 편입니다.
입사하고 가장 먼저 했던 일이 nginx로 loaclhost에 openssl 적용해서 개발 환경 세팅 하는 일이었습니다.
10년 짜리 인증서랑 nginx.conf 파일 만들어서 wiki로 공유~! 👍
그리고 타 팀에게 API를 뚫어준 서버의 경우 서버 요청 시에 인증은 반드시 필요하지만,
굳이 저희 팀 서버가 불필요한 인증을 할 필요가 없으니 bypass 하는 용도로
nginx에서 헤더에 Authorization 토큰을 심어서 넘겨버리는 방법으로도 nginx를 사용할 수 있습니다.
그런데 설정 파일 건드릴 때 매번 찾아보게 되어서 이번에 정리해두고자 합니다.
2. 설정 파일 이해하기
오늘은 nginx.conf 파일의 http 블록 옵션을 집중해서 정리하겠습니다.
참고로 nginx.conf 파일이 위치시킬 곳은 Mac 칩에 따라서 경로가 다릅니다.
- Intel칩 →
/usr/local/etc/nginx/nginx.conf
- M1칩 →
/opt/homebrew/etc/nginx/nginx.conf
용어를 쉽게 이해할 수 있도록 지금부터 예시 상황 을 가정하려고 합니다.
식품팀서버(food)와 여행팀서버(travel)가 하나의 nginx를 사용하는 상황입니다.
식품팀, 여행팀은 각각을 upstream 이라는 용어로 부르겠습니다.
그러면 nginx는 2개의 upstream 을 처리하는 웹서버가 될 것입니다.
그리고 이 때, 식품팀은 3개의 서버에 대해서 로드 밸런싱 을 해야합니다.
예시를 그림으로 보면 다음과 같습니다.
예시에 대한 nginx.conf 를 작성하면 다음과 같습니다.
nginx.conf
http {
################ 식품팀 API SERVER 설정 ################
upstream food { # food 라는 이름으로 upstream 정의
server 129.12.200.11:8080
server 129.12.200.22:8080
server 129.12.200.33:8080
}
server {
listen 443 ssl;
server_name food.api.com; # nginx ip에 맵핑한 food 서버 도메인명
ssl_certificate_key {인증서 파일 path};
ssl_certificate {비밀키 path};
ssl_protocols TLSv1.2;
location / { # food.api.com/ 으로 요청오면 food upstream이 처리
proxy_pass http://food;
}
access_log {접근 로그 저장할 곳 path}/access.log;
error_log {에러 로그 저장할 곳 path}/error.log;
}
################ 여행팀 API SERVER 설정 ################
upstream travel { # travel 라는 이름으로 upstream 정의
server 130.211.132.47:8080
}
server {
listen 443 ssl;
server_name travel.api.com; # nginx ip에 맵핑한 travel 서버 도메인명
ssl_certificate_key {인증서 파일 path};
ssl_certificate {비밀키 path};
ssl_protocols TLSv1.2;
location / { # travel.api.com/ 으로 요청오면 travel upstream이 처리
proxy_pass http://travel;
}
access_log {접근 로그 저장할 곳 path}/access.log;
error_log {에러 로그 저장할 곳 path}/error.log;
}
}
그리고 헤더에 토큰 set 한다고 했던 방식은 location 블록에서 아래와 같이 해줄 수 있다.
location / {
proxy_set_header Authorization "abcdefg";
proxy_pass http://api.com
}