zoukankan      html  css  js  c++  java
  • 用本地自定义域名访问远程服务器,并支持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 ""; 
    
  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/slankka/p/12156874.html
Copyright © 2011-2022 走看看