1、配置示例1
要求: 在浏览器地址栏中输入www.123.com,跳转到Linux服务器中的tomcat主页面
声明:本次实验在我电脑的Linux虚拟机上进行,Linux系统信息如下:

图1 实验系统信息
1.1 准备工作
(1)安装nginx(参考:Nginx快速入门—基本概念以及在Linux上安装Nginx (2)启动一个tomcat(注意:在启动之前一定要配置好Java环境变量,参考:记一次在云服务器上部署项目的实践经历) (3)tomcat启动后在本地host文件中配置域名映射:
192.168.92.128 www.123.com
配置完成后在浏览器中输入www.123.com:8080 如果能看到tomcat的页面,就说明配置的没有问题。

图2 host配置测试
1.2 nginx配置反向代理
接下来我们来配置nginx,nginx一入门我们都知道在nginx的安装目录下的conf/nginx.conf是nginx的默认配置文件,因此打开它默认配置文件并简单配置如下内容(当然,你也可以使用nginx -c指定配置文件),简单配置如下:
server {
listen 80;
server_name 192.168.92.128; #server 代理域名
charset utf-8;
location / { #location / 通配所有请求路径
root html;
proxy_pass http://127.0.0.1:8080; #请求会转发到Linux系统的127.0.0.1:8080端口
index index.html index.htm;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
测试结果: 配置完成后重新加载配置文件后,直接访问www.123.com,如果可以看到tomcat的首页那就大功告成啦!

图2 nginx反向代理配置示例1测试
2、配置示例2
要求: 在浏览器地址栏中输入www.123.com/login,请求跳转到127.0.0.1:8080 在浏览器地址栏中输入www.123.com/user,请求跳转到127.0.0.1:8081
2.1 准备工作
启动两个tomcat,并在监听8080端口的tomcat的webapps目录下新建文件夹login以及文件index.html;在监听8081端口的tomcat的webapps目录下新建文件夹user以及文件index.html;
2.2 配置nginx
按照要求,nginx服务器要根据不同的请求路径把不同的请求转发到不同的tomcat中处理,这里就需要用到正则表达式来匹配路径,具体的配置如下:
server {
listen 80;
server_name 192.168.92.128;
charset utf-8;
location ~ /login { #正则表达式匹配login请求
root html;
proxy_pass http://127.0.0.1:8080; #forward to tomcat 8080
index index.html index.htm;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
location ~ /user{ #正则表达式匹配user请求
root html;
proxy_pass http://127.0.0.1:8081;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
error_page 404 /404.html;
}
测试结果:


图3 nginx反向代理配置示例2测试
3、location匹配规则详解
在上面的配置中使用到了正则匹配,nginx官方文档给出location语法如下:
location语法:location [=|~|~*|^~] /uri/ { … }
其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式。uri是待匹配的请求字符串,可以是不包含正则的字符串,这种模式被称为“标准的uri";也可以包含正则,这种模式被称为"正则uri",具体可用的标识符如下:
- **= ** :必须与指定的模式严格匹配,如果匹配成功就停止向下搜索,并立即处理代理逻辑
- ~:必须以指定模式开始,并且区分大小写
- ~* :必须以指定模式开始,并且不区分大小写
- **^~ **:前缀匹配,不支持正则,如果模式匹配,那么就停止搜索其他模式了。
- 无:普通匹配(最长字符匹配);与location顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。
备注: 1、如果uri里面包含正则表达式,就必须使用~或~*标识符; 2、针对~和~*匹配标识符,可以在前面加上!来取反,如下: * !~
表示正则不匹配,区分大小写。 * !~*
表示正则不匹配,不区分大小写。
3.1 精确匹配(=)示例
location = /login{
#严格匹配 /login(多一个字母少一个字母或多一级少一级路径都不行) ,匹配成功后,立即结束
}
3.2 区分大小写正则匹配(~)示例
location ~ /login/{
#正则匹配,区分大小写(/LOGIN/、、/Login/都是不可以的),匹配成功后,立即结束
}
3.3 不区分大小写正则匹配(~*)示例
location ~* /login/{
#正则匹配,不区分大小写(/LOGIN/、/Login/都是可以的),匹配成功后,立即结束
}
3.4 标准匹配(^~)示例
location ^~ /login/{
# 匹配任何以 /login/ 开头的地址,匹配符合以后,停止往下搜索正则
}
3.5 普通匹配(最长字符匹配)示例
location /login/{
# 与location顺序无关
# 若完全匹配成功,就不在继续匹配,否则还会进行正则匹配
}
4、location匹配优先级
1、如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。 2、普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。 3、正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)。 4、在location中,location /
可以匹配所有的请求,但是他的优先级是最低的。
总结匹配规则如下: (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /) 即 (精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)