CentOS 7.X下Systemd启动虚拟环境中Django+uWSGI服务无法访问求助
排查CentOS 7上uWSGI+Django服务可运行但无法访问的问题
看起来你的配置框架已经搭好了,但有几个关键细节可能导致无法访问。咱们一步步来排查:
1. 先确认uWSGI的端口协议类型(最可能的原因)
你的uWSGI配置里用的是socket = 127.0.0.1:8003,这个配置绑定的是uWSGI专用协议的端口,不是标准HTTP端口,所以直接用浏览器、curl这类HTTP客户端访问是会失败的。
解决方法:
- 如果需要直接通过HTTP访问应用,把配置改成
http-socket = 127.0.0.1:8003:[uwsgi] module = wsgi:application master = true processes = 5 http-socket = 127.0.0.1:8003 chmod-socket = 664 vacuum = true die-on-term = true - 修改后重启服务:
sudo systemctl restart django_03.service,再尝试访问。
2. 检查端口的访问范围
如果你的socket或http-socket绑定的是127.0.0.1,这个端口只能在服务器本地访问,外部机器是连不上的:
- 如果需要外部机器访问,把绑定地址改成
0.0.0.0:8003(允许所有网卡访问) - 如果是用Nginx反向代理的场景,绑定
127.0.0.1是合理的,但要确保Nginx配置正确转发到这个端口,且Nginx服务正常运行。
3. 验证防火墙规则
CentOS 7默认启用firewalld,即使端口处于LISTEN状态,防火墙没开放端口的话外部也访问不了:
- 查看当前开放的端口:
sudo firewall-cmd --list-ports - 如果没看到
8003/tcp,先添加临时规则测试:sudo firewall-cmd --add-port=8003/tcp - 测试没问题后添加永久规则:
sudo firewall-cmd --add-port=8003/tcp --permanent,然后重载防火墙:sudo firewall-cmd --reload
4. 本地测试连通性,缩小问题范围
先在服务器本地测试,排除外部网络问题:
- 用curl测试:
curl http://127.0.0.1:8003(注意如果用的是socket而不是http-socket,这个命令会失败,因为协议不匹配) - 或者用telnet测试端口是否开放:
telnet 127.0.0.1 8003- 如果本地能连接但返回内容异常,检查uWSGI日志;如果本地都连不上,再回头看配置和服务状态。
5. 查看服务日志,排查隐藏错误
你的systemd配置把错误输出到syslog了,查看日志找线索:
- 查看django_03服务的日志:
sudo journalctl -u django_03.service -f(-f实时追踪日志) - 或者查看syslog:
sudo tail -f /var/log/messages
重点看是否有模块加载失败、权限不足、虚拟环境激活异常这类错误。
6. 确认文件和目录权限
确保运行服务的myuser对应用目录和虚拟环境有足够权限:
- 检查目录权限:
ls -ld /opt/scripts/django/django_03 - 检查虚拟环境权限:
ls -ld /opt/scripts/django/django_03/django_03_env - 如果权限不足,调整权限:
sudo chown -R myuser:myuser /opt/scripts/django/django_03
内容的提问来源于stack exchange,提问作者donmelchior
相关产品推荐
相关产品推荐

