(1) NginX 설정파일
- /etc/nginx/conf.d/*.conf <-- 가장 일반적
- /etc/nginx/site-available/*.conf
- /etc/nginx/site-enabled/*.conf
http {
# 최상위 블록
# 모든 지시어는 하위 블록에 상속됨.
server { # 하나의 웹사이트 단위
# 하위 블록의 지시어는 상위 블록 것보다 먼저 적용됨.
location <PATH> {
# 특정 URL을 처리
}
}
}
events {
# 네트워크의 동작방법과 관련된 설정값
# 위의 블록들과 상속관계를 갖지 않음
# 이벤트 블록 전용 지시어 사용
}
- 지시어
server_name 서비스할 호스트명 정의;
include 포함할 설정파일 경로; <-- 관련 설정 파일을 재사용하는 용도
(2) 서버 구조
외부 요청 ↔︎ 웹 서버 ↔︎ WSGI ↔︎ 애플리케이션
(2) 프록시 방법
위 서버구조에서 프록시는 웹 서버와 WSGI 사이에서 일어나며, WSGI는 애플리케이션과 하나라고 봐도 무방하다.
사실상 파이썬 애플리케이션이 혼자 통신하기 힘드니 도와주는 친구라고 생각하자.
[nginx 설정파일 .conf]
server {
listen 80;
server_name <SERVER_HOSTNAME>;
access_log /var/log/nginx/example.log;
location / {
proxy_pass http://<IP or Domain>:<PORT>;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
또는
upstream example_server {
server <IP or Domain>:<Port>;
}
server {
...
location / {
proxy_pass http://example_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
proxy_set_header 와 같은 옵션은 서버가 여러 개면 추가하는게 좋음 (단, 필수는 아님)
- gunicorn 은 이 방식만 가능
[gunicorn 명령어, 별도 파일 X]
gunicorn --chdir <PROJECT_DIR> --bind :<PORT> <WSGI_PATH>.wsgi:application
- uwsgi 는 별도의 파일이 필요
[uwsgi 설정파일 .ini]
[uwsgi]
chdir=<wsgi 모듈이 있는 프로젝트 디렉토리 경로>
module=<wsgi 모듈 경로>.wsgi:application
env = DJANGO_SETTINGS_MODULE=<settings 모듈 경로>
http=:<PORT>
logto=/var/log/<path>/@(exec://date+%%Y-%%m-%%d).log
# 기타 설정들은 알아서
# 맨 위 "[uwsgi]"의 의미는 wigs 모듈 별로 관리할 수 있는 "서버 식별자 = 이름" 정도로 볼 수 있음.
# 하나의 설정 파일에 다수의 서버가 관리가능하나, 설정 파일은 나누는 것을 추천
[uwsgi 명령어]
- 명령어를 일일이 치기 귀찮을 경우, 데몬으로 서비스 등록하는 방법이 있음 (아래 참고)
[서비스 등록 스크립트, uwsgi.service]
[Unit]
Description=uWSGI service
After=syslog.target
[Service]
ExecStart=<uwsgi binary 경로> -i <ini 파일 경로>
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
- 경로: /etc/systemd/system/uwsgi.service
- 명령어:
(스크립트 변경 시 데몬을 재시작해야함)
[nginx 설정파일 .conf]
server {
listen 80;
server_name <SERVER_HOSTNAME>;
access_log /var/log/nginx/example.log;
location / {
uwsgi_pass unix:<.sock 파일 경로>;
include uwsgi_param;
}
}
또는
upstream example_server {
server unix:<.sock 경로>
}
server {
...
location / {
uwsgi_pass example_server;
include uwsgi_param;
}
}
[uwsgi 설정파일 .ini]
[uwsgi]
chdir=<wsgi 모듈이 있는 프로젝트 디렉토리 경로>
module=<wsgi 모듈 경로>.wsgi:application
env = DJANGO_SETTINGS_MODULE=<settings 모듈 경로>
socket=<.sock 경로>
chmod-socket=666
logto=/var/log/<path>/@(exec://date+%%Y-%%m-%%d).log
# 가급적 소켓파일의 권한을 명시해주면 좋다. (아래의 경우 deploy 유저)
uid=deploy
gid=deploy
chown-socket=deploy:deploy
[uwsgi 명령어 / 서비스 등록 스크립트] : 위와 동일
[nginx 설정파일 .conf]
server {
listen 80;
server_name <SERVER_HOSTNAME>;
access_log /var/log/nginx/example.log;
location / {
uwsgi_pass <IP or Domain>:<PORT>;
include uwsgi_param;
}
}
또는
upstream example_server {
server <IP or Domain>:<Port>;
}
server {
...
location / {
uwsgi_pass example_server;
include uwsgi_param;
}
}
[uwsgi 설정파일 .ini]
[uwsgi]
chdir=<wsgi 모듈이 있는 프로젝트 디렉토리 경로>
module=<wsgi 모듈 경로>.wsgi:application
env = DJANGO_SETTINGS_MODULE=<settings 모듈 경로>
socket=:<PORT>
chmod-socket=666
logto=/var/log/<path>/@(exec://date+%%Y-%%m-%%d).log
[uwsgi 명령어 / 서비스 등록 스크립트] : 위와 동일
Ref.
gunicorn 환경설정
uwsgi 설정파일
nginx 설정파일: