일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Gradle
- Compose
- 코드포스
- Coroutines
- Python
- textfield
- livedata
- TEST
- Codeforces
- boj
- relay
- AWS
- 암호학
- 프로그래머스
- 백준
- Kotlin
- 쿠링
- 코루틴
- androidStudio
- pandas
- ProGuard
- MiTweet
- android
- activity
- architecture
- Rxjava
- MyVoca
- GitHub
- Coroutine
- Hilt
- 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 |