업무를 하면서 처음으로 Nginx를 다뤄볼 예정이다. 공부해가도 뚝딱이겠지만 덜 찐따처럼 보이기위해 가볍게 훑어보고 갈 예정 😎
(작년 이쯤 깃허브 블로그에 올렸던거 재탕임)
Nginx란 Nginx는 웹 서버 소프트웨어로 가벼움과 높은 성능을 목표로 한다. 비동기 이벤트 기반 구조의 경량화 웹 서버로 정적 파일을 제공하는 웹 서버로 활용되기도 하고 리버스 프록시 서버로 활용하여 WAS의 부하를 줄여주는 로드밸런서 역할을 하기도 한다.
Nginx가 만들어진 배경 참고 👉🏻 https://dkswnkk.tistory.com/513
나는 기존에 있던 서비스 위에 Nginx를 리버스 프록시로 활용할 예정이다. 이로 인해 얻을 수 있는 이점은 아래와 같다.
리버스 프록시 👉🏻 프록시 서버(Proxy Server)와 DMZ 서버 https://ijo0r98.github.io/posts/proxyNdmz/
brew가 설치되어있다는 가정하에
brew intstall nginx
설치가 성공적으로 끝나면 설치 위치를 확인할 수 있다.
Docroot is: /opt/homebrew/var/www
The default port has been set in /opt/homebrew/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /opt/homebrew/etc/nginx/servers/.
brew 이용한 Nginx 서비스 기동
brew services start nginx # 시작
brew services restart nginx # 재시작
brew services stop nginx # 종료
기본 포트는 8080
http://localhost:8080
기본 웹 루트 디렉토리는 /usr/share/nginx/html
내 스프링 부트 프로젝트의 기본 포트는 9090
http://localhost:9090
이제 이 둘을 연결해주려한다.
Nginx 설정 파일은 아까 설치 결과로 나왔던 곳 /opt/homebrew/etc/nginx 에 위치
vim nginx.conf
기존 설정 파일 살짝 보면
server {
listen 8080; # 사용중인 포트
server_name localhost; # 서비스할 도메인 설정 가능
#charset koi8-r;
#access_log logs/host.access.log main; # 로그 남기고 싶으면 주석 해제
location / { # / 뒤에 경로 지정 가능
root html;
index index.html index.htm;
}
...
참고로! 로그 파일에 날짜를 붙이려고 다음날 확인해보니 접속 로그 파일(host.access.log) 및 에러 로그 파일(error.log) 는 알아서 전날 로그 파일 뒤에 날짜가 붙어 히스토리가 남음.
오늘의 로그 파일은 뒤에 날짜 안붙음. 따라서 굳이 날짜 뒤에 안붙여도 일자별 관리가 가능하다.
이제 location 블럭 하단에 proxy_pass 정보를 추가하면 리버스 프록시의 역할을 할 수 있다.
server {
listen 8080; # 사용중인 포트
server_name localhost; # 서비스할 도메인 설정 가능
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://localhost:9090;
}
...
Nginx에 {server_name}:{listen} 으로 오는 요청을 proxy_pass http://localhost:9090 으로 연결시켜준다.
listen 지시문에 의해 포트 번호 8080으로 들어오는 요청들에 대해 server_name과 정확하게 일치하는 서버 블록을 찾으려고 시도한다.
설정 후 Nginx(8080)로 접속해보면
이렇게 기존의 Nginx 기본 페이지가 아닌 내가 스프링 프로젝트에서 설정한 웹 페이지로 연결되는 것을 확인할 수 있다!
그 외 Nginx에서 권장하는 다양한 리버스 프록시 헤더 구성 옵션들이 있다.
proxy_pass http://localhost:9090;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
내가 마주친 오류는 아니지만 블로그 읽던 중 알아두면 좋을것 같아 추가한다.
nginx 에서 proxy_set_header 재정의할 때 주의할 점 https://ohgyun.com/537
주요 내용은 프록시 서버로 전달하는 설정 재정의 시 상위 레벨에서 상속받던 값은 무시된다는 것이다. 즉 같은 location 블럭 안에 설정을 지정해야 한다는 것이다.
Nginx가 재정의하는 헤더는 Header와 Connection 두개이며 그 외의 헤더들도 모두 프록시 서버로 전달되는데, 헤더의 값이 비어있다면 그 헤더들은 전달되지 않는다. 만약 헤더의 값을 변경하려면 proxy_set_header 키워드를 사용하면 된다.
제거하고 싶은 속성이 있다면 아래처럼 빈값으로 설정하면 해당 헤더값이 전달되지 않는다.
proxy_set_header var “”;
proxy_set_header는 어디서든 사용 가능하지만 proxy_pass가 지정되는 지점에 값이 재정의된다. 이때 위에서 정의한 proxy_set_header들은 모두 무시된다.
블로그에서 제시된 문제 코드는 다음과 같다.
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
location /~ {
# 새 헤더 재정의 및 추가로 위의 proxy_set_header는 모두 무시된다.
proxy_set_header var var;
proxy_pass http://localhost:9090;
}
위의 설정들이 제대로 적용되기 위해서는 같은 location 블럭 안에 proxy_pass와 함께 헤더값이 지정되어야한다.
location /~ {
# 지정한 proxy_set_header는 모두 적용된다.
proxy_pass http://localhost:9090;
proxy_set_header var var;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Nginx란 무엇인가? https://dkswnkk.tistory.com/513
[mac] Nginx Tomcat 연동 - nginx 스프링 내장 톰캣 리다이렉트 방법 (Proxy Server) https://thalals.tistory.com/342
SW/리눅스 Linux : Nginx Reverse Proxy 설정 방법, 예제, 명령어 https://jjeongil.tistory.com/1490
Nginx & Spring Boot 구성하기(3) SSL 설정과 Socket (0) | 2024.06.30 |
---|---|
Nginx & Spring Boot 구성하기(2) Linux 버전 (0) | 2024.06.30 |
MAC CORS 무시하고 크롬 실행하기 (0) | 2023.10.14 |
다중 서버 환경에서의 세션 관리 (2) | 2023.10.14 |
[SERVLET, JSP] 다양한 이벤트 리스너(Listener) (0) | 2022.12.27 |
댓글 영역