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 로 클래스 매핑이 되어있었고, 이를 수정해준뒤 제대로 리턴해주는것을 확인하였다.

 

 

+ Recent posts