Prosxy Server란?
클라이언트가 자신을 통해, 다른 네트워크 서비스에 접속하게 해줄 수 있는 서버
Forward Proxy
- 클라이언트가 외부 인터넷에 직접 접근하지 않고, proxy server에 외부인터넷 접근 요청
- proxy server가 외부 인터넷에 대신 접속하여 결과를 받아 클라이언트에 전달하는 서버
Reverse Proxy
- 클라이언트가 reverse proxy에 요청시, 요청에 따라 적절한 내부 서버에 접속하여 결과를 받아 클라이언트에 전달
- 내부에 직접 접속을 허용하지 않으므로 보안적 이점, 요청 트랙피이 많은 결우 로드 밸런싱에도 유리하다
nginx reverse proxy 포트로 구분하기
nginx reverse proxy 서버에 포트를 두 개 오픈한 뒤, 각포트 접속시 각 내부 서버에서 결과를 응답
2개의 내부서버는 각각 nginx와 apache서버로 구성
docker-compose.yml
version: "3"
services:
ngingxproxy:
image: nginx:1.18.0
prots:
- "8080:8080"
- "8081:8081"
restart: always
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
nginx:
depends_on:
- ngingxproxy
image: nginx:1.18.0
restart: always
apache
depends_on:
- ngingxproxy
image: httpd:2.4.46
restart: always
nginx/nginx.conf
- 기본 nginx.conf 설정에 upstream 설정과 server 설정 추가
- deault.conf 설정과 겹치지 않도록 include /etc/nginx/conf.d/*.conf 항목은 삭제
user nginx;
worker_processes auto;
# 에러로그가 생겼을 때 저장 위치
error_log /var/lig/nginx/error.log warn;
pid /var/run/nginx/pid;
events {
worker_connections 1024;
}
htttp {
include /etc/nginx/mime.types;
default_type application/octer-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 접속할때마다 해당위치에 로그 저장
access_log /var/log/nginx/access.log main;
sendfile n;
keepalive_timeout 65;
# docker-nginx라는 이름으로 (사용자가 원하는 이름으로 설정가능)
upstream docker-nginx {
# nginx라는 컨테이너 80번 포트로 접속
server nginx:80;
}
upstream docker-apache {
# apache라는 컨테이너 80번 포트로 접속
server apache:80;
}
server {
# 8080으로 들어온 요청은
listen 8080;
location / {
# docker-nginx로 보내라
proxy_pass http://docker-nginx;
proxy_redirect off;
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-Host $server_name;
}
}
server {
listen 8081;
location / {
proxy_pass http://docker-apache;
proxy_redirect off;
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-Host $server_name;
}
}
}
- docker-compose up -d 로 실행하면 개인서버:8080 과 개인서버:8081로 포트 번호로 구분해서 접속시, 각기 내부 웹서버의 기본페이지가 표시된다
nginx proxy HTTP 설정
- 사용자의 요청이 reversed proxy를 내부 서버에는 reverse proxy 서버가 요청을 보냈다고 인식
- 그로인해 클라이언트 요청시 정보가 들어있는 헤더가 누락되므로 이상동작 발생할 수 있음
- 이를 위해 헤더의 정보를 설정, 해당 설정은 이대로 쓰면 된다.
proxy_redirect off;
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-Host $server_name;
nginx reverse proxy 경로로 구분하기
docker-compose.yml
version: "3"
services:
ngingxproxy:
image: nginx:1.18.0
prots:
# 포트로 구분안하기 때문에 80포트만 열어준다
- "80:80"
restart: always
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
nginx:
depends_on:
- ngingxproxy
image: nginx:1.18.0
restart: always
apache
depends_on:
- ngingxproxy
image: httpd:2.4.46
restart: always
nginx/nginx.conf
- sever 부분 수정, 하나의 server에서 location으로 분리
- 이때, 주소는 /blog/부터 경로가 내부 nginx서버에 전송 -> 내부 nginx 서버에 해당 경로에 지칭하는 파일이 있어야한다
- 내부 nginx.conf파일을 보며 루트 디렉토리를 찾아 정해진 위치에 blog폴더를 만들어 index.html 추가해준다
server {
# 80으로 들어온 요청은
listen 80;
location /blog/ {
# docker-nginx로 보내라
proxy_pass http://docker-nginx;
proxy_redirect off;
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-Host $server_name;
}
location /community/ {
proxy_pass http://docker-apache;
proxy_redirect off;
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-Host $server_name;
}
}
tip) shift + v 를 누르면 여러줄 선택, d를 누르면 삭제, y누르면 복사, p를 누르면 붙여넣기
경로로 구분시 내부 서버에 요청하는 경로 변경하기
예를 들어 '서버주소/blog/index.html'로 proxy 서버에 요청했을 때,
내부 nginx에 요청을 할때는 "서버주소/index.html"로 요청한 것처럼 경로 변경하기
rewirte 옵션추가
rewrite regex URL [flag];
- regex : 기존 URL패턴 -> 정규표현식 형태
- URL: 변경할 URL
- flag : 여러개의 location이 설정되어 있을 때, 변경된 URL이 다시 다른 loaction에 매칭되는 상황에서는 어떻게 할지 설정
- break를 쓰면 변경된 URL이 다시 다른 location설정에 따르지 않고 현재 location 설정만 따르고 종료
'Deploy' 카테고리의 다른 글
[Docker] EC2에 Docker를 이용한 SpringBoot서버 배포 (1) | 2023.12.17 |
---|---|
[Nginx] Nginx 기본 웹서버 (0) | 2023.12.02 |
[Docker] Docker Compose 사용법과 주요 명령 (1) | 2023.11.29 |