일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- androidStudio
- 코드포스
- Coroutine
- relay
- Python
- Compose
- architecture
- activity
- livedata
- MiTweet
- pandas
- MyVoca
- AWS
- Coroutines
- boj
- Hilt
- 코루틴
- Kotlin
- 쿠링
- 암호학
- Codeforces
- Gradle
- 백준
- ProGuard
- TEST
- GitHub
- 프로그래머스
- android
- textfield
- Rxjava
- Today
- Total
이동식 저장소
Flask + uWSGI + nginx 환경 설정하기 본문
지난 글에서 Flask를 정식으로 구동하기 위한 방법에 대해 공부했다. Flask는 단순히 애플리케이션일 뿐, 실제로 서버를 구현하려면 uWSGI와 nginx를 함께 사용해야 한다.
이제 실제로 Flask + uWSGI + nginx 환경을 만들어 보자. WSL2를 기준으로 설명하겠지만, 대부분의 리눅스 환경에서 적용할 수 있을 것이다.
uWSGI 설치
uWSGI와 uWSGI Python plugin을 설치하자. 파이썬 애플리케이션을 서버와 연결해야 하기 때문에 플러그인도 같이 설치해야 한다.
>> sudo apt-get install uwsgi uwsgi-plugin-python3
python3
에서 3을 떼면 파이썬 2 버전에 대응하는 플러그인이 설치되니 주의하자. 사실 리눅스 계열 운영체제에서는 귀찮더라도 python 뒤에 3을 매번 붙이는 게 안전하다. 아니면 alias 걸던가.
참고로 >>
기호는 입력한 커맨드를 나타내는 내 나름의 기호이다. >>
가 없는 구문은 터미널에 출력되는 메시지를 나타낸다.
uWSGI 설정 파일 작성
uWSGI 설정 파일을 작성하자. 나는 프로젝트 디렉토리에 server.ini
라는 이름으로 작성했다. 내용은 다음과 같다.
아래 설명을 천천히 읽어보고 자신의 환경에 맞게 수정할 것!!
[uwsgi]
module = server:app
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true
daemonize = [uWSGI 로그 파일 경로]
die-on-term = true
plugin-dir = /usr/lib/uwsgi/plugins
plugins = python3
module
에는 Flask 애플리케이션의 경로를 지정한다. 콜론 앞에는 Flask 앱이 위치한 파일 이름을, 뒤에는 Flask 앱이 할당된 변수 이름을 적어야 한다. 아래 사진을 참고하자.

socket
에는 서버 소켓 파일이 만들어질 경로를 지정한다. 나는 소켓을 /tmp
밑에 두었지만, 프로젝트 경로나 다른 편한 곳에 둬도 괜찮다. 단, root
또는 root
의 서브 디렉토리에 두면 안 된다. Nginx가 루트 디렉토리에 접근할 수 없기 때문이다. Nginx를 sudo
로 실행해도 마찬가지다.
chmod-socket
은 그대로 놔두자. 형식을 보면 알겠지만 소켓 파일의 권한을 설정하는 부분이다.
daemonize
에는 uWSGI 로그를 작성할 경로를 지정한다.
plugin-dir
에서 uWSGI용 Python3 플러그인의 경로를 지정했는데, 이 경로에 python3_plugin.so
파일이 있는지 확인하자.

다른 옵션은 그대로 두면 된다. 사실 나도 잘 모른다.
파일을 모두 작성했으면 다음의 심볼릭 링크를 설정하자. uWSGI에 방금 작성한 .ini
파일을 등록하는 과정이다.
>> sudo ln -s [server.ini 절대 경로] /etc/uwsgi/apps-available
>> sudo ln -s /etc/uwsgi/apps-available/server.ini /etc/uwsgi/apps-enabled
또는 아예 처음부터 .ini
파일을 /etc/uwsgi/apps-available
경로에 작성한 후, 두 번째 심볼릭 링크만 설정해도 된다. 나는 .ini
파일을 Github에 올리기 위해 프로젝트 경로에 작성했다.
이제 uWSGI를 실행해 보자.
>> uwsgi --ini server.ini
getting INI configuration from server.ini
별다른 에러가 없다면 uWSGI 설정은 완료!
Nginx 설치
이제 nginx를 구성할 차례이다. 일단 설치부터 하자.
>> sudo apt-get install nginx
Nginx 구성
/etc/nginx/sites-enabled/default
파일을 루트 권한으로 열어 보자. 뭔가 주석이 많지만 무시해도 된다. 파일 내용을 다음과 같이 수정하자. 루트 권한으로 열지 않으면 저장이 안 될 것이다.
>> sudo vi /etc/nginx/sites-enabled/default
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:[소켓 파일 경로];
}
}
소켓 파일 경로는 아까 uWSGI 설정 파일에 작성한 경로를 넣으면 된다. 앞에 unix:
가 붙는 점에 유의. 참고로 location /
부분에서 $url
이 아니라 $uri
다.
방금 작성한 파일을 검증하기 위해 nginx -t
를 실행해 보자.
>> nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
테스트를 통과했다! 이제 nginx를 실행할 수 있다.
Nginx 실행
>> sudo service nginx start
* Starting nginx nginx [ OK ]
서버가 구동되었으니 이제 페이지에 접속해 보자. 이제 5000번 포트를 지정하지 않아도 된다. 그런 하찮은 포트포워딩은 nginx와 uWSGI가 대신 해준다. 서버를 로컬에서 실행했다면 localhost
만 입력하면 된다.

완벽 성공!
참고로 nginx 로그는 /var/log/nginx/error.log
와 /var/log/nginx/access.log
에서 확인할 수 있다. 뭔가 잘 안 된다면 로그를 잘 읽어보자.
참고문헌
[Infra] flask, nginx, uwsgi(2) 연동하기
flask, nginx, uwsgi 연동하기(실습)
losskatsu.github.io
[Python] Flask + uWSGI + Nginx를 연결 및 배포
이번 포스팅은 Flask + uWSGI + Nginx를 연결하여 웹 애플리케이션을 배포하는 포스팅입니다. Flask ( 웹 애플리케이션 ) Flask는 파이썬으로 작성된 마이크로 웹 프레임워크 중 하나이다. Flask 설치 $ pip i
soyoung-new-challenge.tistory.com
'Tertiary > Backend' 카테고리의 다른 글
Nginx https 연결이 안 된다면? (0) | 2022.09.21 |
---|---|
Flask, uWSGI, nginx (0) | 2022.09.15 |
Ubuntu에서 메모리가 부족할 때 (0) | 2022.09.14 |
AWS Lambda로 파이썬 코드 실행하기 (0) | 2022.09.04 |
Ubuntu가 시작될 때 스크립트 실행하기 (0) | 2022.08.31 |