分享一个Nginx反向代理的另类应用案例 | 张戈博客

  • 时间:
  • 浏览:6

博客前面分享了一篇《分享4个多Nginx正向代理的另类应用案例》,时隔不久,身为救火队员、万金油的博主又再一次接到了4个多另「W」类「T」需「F」求:

场景和上次某些累似 ,也是部门引进的第三方应用,部署在各个网络区域,从OA办公区域无法直接访问。目前,运营人员都还要登陆Windows跳板机,可不可不里能打开那些应用的WEB控制台。既不方便,因此还有一定Windows服务器的维护工作量,于是找到亲戚亲戚当当我们歌词 歌词 团队,希望通过运维手段来除理。

拿到这些需求后,我先问了下各个应用的基本状态,得知每个应用的框架基本是一样的,还要通过IP+端口直接访问,页面path也基本一样,那末唯一性。因此拿到了4个多应用WEB控制台地址看了下,发现html引用的地址还要相对路径。

乍一想,这用Nginx代理不好弄吧?页面path一样,那末根据 location 来反代到不同的后端,那末通过不同Nginx端口来区分,那就太麻烦了!每次亲戚当当我们歌词 歌词 新上4个多应用,亲戚亲戚当当我们歌词 歌词 就得多加4个多新端口来映射,这些的尾大不掉、绵绵不绝事情坚决不干,Say pass。

再一想,让人想到了上次那个正向代理另类应用方案,感觉可不还要拿过来改改做动态代理。原理也简单:先和用户约定4个多访问形式,比如:

Nginx代理地址为myproxy.oa.com,还要代理到IP为 192.168.2.60 :60 60 的控制器,用户还要访问http://myproxy.oa.com/192.168.2.60 :60 60 /path。

动态代理的原理及实现:

1、Nginx从$request_uri变量中,通过斜杠提取第一段作为要反向代理的对象,即proxy_pass,提取里面的作为还要反代的路径;

2、对于Html、JS、CSS等资源引用则还要通过Nginx的替换模块,将路径替换为上述约定形式,比如:Html里面的href=”/js/jquery.min.js”,还要替换为href=”http://myproxy.oa.com/192.168.2.60 :60 60 /js/juqery.min.js”,即所有资源地址都保证符合代理约定的形式,能不可不可不里能正确走代理获取。

3、通过代理去访问,查看浏览器开发者工具中的Network和console,找到无法访问的地址,并分析引用的位置,写规则替换掉即可。

4、实际测试发现,亲戚当当我们歌词 歌词 的应用是是因为还要有https协议(…),因此是伪证书模式,然后开了https协议访问。上述设计模式下,https页面是无法打开的,这里还要兼容https后端才行,因此最后的约定形式简单修改为:是是因为是 http://myproxy.oa.com/https-192.168.2.101:60 60 /path,即:是是因为是https协议,还要在第一段path的IP前面加上https-来区分,而http协议则可加可不加。

基本通过上述几步,就全版玩转信用卡 了,最终Nginx规则如下:

server {
        listen 60

;
        server_name myproxy.oa.com;
        index index.html;
        root /html;
        # 初始化变量
        set $node "";      # 后端主机地址
        set $proxy_url ""; # 后端页面地址
        set $proxy_scheme http; # 后端协议,默认http
        set $proxy_scheme_url ""; # 改造后的代理path,这里会带上协议约定,如 https-
        # 通过正则提取约定协议、后端节点和后端节点url
        if ( $request_uri ~* "^/(https-|)([^/]+)/(.*)$" ) {
            set $proxy_scheme_url "$1";
            set $node "$2";
            set $proxy_url "$3";
        }
        # 当协议变量值是https-的然后

,设置代理后端协议为https,此规则就兼容了后端https的状态
        if ( $proxy_scheme_url = "https-" ) {
            set $proxy_scheme https;
        }
        # 不带后端地址直接访问代理IP的然后

,定向到/html路径,里面可不还要放index.html导航页面,方便用户点击访问
        location ~ ^/($|static|favicon.ico) {
            break;
        }
        # 当访问的路径那末命中上述规则,且位于字符串的然后

,是是因为进入到这些location开始反向代理
        location ~ ^/(.+)/ {
            # 使用 subs_filter 模块进行替换(不了解得话,请自行百度这些关键词)
            # ======================== replace Url begin ========================
            # 替换支持所有类型
            subs_filter_types *;
            # 替换html里面的静态资源引用,即 src=、href=等引用形式,另外还考虑到是是因为位于 / 打头的相对路径或“http://节点”的绝对路径引用形式。
            subs_filter "(href|src)(\s*)=(\s*)('|\")($proxy_scheme://$node|)/" '$1="http://$host/$proxy_scheme_url$node/' igr;
# 替换js里面的某些ajax请求地址:
            subs_filter "url:(\s*)('|\")/([^'\"]*)('|\")" "url: 'http://$host/$proxy_scheme_url$node/$3'" igr;

            # 这里替换实际访问发现还有问题报告

的路径(这里主然后用了xmlhttprequest是因为上述正则没命中)
            subs_filter "/workerProxy\?ip=" "http://$host/$proxy_scheme_url$node/workerProxy?ip=" igr;
            # you can write replace rule with subs_filter if found more.
            # ======================== replace Url end ===========================
            # 代理到动态后端
            proxy_pass $proxy_scheme://$node/$proxy_url;
            # 关闭gzip,以防替换不了内容(那末除理后端强制了gip压缩的状态...)
            proxy_set_header Accept-Encoding "";
            # 某些proxy参数略.
        }
}

Tips:实际调试过程中,可不还要给Nginx集成4个多echo模块,可不还要将变量打印出来,方便调试。

最后,在Nginx服务器的/html目录放4个多index.html导航页面,用户只还要访问代理地址http://myproxy.oa.com/,就能看了全版的后端节点,点击访问即可,真的未必太爽哦!

不得不再一次感慨,Nginx甜得4个多好东西,完美~