反向代理(reverse proxy)指的是代理外网用户的请求到内部的指定服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。Nginx既可以做高性能的web服务器,又能做反向代理服务器,无论自身是否具备用户的请求,都可以将请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范。
此次实验,笔者准备了四台主机,一台作为Nginx服务器,取名nginx-server,上面部署网站对应的域名为www.johnnyfang.com;两台作为后端Apache服务器,取名web-server1和web-server2,分别接收用户访问Nginx服务器web网站中下的download和products两条path上的用户请求;一台作为客户端,取名client。
- Nginx服务器设置
1.1 配置文件
Nginx服务器部分,笔者依旧采用源码编译方式安装1.18版本的Nginx服务,具体过程请见上篇内容,笔者就不再演示了,站点对应的域名为www.johnnyfang.com,站点对应的数据目录为/data/nginx/html/web。
1.2 web站点目录规划
按照规划,用户发送至www.johnnyfang.com/download/的请求将转发至ip为10.0.0.18的web-server1,用户发送至www.johnnyfang.com/products/的请求将转发至ip为10.0.0.28的web-server2,为了看到效果,笔者在Nginx服务器上创建对应的目录并多加一个news目录,并生成三条path的首页,与后端Apache服务器web页面相区分。
1.3 客户端访问
此时客户端修改/etc/hosts文件后去访问时,主页、download、products和news的主页都在10.0.0.8的主机上,即Nginx服务器上。
- Apache服务器设置
笔者就不单独编译安装Apache了,直接通过yum方式安装并启动Apache服务,并在后端两个web服务器的默认主页显示各自ip。
- Nginx实现不同path的反向代理
Nginx要想实现不同path的反向代理,需要用到proxy_pass这一参数。proxy_pass参数可以⽤来设置将客户端请求转发给的后端服务器的主机,可以是<hostname>、<ipaddress:port>的⽅式,也可以代理到预先设置的主机群组(需要ngx_http_upstream_module模块⽀持)。结合此次实验,直接跟上主机名或者ip+端口的形式即可,因为都是走的默认80端口,端口号也可以省去。
- 测试环节
此时客户端再去访问站点主页面、download页面、products页面和news页面时,可以看到指定的两条path已经通过Nginx反向代理,将用户请求转发到后端Apache服务器了。
- 其他事项
5.1 端口号后是否加/
在上面的配置中,笔者在利用proxy_pass参数做反向代理时,后端Apache服务器的端口号后加了/,这就相当于alias,它会把访问的路径重新定义到其指定的路径,即访问www.johnnyfang.com/download/或者www.johnnyfang.com/products/的请求直接转发到后端服务器的网站根目录下去寻找主页。如果取消了/,则相当于去后端服务器的网站根目录下的/download/目录或者/products/目录下去寻找默认主页。例如笔者这边取消了配置文件中的/,此时客户端再去访问时会报404错误,提示无法找到主页。
如果是想要取消/,并能成功将用户请求转发出去,需要后端Apache服务器在网站对应的目录结构上与Nginx服务器保持一致。
此时客户端再去访问时,已经能成功转发至后端Apache服务器,并将web页面内容返回给客户端。
5.2 客户端ip透传
Nginx作为代理服务器时,默认情况下客户端访问后端服务器后,后端服务器是只能看到代理服务器的ip,而无法查看到客户端真实ip。
要想让后端Apache服务器能查看到客户端真实ip,可以在Nginx服务器的对应站点配置文件中添加proxy_set_header参数,proxy_set_header参数可以和变量$remote_addr或者$proxy_add_x_forwarded_for相结合,实现客户端的真实ip透传。
只在Nginx添加该参数依旧无法实现客户端真实ip的透传,还需要后端Apache服务器在配置文件添加对应的头部字段信息,添加完毕重启Apache服务。
此时客户端再去访问转发到后端Apache服务器的path时,后端Apache服务器通过访问日志已经能查看到客户端的真实ip。