nginx反向代理服务contextpath的问题解决

nginx反向代理服务contextpath的问题解决文章目录问题描述解决方案 sub filter 方案使用重定向单独域名访问问题描述现在的企业服务 往往不是单体的 同时可能涉及中间件的访问如 dubbo solr mq 等 对于中间件的监控页面访问 如果直接暴露在公网 肯定这安全 需发对中间件访问进行安全加固 方法主要有 1 限制使用 IP 白名单访问 2 安全密码访问 不使用简单密码 对于没有密码的 可以使用 basic 认证 强密码访问 3

问题描述

本文要讲的是(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,必然出现问题。

解决方案

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; } 

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

 #mq location /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 access allow 36.110.218.132; allow 112.48.19.106; deny all; } #solr location /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 access allow 36.110.218.132; allow 112.48.19.106; deny all; } #dubbo-admin location /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 access allow 36.110.218.132; allow 112.48.19.106; deny all; } #dubbo-monitor location /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 access allow 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 path location / { 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”
猿in




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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233537.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PAT乙级题库

    PAT乙级题库1001害死人不偿命的(3n+1)猜想(15分)1002写出这个数(20分)1004成绩排名(20分)1006换个格式输出整数(15分)1007素数对猜想(20分)1008数组元素循环右移问题(20分)1011A+B和C(15分)1012数字分类(20分)1013数素数(20分)1016部分A+B(1…

    2022年5月25日
    59
  • 关于getClass().getClassLoader()

    关于getClass().getClassLoader()InputStream  is  =  getClass().getClassLoader().getResourceAsStream(“helloworld.properties”);中getClass()和getClassLoader()都是什么意思呀.getClass():取得当前对象所属的Class对象  getClassLoader():取得该Class对象的类装载器类装载器

    2022年4月29日
    31
  • SQL索引优缺点

    SQL索引优缺点前两篇文章我总结了一些SQL数据库索引的问题,这篇主要来分析下索引的优缼点,以及如何正确使用索引。索引的优点:这个显而易见,正确的索引会大大提高数据查询,对结果进行排序、分组的操作效率。索引的缺点:优点显而易见,同样缺点也是显而易见:1:创建索引需要额外的磁盘空间,索引最大一般为表大小的1.2倍左右。2:在表数据修改时,例如增加,删除,更新,都需要维护索引表,这是需要系统开销的

    2022年5月26日
    54
  • ssm整合RabbitMQ(一)「建议收藏」

    ssm整合RabbitMQ(一)「建议收藏」首先说一下RabbitMQ的配置安装好RabbitMQServer之后访问http://localhost:15672/开始首先在Admintab选项中新建一个vh,这个Name需要在后期的代码配置中用到。之后需要给该VH配置一个权限然后配置交换选择Exchangestab将Exchanges与刚才建立的VH绑定然后命名一个交换名字,这个名字在后期的…

    2022年5月23日
    37
  • GitHub还是GitLab?谈谈两者的区别

    GitHub还是GitLab?谈谈两者的区别开发人员在开发编程项目时可能会面临这样一个问题,GitHub和GitLab各有优缺点,用哪一个更好呢?那么今天我们就来简单介绍一下GitHub和GitLab并谈谈它们各自的优势和短板。您真的需要用到分布式版本控制系统吗?VCS又名源代码管理(SCM)系统,旨在让开发人员、设计人员同时开发一个项目。它能够确保每个人都可以访问最新代码,并同步自己的修改。然而,这说起来容易做起来难。为了实现这一点,Linux之父LinusTorvalds发明了免费的开源分布式版本控制系统Git。Git的表现要比Ap

    2025年7月31日
    3
  • 奔图打印机官网驱动_施乐105P一样的打印机

    奔图打印机官网驱动_施乐105P一样的打印机奔图P3060DW打印机驱动带给大家官方最新驱动程序,这款打印机十分小巧功能却很全面,高速双面黑白激光打印机可以满足大家日常的工作及其它需求,驱动程序非常必要,成功安装后方可使用打印机。奔图P3060DW打印机参数:型号P3060DW打印参数打印速度30ppm(A4)32ppm(Letter)首页打印时间≤8.5秒最大月打印量25000页建议月打印量250页到3000页分辨率(dpi)最大12…

    2022年8月30日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号