单服务器同域名443端口下按路径部署前后端配置方案
结论
完全可以在同一台服务器、同一个域名的443端口下通过路径规则区分前后端流量,这也是解决非标准端口被用户侧防火墙拦截的通用方案,调整后不需要再对外暴露8443端口。
配置修改要点
- Nginx的location匹配遵循最长前缀优先规则,后端路径规则必须放在前端根路径规则前面,避免请求被前端路由拦截。
- 如果后端Django路由没有统一添加
/backend前缀,代理时需要重写URI剥离前缀,否则后端收到的请求路径携带/backend会返回404。 - 后端静态资源路径需要和接口路径统一前缀,避免和前端静态资源冲突。
- 配置修改后先校验语法再重载服务,避免配置错误导致站点不可用。
完整修改后配置
你可以直接将原有443端口的server块替换为如下内容,原有8443、8000端口的server块可以直接删除,同时关闭服务器安全组/防火墙对应端口的入站规则:
# 80端口跳转规则 server { listen 80; server_name website.com app.website.com; return 301 https://$host$request_uri; } server { listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate /etc/ssl/app.website.com_ssl_certificate.cer; ssl_certificate_key /etc/ssl/app.website.com_private_key.key; root /home/website/dist; index index.html index.htm index.nginx-debian.html; server_name app.website.com; # 后端接口代理 location /backend/ { # 若Django路由本身已添加/backend前缀,注释掉下一行重写规则 rewrite ^/backend/(.*)$ /$1 break; include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } # 后端静态资源代理 location /backend/static/ { alias /home/website/backend/static/; expires 30d; add_header Cache-Control "public, immutable"; } location = /favicon.ico { access_log off; log_not_found off; } # 前端路由规则 location / { try_files $uri $uri/ /index.html; # 前端禁用缓存规则保持原有逻辑 add_header Last-Modified $date_gmt; add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; if_modified_since off; expires off; etag off; } }
后续适配操作
- 执行
nginx -t检查配置语法,确认返回success后执行systemctl reload nginx重载配置生效。 - 将前端代码中所有写死的
https://app.website.com:8443接口地址,统一替换为/backend相对路径。 - 若Django配置了
CSRF_TRUSTED_ORIGINS、CORS_ALLOWED_ORIGINS类跨域规则,由于现在前后端同域名同端口不存在跨域,可按需清理冗余配置。 - 若Django存在自动生成绝对URL的场景(如分页、文件下载链接),可在
settings.py中添加FORCE_SCRIPT_NAME = '/backend',确保生成的链接携带正确前缀。
内容的提问来源于stack exchange,提问作者Dmitry Kotikov
相关产品推荐
相关产品推荐

