为何uWSGI Emperor搭配Nginx时Django应用出现连接过早关闭?
手动执行uwsgi --socket lhhs/lhhs.sock --module lhhs/lhhs.wsgi --chmod-socket=664可正常启动Django应用,python manage.py test也显示应用无异常。但使用Nginx与uWSGI Emperor部署时,Nginx抛出如下错误:
upstream prematurely closed connection while reading response header from upstream, client: 74.45.12.120, server: lhhs.oh-joy.org, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///var/www/webapps/lhhs/lhhs/lhhs.sock:", host: "lhhs.oh-joy.org"
当前uWSGI配置文件(.ini)
uid = www-data chdir=/var/www/webapps/lhhs/lhhs home=/var/www/webapps/lhhs/env virtualenv=/var/www/webapps/lhhs/env module=lhhs.wsgi:application master=True pidfile=/tmp/project-master.pid vacuum=True max-requests=5000 daemonize=/var/www/webapps/lhhs/log/lhhs-uwsgi.log socket=/var/www/webapps/lhhs/lhhs/lhhs.sock chmod-socket = 664
当前Nginx配置文件
upstream django { server unix:///var/www/webapps/lhhs/lhhs/lhhs.sock; # for a file socket #server 127.0.0.1:8001; # for a web port socket (we'll use this first) } server { listen 443 ssl; server_name lhhs.oh-joy.org; charset utf-8; ssl_certificate /etc/letsencrypt/live/lhhs.oh-joy.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/lhhs.oh-joy.org/privkey.pem; # managed by Certbot location /static { alias /var/www/webapps/lhhs/lhhs/static; } location /media { alias /var/www/webapps/lhhs/lhhs/media; } location /favicon.ico { alias /var/www/webapps/lhhs/lhhs/static/images/favicon.ico; } location / { include /etc/nginx/uwsgi_params; uwsgi_pass django; } } server { if ($host = lhhs.oh-joy.org) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name lhhs.oh-joy.org; return 404; # managed by Certbot }
怀疑问题在于uWSGI Emperor模式下,即便配置了home和virtualenv参数,仍无法正确识别虚拟环境。
明确指定虚拟环境的Python解释器
在uWSGI配置文件中添加以下参数,直接指向虚拟环境内的Python解释器和site-packages路径:interpreter = /var/www/webapps/lhhs/env/bin/python pythonpath = /var/www/webapps/lhhs/env/lib/python3.x/site-packages注意将
python3.x替换为实际的Python版本号(如python3.8、python3.9)。同时根据环境添加对应的uWSGI Python插件:plugin = python3修复虚拟环境目录权限
确保www-data用户对虚拟环境目录有完整的读取权限:chown -R www-data:www-data /var/www/webapps/lhhs/env chmod -R 755 /var/www/webapps/lhhs/env简化虚拟环境配置参数
去掉配置中重复的home参数,仅保留virtualenv:# home=/var/www/webapps/lhhs/env # 删除此行 virtualenv=/var/www/webapps/lhhs/env排查uWSGI日志获取细节
查看uWSGI的日志文件/var/www/webapps/lhhs/log/lhhs-uwsgi.log,里面会记录启动时的错误(如模块缺失、路径错误、权限不足等),这些信息能直接定位问题根源。重启服务应用配置
修改配置后,重启uWSGI Emperor和Nginx服务:systemctl restart uwsgi systemctl restart nginx
内容的提问来源于stack exchange,提问作者bradrice

