每日一学之Nginx系列NO.5反向代理

Posted 进击的Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一学之Nginx系列NO.5反向代理相关的知识,希望对你有一定的参考价值。


每日一学之Nginx系列NO.5反向代理

图片来自于百度图片


在上一篇公众文中已经介绍了什么是反向代理,以及反向代理服务器所担任的角色。今天我们就来试着配一下nginx的反向代理服务。


Tomcat服务器


首先,反向代理服务器是为最终的服务器而服务,因此我们先利用Tomcat发布一个测试网站,路径为 localhost:8080/sessiontest/index.jsp

每日一学之Nginx系列NO.5反向代理

注意:我们的tomcat配置的是8080端口,而Nginx是80端口


Nginx服务器


配置nginx.conf文件,在locaton下加入下面的配置项

location / {
   proxy_redirect off;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_pass http://localhost:8080/sessiontest/index.jsp;
}


在浏览器输入localhost,访问nginx服务器,成功显示为Tomcat服务器中的项目的首页

每日一学之Nginx系列NO.5反向代理


在实际的项目当中我们不可能只有一个页面,那这个时候我们应该怎么办?其实很简单,同前面Nginx基础知识是一样的道理,请看下面的配置

 location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:8080/sessiontest/;
}


注意:在sessiontest后面一定要加上斜杠哦。当我们输入localhost/index.jsp,其实实际访问的路径为 ($proxy_pass)index.jsp;因此要求在sessiontest后面加上斜杠。


名词解释


名词
作用
实例
proxy_pass 实际访问的URL路径 上例中的tomcat中发布的项目的实际路径
proxy_redirect 修改从被代理服务器传来的应答头中的"Location"和"Refresh"字段

假设被代理服务器返回

Location字段为:

http://localhost:8000/two/some/uri/
使用proxy_redirect: 
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
将Location字段重写为http://frontend/one/some/uri/。
注意:在代替的字段中可以不写服务器名

proxy_set_header 设置自定义header,通过request.getAttribute() 获取

X-real-ip $remote_addrP:

这句话之前已经解释过,有了这句就可以在web服务器端获得用户的真实ip但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。


X-Forwarded-For $proxy_add_x_forwarded_for:


 X-Forwarded-For $proxy_add_x_forwarded_for:

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip


下期提要


下期主要介绍利用Nginx的反向代理实现负载均衡。




以上是关于每日一学之Nginx系列NO.5反向代理的主要内容,如果未能解决你的问题,请参考以下文章

每日一学:啥是反向代理

每日一学之Android数据存储SQLite数据库

每日一学之Java开发技巧正则表达式

PHP使用Nginx实现反向代理,学一学吧

Nginx+lua+openresty系列 | 第三篇:nginx反向代理

Nginx系列教程| 一文带你读懂Nginx的正向与反向代理