用本地自定义域名访问远程服务器,并支持websocket和cookie

场景

在公司会有很多测试的机器,或者一些OA服务,Confluence,Jenkins,各种中间件的后台等等,都使用HTTP访问,且由于是内网机器没有域名,输入IP又要输入不同端口,访问起来比较麻烦。

解决方案

使用本地Nginx,并配置 C:\Windows\System32\drivers\etc\hosts(/etc/hosts Linux/MacOS.)

目标

  1. 支持Cookie会话转发
  2. 支持Websocket会话
  3. 支持301等重定向,redirect

以上三点具备之后,可以说基本上覆盖100%的web功能开发了。

行动方案

server {
        listen                   80;
        server_name              some.company-inc.com;
        #charset                 koi8-r;

        error_page               500 502 503 504 /50x.html;
        location = /50x.html {
            root                    html;
        }

        location ~ /microservices/api/ws {
            proxy_http_version 1.1;
            proxy_pass http://10.11.11.11:8084;
            proxy_redirect   default;
            proxy_cookie_domain ~\.?10.11.11.11 some.company-inc.com;
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade"; 
            proxy_read_timeout 600s;
            proxy_connect_timeout 600s;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Origin "";
            proxy_buffering on;
            proxy_send_timeout 300s;
            client_max_body_size 2048M;
        }

        location / {
            proxy_pass http://10.11.11.11:8084;
            proxy_redirect   http://some.company-inc.com:8084/    /;
            proxy_cookie_domain ~\.?10.11.11.11 some.company-inc.com;
            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_connect_timeout 600s;
            proxy_send_timeout 300s;
            proxy_read_timeout 300s;
            client_max_body_size 2048m;
        }

    }

以上配置经过验证。

需要说明的事项

A. websocket和普通http代理的不同就是,前者需要这个三项:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; 

且Websocket是长时间保持的连接,因此需要延长会话时间,否则会被Nginx提前断开:

proxy_connect_timeout 600s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;

B. Cookie基于域名,因此目标机器发布的Cookie,需要修改为你本地自定义域名:

proxy_cookie_domain ~\.?10.11.11.11 some.company-inc.com;

本例中,目标机器地址为10.11.11.11,本地浏览器中输入的域名为some.company-inc.com。这样因访问浏览器,服务端写到本地浏览器时,Cookie就会正确被浏览器接受。
另一方面,浏览器发起请求时附带的Cookie,将会被Nginx代理转换为实际的目标机器的Cookie,Domain会被还原成10.11.11.11。

C. 当服务器发出301这样的重定向请求时,Location字段需要经过处理,否则浏览器会转发到错误的地址。

proxy_redirect   http://some.company-inc.com:8084/    /;

如果不加上述配置,当收到Redirect请求时,如果我没有记错,浏览器会访问诸如 http://some.company-inc.com/10.11.11.11:8084/xxxxxxx 这样的地址。

D. 以下配置是解决可能遇到的跨域问题,如果遇到JS请求出现的CORS相关的错误时,可能需要这个配置。

proxy_set_header Origin ""; 
posted @ 2020-01-06 16:12  一杯半盏  阅读(976)  评论(0编辑  收藏  举报