Nginx配置实例—反向代理

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",具体可用的标识符如下:

  1. **= ** :必须与指定的模式严格匹配,如果匹配成功就停止向下搜索,并立即处理代理逻辑
  2. ~:必须以指定模式开始,并且区分大小写
  3. ~* :必须以指定模式开始,并且不区分大小写
  4. **^~ **:前缀匹配,不支持正则,如果模式匹配,那么就停止搜索其他模式了。
  5. :普通匹配(最长字符匹配);与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通配)

留言区

还能输入500个字符