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