Using Unix sockets instead of ports
지금까지 우리는 TCP 포트 소켓을 사용했다. 왜냐하면 더 간단하기 때문이다. 실제로 포트보다 유닉스 소켓을 사용하는 것이 더 좋다. 오버 헤드가 적기 때문이다.
.ini
파일로 실행되도록 uWSGI 구성
$ sudo mkdir /etc/uwsgi
$ sudo mkdir /etc/uwsgi/sites
$ sudo vi /etc/uwsgi/sites/app.ini
[uwsgi]
# Django application folder (full path)
chdir = /srv/app/django_app
# Django's wsgi file
module = config.wsgi
# VirtualEnv location (full path)
home = /home/ubuntu/.pyenv/versions/deploy_ec2
# 서버 실행하는 권한을 가진 유저를 따로 설정하는 것을 권장
uid = nginx
gid = nginx
# the socket (use the full path to be safe)
socket = /tmp/app.sock
# 권한이 없어 Permission Denied가 발생하는 것을 방지하기 위해
# 666 : 해당 파일에 대해 읽기, 쓰기 권한
chmod-socket = 666
chown-socket = nginx:nginx
enable-threads = ture
master = true
vacuum = true
pidfile = /tmp/app.pid
uWSGI 서비스 설정파일 작성
$ sudo vi /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Emperor service
After=syslog.target
[Service]
# /bin/sh is normally a symbolic link to bash
# -c option : Read commands from the following string and assign
# -p option : 존재하지 않는 중간 디렉터리를 자동 생성(계층 구조 생성시 유용)
ExecPre=/bin/sh -c 'mkdir -p /run/uwsgi; chown nginx:nginx /run/uwsgi'
# emperor 모드 : uWSGI config files의 디렉토리를 감시하고
# 변경사항이 발견되면 vassals 인스턴스 생성
# 즉, config files이 수정될 때마다 자동 재시작
ExecStart=/home/ubuntu/.pyenv/versions/deploy_ec2/bin/uwsgi --uid nginx --gid nginx --master --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
등록한 uwsgi 서비스 실행
$ sudo systemctl restart uwsgi
$ cd /tmp
$ l
total 36K
drwxrwxrwt 8 root root 4.0K Mar 6 08:11 .
drwxr-xr-x 23 root root 4.0K Mar 6 06:32 ..
-rw-r--r-- 1 nginx nginx 6 Mar 6 08:48 app.pid
srwxr-xr-x 1 nginx nginx 0 Mar 6 07:37 app.sock
# ...
# 기존 파일 삭제
$ sudo rm app.pid
$ sudo rm app.sock
$ sudo systemctl daemon-reload
$ sudo systemctl restart uwsgi