You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

生产部署:如何配置Nginx作为Node.js与Django的反向代理

同时代理Node.js前端和Django后端的Nginx配置方案

没问题,这其实是生产环境里非常常见的场景——用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的免费证书:

  1. 安装certbot工具:sudo apt install certbot python3-certbot-nginx
  2. 自动获取证书并配置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可以用pm2pm2 start your-frontend-app.js --name frontend,再执行pm2 startup设置开机自启。
    • Django不要用runserver(仅开发环境用),推荐用gunicorn配合systemd服务,或者uwsgi来托管。

这样配置完成后,用户访问你的域名时,前端页面和API请求都会被Nginx正确代理到对应的服务啦!

内容的提问来源于stack exchange,提问作者Benjamin Smith Max

火山引擎 最新活动