一层反代

常见于应用后端和提供HTTP的服务器不是同一个,例如A服务器运行一个java应用监听8888且只允许内网访问,B服务器提供80端口公网访问

服务器B

server {
    listen                     80;
    charset                    utf-8;
    server_name                b.server.com

    location / {
        proxy_pass        http://a.server.com:8888;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

此时大多数情况下 $header[“X-Real-IP”] 就是终端用户的IP地址了

二层反代

常见于应用后端和提供HTTP的服务器不是同一个,并且有另外一个统一的过滤服务器,过滤无效请求后再转发到HTTP服务器,例如A服务器运行一个java应用监听8888内网访问,B服务器8080内网访问,C服务器监听80公网访问

服务器B

server {
    listen                     8080;
    charset                    utf-8;
    server_name                b.server.com

    location / {
        proxy_pass        http://a.server.com:8888;
        proxy_set_header  X-Real-IP $http_x_real_ip;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

服务器C

server {
    listen                     80;
    charset                    utf-8;
    server_name                c.server.com

    location / {
        proxy_pass        http://b.server.com:8080;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

一层反代 + 云锁

常见于应用后端和提供HTTP的服务器不是同一个,例如A服务器运行一个java应用监听8888且只允许内网访问,B服务器提供80端口公网访问,同时B服务器上装了云锁作为过滤

云锁会劫持B服务器上的HTTP请求到它的处理程序,处理完后再转发到B服务器的80端口,此时其实和二层反代的逻辑差不多

服务器B

server {
    listen                     80;
    server_name                b.server.com;
    charset                    utf-8;

    location / {
        proxy_pass        http://a.server.com:8888;
        proxy_set_header  X-Real-IP $http_x_real_ip;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}