同一VPS服务器上两个Django应用能否通过Nginx+Gunicorn共存?
同一服务器部署多个Django应用:Nginx+Gunicorn无冲突共存方案
完全可以实现两个Django应用在同一服务器上无冲突共存,核心逻辑是通过端口隔离Gunicorn运行实例,再用Nginx做反向代理和请求路由分发,让不同请求精准匹配到对应的应用。
具体实现步骤:
1. 为每个应用配置独立的Gunicorn实例
每个Django应用需要启动单独的Gunicorn进程,通过绑定不同的本地端口实现隔离:
- 启动第一个应用:
gunicorn --bind 127.0.0.1:8000 myapp1.wsgi:application - 启动第二个应用:
gunicorn --bind 127.0.0.1:8001 myapp2.wsgi:application
推荐用systemd服务管理每个Gunicorn进程,确保进程稳定运行且开机自启。例如分别创建/etc/systemd/system/myapp1.service和/etc/systemd/system/myapp2.service,配置各自的工作目录、启动命令和用户权限。
2. 配置Nginx做反向代理与路由
Nginx负责接收外部请求,根据域名或路径规则转发到对应的Gunicorn端口,常见两种路由方式:
方式一:子域名区分
通过不同子域名指向不同应用,配置示例:
server { listen 80; server_name app1.yourdomain.com; 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; } } server { listen 80; server_name app2.yourdomain.com; location / { proxy_pass http://127.0.0.1:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
方式二:子路径区分
通过同一域名下的不同子路径区分应用,需要先在Django的settings.py中配置FORCE_SCRIPT_NAME = '/app1'(对应第一个应用),再配置Nginx:
server { listen 80; server_name yourdomain.com; location /app1/ { 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-Script-Name /app1; } location /app2/ { proxy_pass http://127.0.0.1:8001/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Script-Name /app2; } }
3. 关键注意事项
- 每个Django应用的
SECRET_KEY必须独立,避免安全风险 - 静态/媒体文件可通过Nginx单独配置
location规则,比如/static/app1/指向第一个应用的静态资源目录,确保资源访问不冲突 - Gunicorn端口仅绑定本地回环地址(127.0.0.1),无需对外暴露,仅开放Nginx的80/443端口给外部访问
内容的提问来源于stack exchange,提问作者Aboubacar Sidiki Cisse
相关产品推荐
相关产品推荐

