生产部署:如何配置Nginx作为Node.js与Django的反向代理
没问题,这其实是生产环境里非常常见的场景——用Nginx做统一入口,把前端页面请求和API请求分别转发到对应的服务。我一步步给你讲清楚怎么配置:
核心思路
Nginx通过location指令匹配不同的请求路径:把所有非/api开头的请求转发到Node.js的3000端口(前端服务),把/api开头的请求转发到Django的8000端口(后端API)。用户访问你的域名时,Nginx会自动帮你完成请求分流。
1. 基础Nginx配置示例
首先,打开Nginx的配置目录(通常是/etc/nginx/sites-available/),新建一个配置文件比如your-project.conf,再软链到/etc/nginx/sites-enabled/目录(让Nginx加载这个配置)。
配置内容如下:
server { listen 80; server_name your-domain.com; # 替换成你的域名或服务器公网IP # 处理前端所有非API请求 location / { proxy_pass http://localhost:3000; # 传递必要请求头,让Node.js能获取真实客户端信息 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; } # 处理API请求,转发到Django服务 location /api/ { proxy_pass http://localhost:8000; # 同样传递请求头给Django 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; # 注意:如果你的Django API本身没有/api前缀(比如路由是/users), # 想通过your-domain.com/api/users访问的话,要把proxy_pass改成: # proxy_pass http://localhost:8000/; (末尾加斜杠) # 这样Nginx会把/api/后面的部分直接传给Django,比如/api/users会转发到8000/users } }
2. 优化:用Nginx直接托管前端静态文件(推荐)
如果你的前端是React/Vue这类框架,已经打包成了静态文件(比如dist文件夹),完全不需要让Node.js服务一直运行——直接用Nginx托管静态文件性能更好、更稳定。
修改location /部分即可:
location / { root /path/to/your/frontend/dist; # 替换成你前端打包后的文件夹路径 try_files $uri $uri/ /index.html; # 单页应用必须加这个,处理前端路由跳转 }
这种情况下,你只需要保证Django后端运行在8000端口,前端静态文件由Nginx直接返回,效率会高很多。
3. 配置HTTPS(生产环境必备)
生产环境一定要用HTTPS,推荐用Let's Encrypt的免费证书:
- 安装certbot工具:
sudo apt install certbot python3-certbot-nginx - 自动获取证书并配置Nginx:
sudo certbot --nginx -d your-domain.com
执行完后,certbot会自动修改你的Nginx配置,添加HTTPS监听、证书路径,同时把HTTP请求重定向到HTTPS。
4. 验证配置并重启Nginx
配置完成后,先检查是否有语法错误:
sudo nginx -t
如果显示test is successful,就重启Nginx让配置生效:
sudo systemctl restart nginx
5. 额外注意事项
- 防火墙设置:确保服务器防火墙开放80和443端口,比如用ufw的话:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp - 服务守护:确保Node.js和Django服务在服务器重启后能自动运行:
- Node.js可以用
pm2:pm2 start your-frontend-app.js --name frontend,再执行pm2 startup设置开机自启。 - Django不要用
runserver(仅开发环境用),推荐用gunicorn配合systemd服务,或者uwsgi来托管。
- Node.js可以用
这样配置完成后,用户访问你的域名时,前端页面和API请求都会被Nginx正确代理到对应的服务啦!
内容的提问来源于stack exchange,提问作者Benjamin Smith Max




