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


    场景

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

    解决方案

    使用本地Nginx,并配置 C:WindowsSystem32driversetchosts(/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 ""; 
    
  • 相关阅读:
    个人作业——软件产品案例分析
    软件工程结对作业二
    软件工程团队展示
    软件工程第三次作业
    软件工程实践第二次作业
    软件工程实践第一次作业
    第八次课程作业
    第五次课程作业
    第四次课程作业
    wind本地MySQL数据到hive的指定路径
  • 原文地址:https://www.cnblogs.com/slankka/p/12156874.html
Copyright © 2020-2023  润新知