nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路
前言:
nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便.
本文将简单讲述nginx的rewrite规则和原理, 同时讲解下如何借助rewrite实现单tomcat实例/多Web App服务 对应的多域名根目录访问.
案列目标:
首先来谈一下之前对于多Web App服务对应多域名根目录访问的方案.
注: 一个域名对应一个tomcat实例, 一个tomcat实例只包含一个webapp.
具体可见博文: "nginx+tomcat集群配置(1)---根目录设定和多后端分发配置" .
这种架构模式也是大公司推崇的方式, 毕竟大公司并不缺机器资源, 而且其有一个理直气壮的理由: 隔离和互不影响.
对于小公司/创业公司而言, 机器资源并不丰富, 倘若一个tomcat实例只部署一个web app, 多少有些浪费. 部署多个web app, 域名的映射关系又出了波澜, 因为tomcat中, webapp访问的uri需要添加应用名称. 这又不符合根目录访问的设定.
当然nginx强大的rewrite规则, 可以帮助我们解决该问题, 其最终达成效果的架构如下:
rewrite规则简述:
nginx的rewrite规则用于url的重写, 它和perl的正则表达一致.
rewrite的规则如下:
1 | rewrite regexp replacement [flag] |
flag标记取值如下:
1 2 3 4 | last :相当于Apache里德(L)标记,表示完成rewrite; break ;本条规则匹配完成后,终止匹配,不再匹配后面的规则 redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 |
注: last和break用来实现URL重写,浏览器地址栏URL地址不变
简单规则:
1 | rewrite ^ /search/ (.*)$ /search .php?q=$1; |
输入前的uri为:
1 | http: //website .com /search/some-search-keywords |
则重写后的uri为:
1 | http: //website .com /search .php?q=some-search-keywords |
具体可参考博客: "Nginx Rewrite规则初探". 这边不再具体阐述了.
location规则:
location语法:
1 | syntax: location [=|~|~*|^~|@] /uri/ { … } |
location涉及普通匹配和正规匹配两大块, 我们先来区分下
• 普通匹配
1 2 | = 精确匹配 ^~ 前缀匹配 |
注: 对于'^~', 和缺省的前缀匹配相比, 其一旦匹配, 则立即执行, 不会被后续的正则匹配所覆盖. 对于普通匹配, 则按最大前缀为准.
• 正则匹配
1 2 | ~ 区分大小写的正则匹配 ~* 不区分大小写的正则匹配 |
注: 正则匹配之前, 按编辑顺序来排定.
可具体参考博客: Nginx之location 匹配规则详解 .
着重里面的一句名言: 正则 location 匹配让步普通 location 的严格精确匹配结果;但覆盖普通 location 的最大前缀匹配结果.
实验部署:
比如你创建一个web app, 将其部署于tomcat(多应用)中去, 由于默认的规则, 需要在uri中, 添加工程名的前缀才能访问.
比如, 我们假定工程名为shopping, 给予其单独的域名: shopping.website.com.
那么默认的url需要shopping.website.com/shopping才能OK, 现在需要设定为shopping.website.com即可.
如何通过nginx的配置, 来达到我们的目的呢?
在nginx.conf配置中, 添加rewrite规则:
1 2 3 4 5 6 7 | if ( $uri !~ /shopping/ ) { rewrite ^(.*)$ /shopping/$1 last; } location /shopping/ { proxypass <<tomcat server>> } |
注意: rewrite可能会导致递归(nginx阻止了无限递归, 上限为10次).
简单的通过这个修改, 就实现了我们预定的目标.
• 额外的好处:
大家知道, ROOT工程是tomcat的后台管理服务, 按之前的做法, 会牺牲关闭该服务. 如果引入rewrite, 则可以保留该服务.
后记:
一直对nginx学得不够全面和系统, 今日借该实验来强化一下. 权当笔记, 与君共勉.
公众号&游戏站点:
个人微信公众号: 木目的H5游戏世界
个人游戏作品集站点(尚在建设中...): www.mmxfgame.com, 也可直接ip访问: http://120.26.221.54/.
posted on 2016-02-23 10:56 mumuxinfei 阅读(1465) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构