Nginx는 경량 웹 서버로, 가벼움과 높은 성능을 목표로 하는 웹서버이다.
주로 정적 웹페이지를 리턴하는 용도나 Reverse Proxy를 통해 로드밸런서로 사용한다.
특징으로는 Event-Driven 구조로 되어있어, Apache 웹서버에 비해 더 작은용량으로 운영이 가능하다.
※ Apache 웹서버는 1개의 클라이언트 요청 = 1개의 쓰레드로, 동기화방식.
Event-Driven 에서는, 요청을 Event Handler를 통해 이벤트를 발생시키고
비동기로 처리하여 다량의 요청을, 효율적으로 처리할 수 있다.
Reverse Proxy를 사용해서 아래 그림처럼 아키텍처를 구성해보려한다.
1) 기존 80포트로 열려있던 python api 서버를 82포트로 변경
2) Nginx 설치 및 Reverse Proxy 설정
apt-get update
apt-get install nginx
/etc/nginx/conf.d/default.conf
server {
listen 80; // 80포트로 리슨하고
location /api/ { //api 리퀘스트 요청이 온다면
proxy_pass http://localhost:82; // 파이썬 rest_api 서버로 포워딩
}
}
3) Nginx reload 및 Python 가동 후 연결
nginx -s reload
python3 rest_api.py
=> Nginx 에서 해당 리퀘스트 처리 페이지를 찾지 못하였다.
=> 프로세스가 안떠있는가? ( X )
=> 컨테이너 포트오픈이 안되어있는가? ( X )
가정1) rest_api 컨테이너 포트오픈이 안되었다?
Nginx 까지는 도달하였으나, rest_api 컨테이너는 오픈이 안되어있어 도달하지 못했다.
=> 같은 컨테이너에 Nginx 와 Python을 띄운거라 네트워크 이슈는 아닌 것으로 예상
가정2) rest_api 포트 ( 82 ) 에 대해, 컨테이너 포드 포워딩이 안되어있다.
현재 Nginx 포트 ( 80 )은 -p 80:80 설정으로,
Localhost:80으로 오는 리퀘스트를 컨테이너 80포트로 자동 매핑해주고있다.
하지만 Rest_api 포트 ( 82 )에 대해서는 매핑되는게 없어
Nginx에서 Localhost:82로 포워딩 하면, 컨테이너의 IP:82와 연결이 되지 않아 발생하지 않을까?
현재 컨테이너 커밋후, 포트매핑 추가하여 가동해보자.
sudo docker run -it -p 80:80 -p 82:82 sk007001/rest_api:python /bin/bash
=> 똑같이 404 에러가 발생한다.
하지만 이번에는, localhost:82 포트로는 바로 rest_api 호출이 가능하다
가정3) Reverse Proxy가 제대로 동작하지 않는다.
프론트인 Nginx도 문제없고, 백단에 Python도 제대로 리슨중이니
중간을 연결해주는 Reverse Proxy가 문제있지 않을까?
일단 스택오버플로우에서, /etc/nginx/site-enabled 의 default 링크를 지워보라는 답변을 발견했다.
=> 지우고 접속해보니, 80 포트로 접속한 리퀘스트가 82로 포워딩 되는것을 확인했다.
==> 그렇다면, 파이썬에서 받았는데 404 에러가 발생하는 이유는???
가정4) Python Rest_api 코드의 문제
먼저 발견한 특이점은, Nginx에 localhost:80/api/users 로 보내어도
Reverse Proxy를 타면 localhost:82/api/users/ 로 리퀘스트가 보내진다는 것이었다.
파이썬 코드를 열어보니 /api/users 로 클래스 매핑이 되어있었고, 이를 수정해준뒤 제대로 리턴해주는것을 확인하였다.
'IT > 도커도커' 카테고리의 다른 글
(6-3) 도커 內 Rest Api 서버 구성하기 ( DB 연결 ) (0) | 2021.09.02 |
---|---|
(6-1) 도커 內 Rest Api 서버 구성하기 ( Python ) (0) | 2021.08.11 |
(5) 도커 Hello World - 웹페이지 (0) | 2021.07.22 |
(4) 도커 Hello World (1) | 2021.07.20 |
(3) 도커 명령어 (0) | 2021.07.19 |