Django+Gunicorn+Nginx部署后mydomain.ru无法访问,Nginx报111连接拒绝错误求助
兄弟,我看了你遇到的问题——裸域mydomain.ru访问不了,只能用IP和www.mydomain.ru,还触发Nginx的111连接拒绝错误,这种情况我之前部署Django时也碰到过,咱们一步步来排查解决:
第一步:先确认DNS解析是否正确
首先得确保mydomain.ru的A记录确实指向你的服务器公网IP,别是域名解析出问题了。你可以在本地终端执行:
ping mydomain.ru # 或者用dig更准确 dig mydomain.ru
如果返回的IP不是你的服务器IP,先去域名服务商那里修正A记录,这是最基础的前提。
第二步:简化并修正Nginx配置
你现在写了两个几乎一样的server块,其实可以合并成一个,而且里面的proxy_set_header Host参数可能是问题所在。把你的Nginx配置改成下面这样:
server { listen 80; # 同时匹配裸域和www域名 server_name mydomain.ru www.mydomain.ru; access_log /var/log/nginx/example.log; location /static/ { root /home/alex/myproject; expires 30d; } location /media/ { root /home/alex/myproject; expires 30d; } location / { proxy_pass http://127.0.0.1:8000; # 把$server_name改成$host,确保传递正确的请求Host头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
为什么改$host?因为$host会自动获取用户请求里的真实Host头部值,而$server_name只是你配置里写的固定值。Django的ALLOWED_HOSTS是校验请求Host头的,传递正确的Host头才能让Gunicorn正常接收请求。
第三步:验证Nginx配置并重启
修改完配置后,先检查语法是否正确:
sudo nginx -t
如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,就重启Nginx生效:
sudo systemctl restart nginx
第四步:检查Gunicorn日志找线索
你之前只看了Nginx的日志,Gunicorn的日志可能藏着关键信息——比如有没有接收到mydomain.ru的请求,是不是因为Host头不对被拒绝了。如果用supervisor管理Gunicorn,日志一般在/var/log/supervisor/目录下,比如:
cat /var/log/supervisor/gunicorn.log
看看里面有没有和mydomain.ru相关的错误提示。
第五步:本地测试Nginx转发是否正常
在服务器本地用curl模拟外部请求,测试Nginx能不能正确把mydomain.ru的请求转发给Gunicorn:
curl -H "Host: mydomain.ru" http://127.0.0.1
如果能返回Django的页面内容,说明Nginx到Gunicorn的转发没问题,问题可能在外部网络或者DNS;如果还是报错,那就是Nginx配置或者Gunicorn的问题,再回头检查。
第六步:确认Django的配置
再核对一下settings.py里的配置,确保裸域和www域名都在允许列表里:
ALLOWED_HOSTS = ['mydomain.ru', 'www.mydomain.ru', '你的服务器公网IP'] CSRF_TRUSTED_ORIGINS = ['http://mydomain.ru', 'http://www.mydomain.ru']
注意你现在用的是HTTP(80端口),所以不要加https,后续如果配置SSL再改。
第七步:检查防火墙规则
虽然服务器IP能访问,但还是确认一下防火墙有没有允许80端口的所有请求:
sudo ufw status
如果看到80/tcp不在允许列表里,就添加规则:
sudo ufw allow 80/tcp
按照上面的步骤走一遍,应该能解决你的问题。如果还是不行,把Gunicorn的日志内容贴出来,咱们再接着排查!
备注:内容来源于stack exchange,提问作者Artem P

