Django+Nginx+Gunicorn部署:HTTPS路径目录无法访问求助
Nginx配置导致HTTPS子路径无法访问的问题
问题描述
- 部署环境:DigitalOcean Droplet,对Nginx及Web部署不熟悉
- 当前状态:通过
http://[SERVER-IP](如http://46.101.92.95/)可正常访问所有路径;HTTPS根路径(https://rejesto.com/)能加载,但rejesto.com/[X]这类子路径均无法访问 - 页面链接:由Django的
{% url '[url]' %}标签生成,本地环境及IP访问子路径(如http://46.101.92.95/blog)均正常 - 问题定位:推测是Nginx配置问题,因为IP访问子路径正常,HTTPS子路径不行
现有Nginx配置文件(/etc/nginx/sites-available/rejesto.com)
server { server_name rejesto.com www.rejesto.com; location / { try_files $uri $uri/ =404; include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/rejesto/myprojectdir; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/rejesto.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/rejesto.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.rejesto.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = rejesto.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; server_name rejesto.com www.rejesto.com; location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } return 404; # managed by Certbot } server { listen 80; server_name 46.101.92.95; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/rejesto/myprojectdir; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }
解决方案
问题根源在HTTPS server块的location /配置里的try_files $uri $uri/ =404;这一行。
当访问HTTPS子路径(比如https://rejesto.com/blog)时,Nginx会先去本地文件系统找对应路径的文件/目录,找不到就直接返回404,根本不会把请求转发给Gunicorn处理Django的路由。而IP访问的server块没有这行配置,所以请求能正常传给Django。
修改步骤:
- 编辑HTTPS server块的
location /部分,移除try_files $uri $uri/ =404;这一行,修改后的配置如下:
server { server_name rejesto.com www.rejesto.com; location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/rejesto/myprojectdir; } listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/rejesto.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/rejesto.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
- 验证Nginx配置是否正确:
sudo nginx -t
- 重启Nginx生效:
sudo systemctl restart nginx
这样HTTPS的子路径请求就会被正确转发给Django处理,所有页面都能正常访问了。
内容的提问来源于stack exchange,提问作者Rejesto
相关产品推荐
相关产品推荐

