文章目录

  • 问题描述
  • 解决方案
    • sub_filter方案
    • 使用重定向
    • 单独域名访问

问题描述

现在的企业服务,往往不是单体的,同时可能涉及中间件的访问如dubbo、solr、mq等。对于中间件的监控页面访问,如果直接暴露在公网,肯定这安全。需发对中间件访问进行安全加固,方法主要有:
(1)限制使用IP白名单访问。
(2)安全密码访问,不使用简单密码,对于没有密码的,可以使用basic认证,强密码访问。
(3)屏蔽端口,通过nginx代理,减少端暴露。

本文要讲的是(3)使用nginx代理,中间可能遇到的问题。

nginx反向代理,可以配置location代理不同的服务,这里就涉及到context-path。如果代理服务本来就不是通过“http://ip:端口/”访问的,而是通过“http://ip:端口/contextpath”访问的,就不会有问题。如果服务不支持“http://ip:端口/contextpath”访问,就涉及“/”路径的问题。

location /activemq/ {proxy_pass http://192.168.17.19:8161/;
}

如上代码,location activemq经反向代理后,访问的实际是8161端口下面的activemq路径,而8161端口"/activemq"下没有内容,就会返回404。当然如果只是代理一个服务是没有问题的(可以用“/”location做反向代理),代理多个服务就需要多个location,必然出现问题。

解决方案

经研究和网上查询,nginx反向代理的contextpath问题(contextPath是java servlet的说法,一般就是指http://example.com/aaa/bbb/ccc.html里/aaa这个字段。)主要解决思路如下:
首先,研究服务能不能通过context-path提供。如jetty服务是否支持配置contextpath,如是war考虑部署到tomcat的contextpath访问。
如果实在不能提供contextpath部署访问,解决方案主要有:

sub_filter方案

使用nginx在jenkins返回的所有资源链接前面都加上/jenkins字段,这样用户接下来产生的GET请求都可以map到location /jenkins区块。要实现这个功能需要用到nginx的ngx_http_sub_module。参考Example,可以写出类似配置:

location /jenkins {sub_filter '<a href="/'  '<a href="/jenkins/';sub_filter '<img src="/' '<img src="/jenkins/';# ...其他替换规则...sub_filter_once off;  # 查找并替换多次proxy_pass http://localhost:8002;
}

案例因特殊情况,使用了这种配置(公供参考):

        #mqlocation /activemq/ {sub_filter '<a href="/'  '<a href="/activemq/';sub_filter '<a title="Manage ActiveMQ broker" href="/admin/'  '<a href="/activemq/admin/';sub_filter '<a title="See some Web demos" href="/demo/'  '<a href="/activemq/demo/';sub_filter '<img src="/' '<img src="/activemq/';sub_filter '<script src="/' '<script src="/activemq/';sub_filter "type='text/javascript' src='/" "type='text/javascript' src='/activemq/";sub_filter '<link href="/' '<link href="/activemq/';sub_filter 'url(/' 'url(/activemq/';sub_filter "@import url('/" "@import url('/activemq/";sub_filter_once off;  # 查找并替换多次proxy_pass http://192.168.7.19:8161/;allow 219.143.147.82;#访问控制allow 220.160.125.218;#访问控制allow 36.110.62.178;# allow for sslvpn accessallow 36.110.218.132;allow 112.48.19.106;deny all;}#solrlocation /solr/ {proxy_pass http://192.168.17.18:8983/solr/;allow 219.143.147.82;#访问控制allow 220.160.125.218;#访问控制allow 36.110.62.178;# allow for sslvpn accessallow 36.110.218.132;allow 112.48.19.106;deny all;}#dubbo-adminlocation /dubbo-admin/ {proxy_pass http://192.168.17.20:8090/dubbo-admin/;allow 219.143.147.82;#访问控制allow 220.160.125.218;#访问控制allow 36.110.62.178;# allow for sslvpn accessallow 36.110.218.132;allow 112.48.19.106;deny all;}#dubbo-monitorlocation /dubbo-monitor/ {sub_filter '<a href="/'  '<a href="/dubbo-monitor/';sub_filter '<img src="/' '<img src="/dubbo-monitor/';#sub_filter_once off;  # 查找并替换多次proxy_pass http://192.168.17.21:8081/;allow 219.143.147.82;#访问控制allow 220.160.125.218;#访问控制allow 36.110.62.178;# allow for sslvpn accessallow 36.110.218.132;allow 112.48.19.106;deny all;}

但是这样做效率很低、且filter遗漏和出错可能性大(比如=>其他2)。

使用重定向

location /activemq/ {return 302 http://www.domain.com:8161/;
}

这样做的前提是开通8002的端口映射,还是涉及端口暴露问题。

单独域名访问

如果条件允许的话,应该是分配一个子域名(子域名都是单独的公网IP),比如activemq.domain.com会更合理和方便。nginx同一80端口,支持多域名监听配置。

配置参考

server {listen       443;server_name  activemq.domain.com;add_header X-Frame-Options SAMEORIGIN;#rewrite ^(.*)$ http://${server_name}$1 permanent;ssl on;ssl_certificate /etc/nginx/sslkey/_.XXX.com_bundle.crt;ssl_certificate_key /etc/nginx/sslkey/XXX.com.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;ssl_prefer_server_ciphers on;add_header X-Via nginx;#static pathlocation / {proxy_pass http://192.168.17.19:8161/;}}

臭味相投的朋友们,我在这里:
猿in小站:http://www.yuanin.net
csdn博客:https://blog.csdn.net/jiabeis
简书:https://www.jianshu.com/u/4cb7d664ec4b
微信免费订阅号“猿in”

参考:https://blog.csdn.net/silvita/article/details/72781266

nginx反向代理服务contextpath的问题解决相关推荐

  1. Nginx反向代理服务

    Nginx反向代理服务 一.代理服务器 1.什么是代理服务器 2 .什么是正向代理服务器 3.什么是反向服务器 二.反向代理有什么好处 1.具有防火墙的作用 2.负载均衡 2.1upstream模块 ...

  2. nginx反向代理nexus私服

    没有更新博客经常博客已经很长时间了,记得刚毕业的时候经常试着写或者抄写记录一些好的博文.进步是由于有了分享和记录,从今天开始恢复心态开始勤奋的学习,把学习的点滴记录到博客中.希望得到大家的指点和大家一 ...

  3. 容器化单页面应用中Nginx反向代理与Kubernetes部署

    在<容器化单页面应用中RESTful API的访问>一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例.这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景: ...

  4. Nginx反向代理的配置

    一.引言 最近搞个服务器,然后部署了个人网站,以及一些服务供自己玩耍,其中Nginx最让我很难受,配置总是要现用现百度.所以,我来了,咳咳,我带来了一些​常用的配置.​需要有 Linux 和 Ngin ...

  5. nginx 反向代理及负载均衡策略

    正向代理:代理服务器对客户端的进行代理 反向代理:代理服务器对http服务器做代理 代理服务 先用社会生活中我们常见的场景解释一下代理: 租房代理 or 中介 很多有房人士想将自己闲置的房子出租,但是 ...

  6. Nginx反向代理与负载均衡应用实践

    本链接转载自:https://www.cnblogs.com/chensiqiqi/p/9162926.html 仅供自学使用. 1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机, ...

  7. nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决

    nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决 参考文章: (1)nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题 ...

  8. Nginx 反向代理解决跨域问题

    目录 前言 Nginx 反向代理常用配置 Server location proxy_pass add_header OPTIONS 请求 proxy_set_header 跨域的 cookie 传输 ...

  9. nginx反向代理原理讲解

    一 .概述                  反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果 ...

最新文章

  1. 利用Cache,asp.net 简单实现定时执行任务
  2. java多线程实现电梯_面对对象第二单元总结 - 电梯(java多线程)
  3. Java集合篇:集合类介绍
  4. Android UI开发第二篇——多级列表(ExpandableListView)
  5. 简单的动画函数封装(1)
  6. 聊聊安卓折叠屏给交互设计和开发带来的变化
  7. 拳王虚拟项目公社:如何搭建虚拟资源解析站,全自动化卖会员网络赚钱项目
  8. 【RQNOJ86】智捅马蜂窝【最短路】
  9. vue中点击打开新的页面window.open()
  10. 微信小程序如何搭建自己的后台(超详细,超完整)(上线必备)!!!
  11. godaddy无法修改域名服务器,GoDaddy域名修改DNS设置方法
  12. Netty和Tomcat有什么区别
  13. FPGA内部资源结构——以Altera CycloneⅣ 为例
  14. 六一儿童节带娃旅游,在曼谷玩哪些景点超好玩?
  15. 微软晓晓朗读录音工具windows-文字转语音
  16. 万年历、黄历,获取每日的宜忌、五行、冲煞、值神、彭祖百忌、吉神宜趋、今日胎神、凶神宜忌、二十八星宿、建除十二神
  17. 风之语.至贱城市之成都
  18. Pytest框架系列——配置文件Pytest.ini
  19. php 统计网站流量
  20. 【Machine Learning】机器学习之一些数学相关的知识储备

热门文章

  1. 基础爬虫系列课程授课内容3——xpath语法
  2. zabbix监控gpu
  3. 上证B指重上150点
  4. 任正非讲的20个小故事——华为大管理的灵魂
  5. android打造独一无二的loading动画效果
  6. java integer 不变模式_多线程编程的设计模式 不变模式(zt)
  7. 内网和外网之间的通信(端口映射原理)
  8. 卷积公式和分布函数去解决Z=X+Y,Z=XY,Z=Y/X等Z的概率密度函数以及如何确定他们的范围
  9. 当人感觉心痛的时候,身体到底发生了什么?
  10. 创新的S2B2B电商系统网站解决方案:为家居用品行业带来更多商机