반응형
Flask, django로 개발을 마친 후에 우분투 기반으로 서버를 가동하고 싶을 때, 사전 작업으로 기존에 쓰던 app.py 혹은 manage.py 를 사용하지 않고, 서버용 스크립트를 따로 만든다. 나는 보통 네이밍을 wsgi_{environment}.py 로 만드는데, 스크립트는 기존 앱과 거의 비슷하게 생겼지만, 해당 서버용 스크립트는 기존 디버그 환경과는 다른 변수로 세팅하는 목적이 있다. (환경 변수로 커버할 수 있으면 같은 것 써도 무방하긴 할 듯..)
우선 ubuntu 에서 uwsgi 설치를 해야 한다.
pip3 install uwsgi
그 다음 서비스에 관련된 정보를 넣을 dev.ini 파일을 만든다
[uwsgi]
module = wsgi:app # wsgi.py 에서 app 으로 정의된 값이 모듈이 된다는 뜻
master = true
processes = 5 # 마스터 아래에 둘 프로세스 수 (이러면 총 6개의 프로세스가 돌게 된다.)
socket = :5000 # 요청을 받을 포트 (nginx 설정에서 80, 443 포트로 넘어올 때 이 포트로 포워드 해줄 예정)
chmod-socket = 664
vacuum = true
die-on-term = true
enable-threads = true
pidfile = /var/run/uwsgi/{my_program}.pid # 프로세스 실행시 pid를 저장할 장소
env = MY_ENV=dev # 환경변수 넣어줄 수 있음(예시로 환경변수 MY_ENV를 "dev"로 설정함)
위 ini 파일을 기반으로 우분투에 서비스 등록을 한다. ubuntu 16.04 의 경우에는 /etc/init/ 이나 /etc/init.d/ 에 정의하는 것과 달리, /etc/systemd/system/ 아래에 서비스 정의를 한다.
sudo vi /etc/systemd/system/myservice.service
그런 다음 서비스 상세 정보를 기입한다.
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User={우분투계정명} # 이 서비스의 계정은 {우분투계정명}이 되므로, 혹시 권한 dependent한 것이 있으면 변경해준다.
Group=www-data # 이 서비스의 그룹은 www-data 가 되므로, 혹시 권한 dependent한 것이 있으면 변경해준다.
WorkingDirectory=/{path}/{to}/{myproject}
Environment="PATH=/{path}/{to}/{myproject}/venv/bin" # 나 같은 경우 보통 프로젝트마다 venv를 활용하기 때문에 서비스 실행 시에도 환경변수 활용을 하도록 해당 라인을 넣어줬다.
ExecStart=/{path}/{to}/{myproject}/venv/bin/uwsgi --ini dev.ini # 위에서 정의한 dev.ini를 기반으로 서비스 실행하는 커맨드라인
[Install]
WantedBy=multi-user.target
그런 다음 서비스 실행/중지/재시작을 하려면 아래 키워드를 입력하면 된다.
sudo service {myproject} status # 서비스 실행 상태 확인
sudo service {myproject} start # 서비스 시작
sudo service {myproject} stop # 서비스 정지
sudo service {myproject} restart # 서비스 재시작
journalctl -u {myproject} -f # 서비스 로그 확인, -f: follow
만약 서비스 상태를 조회했는데 에러가 났고, 그 에러가 위에 dev.ini 에서 정의되어 있는 pid 파일이 생성되지 못한 에러라면, /var/run/ 경로가 sudo 권한이 필요하기 때문이다. 그런 경우, pid 파일의 경로를 바꿔주거나, 아래 명령어로 해결하면 된다.
sudo mkdir /var/run/uwsgi
sudo chown {우분투계정명} /var/run/uwsgi/
그 다음 서비스 실행 명령어를 다시 호출하고, 그 다음 서비스 상태를 조회한다.
반응형
'개발 이야기 > Linux' 카테고리의 다른 글
Nginx Response header 커스터마이징하기 (0) | 2022.02.04 |
---|---|
디렉토리 용량 구하기 (0) | 2020.12.10 |
Ubuntu 16.04 & Python 3.6 사용할 때 mysqldb, uwsgi 에러 발생시 해결 (0) | 2020.11.27 |
특정 포트를 점유중인 프로세스 종료하기 (0) | 2020.11.27 |
Nginx 설정으로 분리된 Web, WAS 연결하기 (0) | 2020.11.27 |
댓글