Nginx根据来源IP不同反代至不同网站

1.Nginx反向代理

反向代理,通过请求转发,以一个中间人的姿态来帮助用户访问某个后端服务器中的资源。通过反向代理,可以隐藏后端服务器的信息。Nginx本身就具有这个功能,只需要对配置文件进行一定的修改即可。并且,这个神奇的配置文件支持一定程度的编程,因此可以实现一些特定的奇怪需求。

2.Nginx实现根据来源IP不同代理至不同的网站

以下配置文件实现了根据来源IP不同,将请求转发至不同的Docker容器中,具体实现步骤为:

  • 1.为每第i个用户建立一个docker容器,并将需要访问的端口映射到127.0.0.1的8000+i端口
  • 2.将每个用户的IP绑定在一个网段,例如192.168.1.i
  • 3.在配置文件中,匹配来源ip中的i,并转发至127.0.0.1的8000+i号端口
server {
    listen       80;
    server_name  localhost;

    large_client_header_buffers 4 16k;
    client_max_body_size 300m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    location /{
        proxy_set_header   Host    $host:$server_port;
        proxy_set_header   X-Real-IP   $remote_addr; 
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size    10m;
        if ($remote_addr ~ "192\.168\.101\.([0-9]{3})"){
            set $docker_container_port $1;
                        set $docker_container_addr "http://127.0.0.1:8${docker_container_port}";
                        proxy_pass $docker_container_addr;
            break;
        }
        if ($remote_addr ~ "192\.168\.101\.([0-9]{2})"){
                        set $docker_container_port $1;
                        set $docker_container_addr "http://127.0.0.1:80${docker_container_port}";
                        proxy_pass $docker_container_addr;
                        break;
                }
        if ($remote_addr ~ "192\.168\.101\.([0-9]{1})"){
                        set $docker_container_port $1;
                        set $docker_container_addr "http://127.0.0.1:800${docker_container_port}";
                        proxy_pass $docker_container_addr;
                        break;
                }
    }
}