본문 바로가기

개발 Note/NginX+FastAPI

[NginX+Fast API] 1. Nginx + gunicorn + fast api 설정하기

반응형

어플리케이션 개발을 진행하다보면, 서비스 또는 서버가 있으면 더 멋진 프로젝트로 만들 수 있을것 같은 그런 아이디어들이 생길때가 있습니다.

 

하지만 항상 어떻게 만들지 고민들을 하게 되는데, 다행히도 요즘은 여러 블로그와 유투브들에서 다양한 기술들과 방법들을 가이드 하고 있습니다. 

저는 Ubuntu 18.04 에서 Nginx 와 FastAPI 로 셋업을 했습니다.

 

셋업을 위해 필요한 패키지(package)들는 다음과 같습니다.

 

  • python 3.7
  • nginx
  • fastapi
  • uvicorn
  • gunicorn

 

NginX 설정 하기

 

nginx 를 설치를 먼저 합니다.

 

$ sudo apt-get install nginx

NginX가 잘 동작하는지 실행해봅니다.

 

그다음, 이제 nginx 와 app을 연결하는 과정이 필요한데요.

아래와 같이 fast_api.conf 를 nginx 밑에 생성합니다.

$ /etc/nginx/sites-enabled/fast_api.conf

파일이 없을 것이니 아래와 같이 nano 나 기타 editor로 파일을 만듭니다.
$ sudo nano /etc/nginx/sites-enabled/fast_api.conf

 


fast_api.conf 파일을 아래와 같이 수정합니다.

server{
	listen 80;
	server_name 123.45.67.8;  #your public ip
	location / {
#		include proxy_params;
		proxy_pass http://127.0.0.1:8000;
	}
}

그리고 나서 nginx를 제 시작합니다.

$systemctl restart nginx.service

또는

$sudo systemctl restart nginx.service

 

나머지는 pyton pip를 이용해서 설치 해야 하기에 python 설치 이후에 진행합니다.

 

우선 python이 설치 또는 실행 환경이 셋업 되었는지 확인합니다.

 

$ python --version

아마 python 2.7, python 3.6, python 3.7 과 같이 다양한 버전들이 설치 되어있을 것입니다.

주로 python2.x 대 버전은 python 으로 python 3.x 대 버전은 python3 로 실행하게 될건데요.

 

제가 현재 셋업한 환경에서는 python3.7에서 잘 동작을 하는것 같습니다.

 

우분투에 python 이 여러개 설치 되어있다면, configuration 해서 default를 3.7로 해줘야 합니다.

만약 가상환경이나 docker를 사용한다면 이 부분은 고려하지 않아도 됩니다.

저는 ubuntu에 3.7 환경을 설정 하였습니다.

 

$ sudo apt-get install python3.7

$ update-alternatives --install /usr/bin/python python /usr/bin/python3.7 3       <--- 3 은 인덱스로 기존에 설치된것이 있어서 3번째 로 번호를 붙였습니다.

$ update-alternatives --config python
There are 3 choices for the alternative python (providing /usr/bin/python).


  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.7   3         auto mode
  1            /usr/bin/python2.7   1         manual mode
  2            /usr/bin/python3.6   2         manual mode
  3            /usr/bin/python3.7   3         manual mode

이렇게 python 설치를 하고 나면 pip로 package들을 설치 합니다.

 

$ pip install fastapi
$ pip install uvicorn
$ pip install gunicorn

그리고 아래 sample code를 작성합니다.

~$ mkdir test
~$ nano ~/test/main.py

[main.py]

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    print("hello")
    return {"message":"Server v0.0-400"}

 

 

자 아래와 같이 테스트를 진행해봅니다.

~$ cd ~/test
~$ uvicorn main:app
INFO:     Started server process [4406]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

이렇게 하면 서버가 동작하는 것을 볼수 있습니다.

browser 에서 http://127.0.0.1:8000 으로 접속을 시도해보면  {"message":"Server v0.0-400"} 이런 결과를 확인 할 수 있습니다.

만약 이상한 것이 나온다면, 뭔가 설정이 잘못된 것이겠죠?

 

 

app을  ubuntu service 등록 하기

app위에서 작성한 앱을 ubuntu(linux)  service 등록 해서 사용합니다.

linux 서비스로 등록 해서 사용하는 이유는 여러가지가 있겠지만,

app을 terminal에서 start 시키고 terminal을 종료 시키면 app 실행이 유지 되지 않는 것도 하나의 이슈이고,

service로 만들어두면 여러가지로 활용이 가능하기 때문입니다.

서버가 부팅되면 자동 실행한다든가 하는 기능을 만들기 쉬워지기도 하죠.

 

ubuntu 에 service daemon을 등록 및 실행하는 과정입니다.

mika 라는 서비스를 만들어 등록하려고 한다고 합시다.


/etc/systemd/system/mika.service    <- 이 위치에 서비스 파일을 만듭니다.

systemctl daemon-reload    <- daemon관리자를 reload해서 새로 만든 서비스 파일을 인식할 수 있도록 합니다.

# systemctl 이라는 명령을 이용하여 서비스를 enable / start/ stop 등의 상태 조절이 가능합니다.

systemctl enable mika  <- 서비스를 enable 합니다.
systemctl start mika  <- 서비스 스타트
systemctl stop mika <- 서비스 종료

 

자 여기까지 하면 nginx 와 fastapi 설정이 완료 되었습니다.

 

앞으로 서비스를 추가 확장을 하려면, REST API를 추가해 나가면 되겠죠?^^

 

2. REST API 설계 는 여기를...

 

그럼.. 해피 코딩!

 

 

 

 

아래는 참고 자료 입니다.

 

NginX + FastAPI

 

https://facerain.club/fastapi-nginx/

 

Nginx로 FastAPI 배포하기 (Feat. Gunicorn)

Nginx와 Gunicorn을 이용하여 FastAPI 서버를 배포하는 방법을 알아봅시다.

facerain.club

 

 

https://velog.io/@ddhyun93/FastAPI-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EC%85%8B%ED%8C%85%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-nginx%EC%99%80-%EC%9B%B9%EC%84%9C%EB%B2%84%EC%9D%98-%EA%B4%80%EA%B3%84

 

 

Nginx - unit. :어플리케이션 서버.

 

https://www.lesstif.com/system-admin/nginx-unit-application-server-118096054.html#nginxunit%EC%B0%A8%EC%84%B8%EB%8C%80applicationserver-application%EC%B6%94%EA%B0%80

 

nginx unit - 차세대 application server

nginx unit은 CentOS 용 ruby 모듈을 제공하지 않습니다.

www.lesstif.com

 

 

Nginx + fast api 셋업 영상

https://youtu.be/SgSnz7kW-Ko

 

'개발 Note > NginX+FastAPI' 카테고리의 다른 글

[NginX+Fast API] 2. REST API 설계  (0) 2022.11.17