为什么 systemd 套接字激活尚未准备好处理第一个请求

为什么 systemd 套接字激活尚未准备好处理第一个请求

我有一个 Flask 应用程序在 python 虚拟环境中运行,并与 uWSGI 和 Nginx 一起使用。

我想使用 systemd 套接字激活来管理应用程序的启动。

这是相关配置:

uwsgi-flask.service

[Unit]
Description=a uWSGI app
After=syslog.target

[Service]
Type=notify
User=www-data
Group=www-data
WorkingDirectory=/home/www-data/my-app
ExecStart=/bin/bash -c "source venv/bin/activate && uwsgi \
          --ini flask-uwsgi.ini \
          --socket /dev/shm/flask.sock"
Restart=always
KillSignal=SIGQUIT
StandardError=syslog
NotifyAccess=all

uwsgi-flask.socket

[Unit]
Description=Socket for uWSGI app

[Socket]
ListenStream=/dev/shm/flask.sock
SocketUser=www-data
SocketGroup=www-data
SocketMode=0660

[Install]
WantedBy=sockets.target

nginx.conf

server {
    listen  80;
    server_name localhost;

    location / {
        root /home/www-data/my-app/public;
        try_files $uri @flask;
    }

    location @flask {
        uwsgi_pass   unix:/dev/shm/flask.sock;
        include      uwsgi_params;
    }
}

当我启动 systemd 套接字并发出请求时:

systemctl start uwsgi-flask.socket

第一个请求总是收到如下 504 响应:

504 Gateway Time-out

但第二次及以后的请求都是正常的。就好像发出第一个请求时 unix 套接字尚未准备好一样。

奇怪的是,如果我开始uwsgi-flask.service直接就没有问题了:

systemctl start uwsgi-flask.service

造成上述问题的原因可能是什么?

相关内容