반응형
아무 생각없이 써오던 nginx...
그냥 리버스프록시용으로 쓴다 정도로만 생각하고 쓰던 설정 그대로 복사&붙여넣기만 하던 나날들,,
한 번쯤은 정리해둬야지 싶어서 정리
Features
- High performance HTTP web server
- Mail proxy server
- TCP/UDP proxy server
- Supports 3rd party modules
Reverse Proxy
- 클라이언트 - 서버 사이의 미드포인트에서 리버스 프록시를 통해 리퀘스트를 서버로 전달함 이때, 서버는 여러 대일 수 있고, 리버스 프록시 서버가 접속할(리퀘스트를 전달할) 서버의 정보를 가지고 있다가 정해진 로직에 따라 해당하는 서버로 요청을 전달
- 클라이언트는 리버스 프록시 서버의 정보만 알게 되어 서버 정보를 은닉할 수 있고, 클라이언트 입장에서도 실제로는 다수의 서버가 존재할 수 있으나 접속 경로는 한 곳으로 통일되는 효과가 있어 편리
Reverse proxy with nginx
- 아래와 같이 설정
-
upstream jenkins { # 서비스이름 설정 (tomcat emd) server 127.0.0.1:8080; # 서버:포트 (이경우는 로컬) ... # 서버 여러대면 upstream에서 서버목록 적고 로드밸런싱 가능 keepalive 10; # nginx에서 캐싱할 연결의 수. 이걸 넘어서면 오래된 커넥션부터 끊음 } # upstream 선언은 필수는 아님 한대면 걍 밑에 proxy pass에 하드코딩 가능 server { listen 80; # 80 리퀘스트가 들어오는 경우 ... charset utf-8; rewrite_log off; access_log /var/log/nginx/jenkins/access.log; # 서비스에 맞게 알아서 설정 error_log /var/log/nginx/jenkins/error.log notice; client_body_buffer_size 128K; client_header_buffer_size 16k; client_max_body_size 10m; location / { # location / -> / 이하(모든 접속)에 대해 적용 proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://jenkins; # proxy_pass에서 정의된 곳으로 80포트로 들어온 리퀘스트 전달 proxy_http_version 1.1; # nginx 기본 설정은 1.0이라(웩) 명시적으로 선언해줘야함 둘 차이는 밑에서 proxy_set_header Connection ""; # Connection header 초기화(빈값) } }
설정 반영하고 nginx 재기동하기 전에 꼭!!!!!꼭!!!!!!! nginx -t 로 신택스 등 설정 오류 점검하는 시간 갖기
http 1.0 vs. http 1.1?
- nginx의 성능 개선을 위해서는 connection header 날리기와 http 1.1 명시적 선언 두 가지가 필요함
- 저 두개 중 성능 개선에 기여하는 건 커넥션을 맺고끊고 하는 데 들어가는 비용 차이
- HTTP 1.0: 각 요청마다 새로운 커넥션 오픈하고, 리스판스 전송하면 연결 즉시 종료됨
- HTTP 1.1: 연결이 지속됨(keepalive 설정도 있는 persistent & pipelined connection) 그래서 하나의 연결에서 복수개의 콘텐츠 전송이 발생하게 됨, 압축 및 복원 제공
- http 1.0에서 연결이 바로 끊기는 것 비교해보기
telnet 127.0.0.1 80 으로 nginx 에 접근해서 연결되면 GET / HTTP/1.0 Host: 127.0.0.1 하면 막 리턴받고 그다음에 connection closed by foreign host 이런식으로 연결 끊김 (nginx 에서 응답 1.1로 하더라도 요청 request header가 1.0으로 되어있으므로 1.0식으로 하게되는것) 1.1로 실험 telnet 127.0.0.1 80 GET / HTTP/1.1 Host: 127.0.0.1 하면 응답 오고 커넥션 그대로 살아있음 >> 커넥션 맺고끊고 하는 비용이 줄어들어서 성능이 좋아지게 됨
load-balancing with nginx
- 별 다른 것 없이 설정에서 upstream에 아래와 같이 설정 추가
upstream tomcat {
hash $remote_addr consistent;
# 세션을 유지하게하는거 8080으로 세션 맺고 로그인했으면 새로고침해도 8080으로..다른서버로XXXX
# 이렇게 잡아주지 않으면 어떨때는 8080으로 가고 어떨땐 8090으로 가서 로그인창이 떴다가 안떴다가 함
# 서버들 목록 지정
server 127.0.0.1:8080 weight=5; # weight 부여
server 127.0.0.1:8090;
server 127.0.0.1:8100 backup; # 일반서버 싹다 문제생기면 백업으로 감
keepalive 10; # 동시에 살려둘 연결의 수 이거는 늘리고싶으면 성능테스트 해봐가면서..
}
..
요러고 밑에 proxy_pass http://tomcat; 이런식으로 꺾어주면 됨
nginx static content 배포하기(정적컨텐츠 배포)
location /static { # static 아래로 들어오는건 이렇게 받겠다 하는거
alias /home/systemv/www; # 정적 파일의 위치
autoindex off; # 오토인덱스 index of ~~~ 페이지띄우는거 보안때문에 특수한상황 아니면 꺼둬야함
access_log off; # 굳이 필요없음
}
이렇게하고 자바 웹앱에서
jsp든..서블릿이든 뭐든 거기다 <img src="/static/콩이사진.jpg" /> 이런식으로 /static 언더로 기재하면 끌어다 씀
반응형
'DevOps' 카테고리의 다른 글
이중화(혹은 다중화) 환경에서의 로드밸런싱: 왜 새로고침할 때마다 로그인을 하지 않아도 될까? (2) | 2021.06.05 |
---|---|
[이럴땐이렇게] Jenkins 스케쥴(Crontab) 간격 설정 unexpected token / 발생할 때 (Build periodically error, cron trigger error) (1) | 2021.05.25 |
[이럴땐이렇게] 리눅스 서버 disk full인데 지울거 없을때 임시조치 / linux disk full (0) | 2021.05.15 |
CI/CD 로그 시각화를 위한 ELK stack with Jenkins (1) (0) | 2021.05.14 |
Load Balancing : L2, L3, L4, L7의 차이 (0) | 2021.05.09 |