nginx 리버스 프록시

김효준·2023년 12월 18일
0

리버스 프록시를 해보자
일단 도메인을 삿다.
hyojunkim.site


dnszi사이트에서 레코드 관리를 해준다.

  • hyojunkim.site
  • a.site1.hyojunkim.site
  • b.site1.hyojunkim.site
updatedb # 초고속 검색을 위한 준비
locate nginx.conf # nginx.conf 파일을 찾기
vim /etc/nginx/nginx.conf # 어떤 내용이 있는지 궁금해서 열어보기
# include /etc/nginx/conf.d/*.conf; 발견, /etc/nginx/conf.d/vhost.conf 라는 파일을 만들면 그 내용은 설정에 자연스럽게 녹아든다는 것을 알아냄

vim /etc/nginx/conf.d/vhost.conf

# vhost.conf 내용 시작
server {
    listen 80;
    server_name a.site1.hyojunkim.site;

    root /home/www/a;
}

server {
    listen 80;
    server_name b.site1.hyojunkim.site;

    root /home/www/b;
}
# vhost.conf 내용 끝

systemctl restart nginx # 설정 반영
systemctl reload nginx # 사실 재시작까지는 필요없고, reload 만 해도 설정이 반영됨

# 크롬에서 a.site1.hyojunkim.site (으)로 접속 => 404
mkdir -p /home/www/a
echo '<h1>Site A</h1>' > /home/www/a/index.html
# 크롬에서 a.site1.oa.gg (으)로 접속 => Site A 라고 잘 나옴

# 크롬에서 b
.site1.hyojunkim.site (으)로 접속 => 404
mkdir -p /home/www/b
echo '<h1>Site B</h1>' > /home/www/b/index.html
# 크롬에서 b.site1.oa.gg (으)로 접속 => Site B 라고 잘 나옴


잘된다

vim /etc/nginx/conf.d/vhost.conf

# vhost.conf 내용 시작
...

server {
    listen 80;
    server_name c.site1.hyojunkim.site/;

    location / {
        proxy_pass http://127.0.0.1:8021;
    }
}
# vhost.conf 내용 끝

systemctl reload nginx # 사실 재시작까지는 필요없고, reload 만 해도 설정이 반영됨

# 크롬에서 c.site1.oa.gg (으)로 접속 => 404
docker run -d -p 8021:80 nginx
# 크롬에서 c.site1.hyojunkim.site/ (으)로 접속 => 도커 컨테이너 안에서 80 포트로 돌아가고 있는 nginx가 응답한 결과가 화면에 나온다.
#하나의 포트를 여러 프로세스가 사용할수없다.

위의 내용은 리버스 프록싱을 하는 nginx가 도커 내부에 있지 않다.

리버스 프록싱을 하는 nginx를 도커 안쪽에 위치시키자

# 기존 도커 컨테이너 전부 제거
docker rm -f $(docker ps -qa)
docker rmi -f $(docker images -qa)
docker network prune -f
docker volume prune -f

# 도커 호스트에 직접 설치한 nginx 도 제거
systemctl stop nginx
yum remove nginx -y

# 도커 컨테이너 3개 띄우기
docker run -d -p 80:80 --name nginx_1 nginx # 이 녀석은 서비스가 아니라 프록시 용으로 띄웠음
docker run -d -p 8021:80 --name svc_1 nginx # 서비스 1
docker run -d -p 8022:80 --name svc_2 nginx # 서비스 2

# 각 컨테이너는 도커 라는 가상 세계에서 저마다의 IP가 있다.
# 참고로 도커 호스트의 IP는 항상 172.17.0.1 이다.
docker inspect nginx_1 | fgrep IPAddress # 도커 네트워크에서 nginx_1 의 IP : 172.17.0.2
docker inspect svc_1 | fgrep IPAddress # 도커 네트워크에서 nginx_1 의 IP : 172.17.0.3
docker inspect svc_2 | fgrep IPAddress # 도커 네트워크에서 nginx_1 의 IP : 172.17.0.4

# 도커 호스트의 ip는 127.17.0.1이다!
# nginx_1이 svc_1의 ip를 알아도 다이렉트로 통신하면안된다
ping 172.17.0.3:80
ping 172.17.0.1:8021 #권장


# 서비스 1의 index.html 내용을 변경
# sh -c "" 는 보통 복잡한 명령을 감쌀 때 사용한다.
docker exec -it svc_1 sh -c "echo '<h1>A</h1>' > /usr/share/nginx/html/index.html"
docker exec -it svc_1 cat /usr/share/nginx/html/index.html

# 서비스 2의 index.html 내용을 변경
docker exec -it svc_2 sh -c "echo '<h1>B</h1>' > /usr/share/nginx/html/index.html"
docker exec -it svc_2 cat /usr/share/nginx/html/index.html

# nginx_1 로 접속
docker exec -it nginx_1 bash
cat /etc/issue # 리눅스 배포한 확인, 데비안이면 yum 이 아니라 apt-get 을 사용한다.
apt-get update # apt-get 을 상요하기 위한 준비
apt-get install mlocate vim -y # mlocate 와 vim 을 설치
updatedb # mlocate 인덱스 갱신
locate nginx.conf # /etc/nginx/nginx.conf 에 있다는 것을 확인

vim /etc/nginx/nginx.conf # /etc/nginx/conf.d/proxy.conf 파일을 만들고 거기에 설정내용을 적으면 자동으로 nginx.conf 에 반영이 된다는 사실을 파악

vim /etc/nginx/conf.d/proxy.conf # 파일이름은 중요하지 않지만 '.conf' 로 끝나야 함

# proxy.conf 내용 시작
server {
    listen 80;
    server_name a.site1.oa.gg; # 서비스 1의 도메인

    location / {
        proxy_pass http://172.17.0.3:80; # 서비스 1의 IP, 사실 이렇게 IP를 통해서 바로 참조하는 것은 좋지 않다. 왜냐하면 IP는 언제라도 바뀔 수 있기 때문에
    }
}

server {
    listen 80;
    server_name b.site1.oa.gg; # 서비스 2의 도메인

    location / {
        proxy_pass http://172.17.0.4:80; # 서비스 2의 IP, 사실 이렇게 IP를 통해서 바로 참조하는 것은 좋지 않다. 왜냐하면 IP는 언제라도 바뀔 수 있기 때문에
    }
}
# proxy.conf 내용 끝

nginx -s reload # 설정 반영

exit # nginx_1 도커 컨테이너에서 빠져나감

# 크롬에서 a.site1.oa.gg (으)로 접속 => A
# 크롬에서 b.site1.oa.gg (으)로 접속 => B

proxy_pass를 상대경로로 두어서 서버가 내려갔다가 올라갈때 혹시 바뀔가능성이 있다.

그래서 바뀌지않는 도커호스트의 ip(172.17.0.1)로 도커컨테이너 런하면서 포트포워딩했던 포트로 넘겨준다.

# nginx_1 로 접속
docker exec -it nginx_1 bash

vim /etc/nginx/conf.d/proxy.conf

# proxy.conf 내용 시작
server {
    listen 80;
    server_name a.site1.oa.gg; # 서비스 1의 도메인

    location / {
        proxy_pass http://172.17.0.1:8021; # 이게 비효율적으로 돌아서 가는것 같지만, 변할일이 없는 포트번호에 의존하기 때문에 오히려 더 좋다.
    }
}

server {
    listen 80;
    server_name b.site1.oa.gg; # 서비스 2의 도메인

    location / {
        proxy_pass http://172.17.0.1:8022; # 이게 비효율적으로 돌아서 가는것 같지만, 변할일이 없는 포트번호에 의존하기 때문에 오히려 더 좋다.
    }
}
# proxy.conf 내용 끝

nginx -s reload # 설정 반영

exit # nginx_1 도커 컨테이너에서 빠져나감

# 크롬에서 a.site1.oa.gg (으)로 접속 => A
# 크롬에서 b.site1.oa.gg (으)로 접속 => B

0개의 댓글

관련 채용 정보