Nginx无法转发至Gunicorn Socket,访问返回404错误求助
解决Nginx转发Gunicorn Socket返回404的问题
从你提供的配置和服务状态来看,有几个关键问题需要排查,我帮你一步步梳理:
1. Nginx缺失HTTPS Server配置(核心问题)
你当前的Nginx配置只处理了80端口的HTTP请求,并将其跳转到HTTPS,但完全没有配置处理443端口的HTTPS请求!这就是访问https://example.com返回404的直接原因——Nginx不知道该如何处理这个HTTPS请求。
修改你的Nginx配置,添加HTTPS的server块(记得替换证书路径):
# 处理HTTP请求,跳转到HTTPS server { listen 80; server_name example.com; return 301 https://$host$request_uri; } # 处理HTTPS请求 server { listen 443 ssl; server_name example.com; # 替换成你的SSL证书路径 ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /var/www/example.com; } location / { include proxy_params; proxy_pass http://unix:/var/www/example.com/example_app.sock; } }
2. 检查Socket文件权限
虽然你的Gunicorn服务用www-data用户运行,但需要确认socket文件的权限是否允许Nginx(同样以www-data运行)访问:
ls -l /var/www/example.com/example_app.sock
正常输出应该是类似:
srwxrwxrwx 1 www-data www-data 0 Sep 29 16:08 example_app.sock
如果权限不对,可以在Gunicorn启动命令里添加--umask 0002来确保组用户有读写权限,修改example_app.service的ExecStart:
ExecStart=gunicorn --workers 1 --bind unix:example_app.sock --umask 0002 -m 007 run:app
修改后重启服务:
sudo systemctl daemon-reload sudo systemctl restart example_app.service
3. 验证Gunicorn服务的可用性
可以直接通过socket发送请求,测试Gunicorn是否正常响应:
curl --unix-socket /var/www/example.com/example_app.sock http://localhost/
如果返回你的应用内容,说明Gunicorn没问题;如果报错,需要检查run.py里的app对象是否正确导出,以及应用是否有其他错误。
4. 检查Nginx日志
查看Nginx的错误日志,获取更详细的404原因:
sudo tail -f /var/log/nginx/error.log
如果日志里出现类似connect() to unix:/var/www/example.com/example_app.sock failed (13: Permission denied),说明就是权限问题,回到步骤2解决。
内容的提问来源于stack exchange,提问作者Abeer Sul
相关产品推荐
相关产品推荐

