Gunicornをsystemdで起動する ソケット編

django Published at Feb. 15, 2025, 5:10 p.m. by admin@senrigan.org

GunicornとNginx間の通信をTCP/IPからソケット通信に変更する。これまたハマってAppArmorをteardownしたらうまく行った気がするんだけど、あれは何だったんだろう??

nginx.confを変更して

        # proxy_pass http://127.0.0.1:8000;
        proxy_pass http://unix:/run/gunicorn.sock;

/etc/systemd/system/gunicorn.socketを作って

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

SocketUser=webadmin
SocketGroup=webadmin

SocketMode=0660

[Install]
WantedBy=sockets.target

/etc/systemd/system/gunicorn.serviceを修正して

# ExecStart=/home/webadmin/www/senrigan/.venv/bin/python /home/webadmin/www/senrigan/.venv/bin/gunicorn --bind 127.0.0.1:8000 app.wsgi
ExecStart=/home/webadmin/www/senrigan/.venv/bin/python /home/webadmin/www/senrigan/.venv/bin/gunicorn --bind unix:/run/gunicorn.sock app.wsgi

NginxとGunicorn再起動するとPermissionのエラー。

** /var/log/nginx/error.log **

2025/02/16 20:36:08 [crit] 3706#3706: *4 connect() to unix:/run/gunicorn.sock failed (13: Permission denied)
 while connecting to upstream, client: 1.73.154.214, server: www.senrigan.org, request: "GET /blog/ HTTP/1.1",
 upstream: "http://unix:/run/gunicorn.sock:/blog/", host: "www.senrigan.org"

Nginxからsocketファイル見えないみたいなので、gunicorn.socketのGroupだけwww-dataに変更したらなおった。