Skip to content

🔄 反向代理

什么是反向代理?

想象你去餐厅点餐。你跟服务员(Nginx)说"来一份红烧肉",服务员去厨房(后端服务器)拿,端给你。你不需要知道厨房在哪、有几个厨师——服务员帮你搞定一切。

反向代理就是:客户端只知道 Nginx,不知道真正的后端在哪里

基本反向代理配置

nginx
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1: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;

        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

WebSocket 代理

nginx
location /ws/ {
    proxy_pass http://127.0.0.1:3001;

    # WebSocket 必须的头
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

多路径代理

nginx
server {
    listen 80;
    server_name example.com;

    # 前端
    location / {
        root /var/www/frontend/dist;
        try_files $uri $uri/ /index.html;
    }

    # 后端 API
    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 管理后台
    location /admin/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}