Debian VPS上如何通过Django整合部署多个Web应用?
你这个需求不需要让Django处理流量转发,核心用Nginx基于名称的虚拟主机+反向代理就能实现,流量分发全在Nginx层完成,性能远高于走Django转发,也不会出现单个服务故障拖垮全站的问题。Django只需要负责根域名的博客业务,在主页模板加上各服务的子域名导航链接就能实现统一入口效果。
前置操作(Debian环境)
- 安装Nginx并放行端口
sudo apt update && sudo apt install nginx -y sudo ufw allow 'Nginx Full' - 提前把域名解析做好:
webpage.com和*.webpage.com都A记录指向你的VPS公网IP。 - 所有后端服务(Django、GitLab、Wallabag等)启动时仅绑定127.0.0.1的本地端口,不要绑定0.0.0.0暴露公网,每个服务分配不同本地端口避免冲突,参考端口分配:
- Django(Gunicorn/uWSGI):127.0.0.1:8000
- GitLab CE:127.0.0.1:8081
- Wallabag:127.0.0.1:8082
- FluxRSS:127.0.0.1:8083
注意:Veloren是游戏服务,游戏本身的TCP/UDP业务端口不需要走Nginx反代,直接放行对应防火墙端口即可,只有它的Web管理面板需要走反代。
具体配置步骤
1. 配置GitLab CE适配反向代理
GitLab默认自带内置Nginx会占用80/443端口,需要先修改配置让它监听本地端口:
- 编辑GitLab配置文件
/etc/gitlab/gitlab.rb,修改以下参数:external_url 'http://gitlab.webpage.com' nginx['listen_port'] = 8081 nginx['listen_https'] = false nginx['listen_addresses'] = ['127.0.0.1'] - 执行命令让配置生效:
sudo gitlab-ctl reconfigure
2. 编写Nginx分发规则
Nginx的站点配置统一放在/etc/nginx/sites-available/目录下,配置完成后软链接到/etc/nginx/sites-enabled/即可生效。
根域名(Django博客)配置
新建配置文件/etc/nginx/sites-available/webpage.com,内容参考:
server { listen 80; server_name webpage.com; # Django静态资源路径,改成你自己的静态文件目录 location /static/ { alias /path/to/your/django/static/; } location /media/ { alias /path/to/your/django/media/; } # 反向代理到本地Django服务 location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
GitLab子域名配置
新建配置文件/etc/nginx/sites-available/gitlab.webpage.com,内容参考:
server { listen 80; server_name gitlab.webpage.com; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # GitLab需要的额外请求头,避免跳转、资源加载异常 proxy_set_header X-Forwarded-Ssl on; proxy_buffering off; proxy_request_buffering off; client_max_body_size 256m; } }
其他服务通用配置模板
Wallabag、FluxRSS、Veloren面板的配置逻辑完全一致,只需要改server_name和proxy_pass对应的本地端口即可,请求头部分和上面Django的配置通用。
3. 启用配置并验证
# 把配置软链接到启用目录 sudo ln -s /etc/nginx/sites-available/webpage.com /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/gitlab.webpage.com /etc/nginx/sites-enabled/ # 测试配置语法是否正确 sudo nginx -t # 测试通过后重载Nginx生效 sudo systemctl reload nginx
4. 配置HTTPS(可选但推荐)
直接用certbot自动申请Let's Encrypt证书并自动改写Nginx配置:
sudo apt install python3-certbot-nginx -y sudo certbot --nginx
按提示选择需要配置证书的域名即可,工具会自动配置证书续期。
检索关键词参考
你之前搜不到对应方案是关键词选偏了,不需要搜Django相关的转发配置,直接搜以下关键词就能找到大量参考:
- Nginx 基于名称的虚拟主机
- Nginx 子域名反向代理
- 自托管多服务Nginx反代
- GitLab CE 反向代理部署
常见排错点
- 每次修改Nginx配置后必须先执行
nginx -t验证语法,确认无错再重载服务 - 如果出现服务跳转127.0.0.1、资源加载404,基本都是反向代理的
Host请求头没配置对 - 不要让多个服务同时监听同一个公网端口,否则会出现端口冲突导致Nginx启动失败
内容的提问来源于stack exchange,提问作者coyote

