反向代理(reverse proxy)指的是代理外网用户的请求到内部的指定服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。Nginx既可以做高性能的web服务器,又能做反向代理服务器,无论自身是否具备用户的请求,都可以将请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范。

    此次实验,笔者准备了四台主机,一台作为Nginx服务器,取名nginx-server,上面部署网站对应的域名为www.johnnyfang.com;两台作为后端Apache服务器,取名web-server1和web-server2,分别接收用户访问Nginx服务器web网站中下的download和products两条path上的用户请求;一台作为客户端,取名client。

  1. Nginx服务器设置

1.1 配置文件

    Nginx服务器部分,笔者依旧采用源码编译方式安装1.18版本的Nginx服务,具体过程请见上篇内容,笔者就不再演示了,站点对应的域名为www.johnnyfang.com,站点对应的数据目录为/data/nginx/html/web。

配置Nginx通过不同path反代至不同后端Apache服务器_服务器

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页面相区分。

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_02

1.3 客户端访问

    此时客户端修改/etc/hosts文件后去访问时,主页、download、products和news的主页都在10.0.0.8的主机上,即Nginx服务器上。

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_03


  1. Apache服务器设置

    笔者就不单独编译安装Apache了,直接通过yum方式安装并启动Apache服务,并在后端两个web服务器的默认主页显示各自ip。

配置Nginx通过不同path反代至不同后端Apache服务器_apache_04

配置Nginx通过不同path反代至不同后端Apache服务器_apache_05


  1. Nginx实现不同path的反向代理

    Nginx要想实现不同path的反向代理,需要用到proxy_pass这一参数。proxy_pass参数可以⽤来设置将客户端请求转发给的后端服务器的主机,可以是<hostname>、<ipaddress:port>的⽅式,也可以代理到预先设置的主机群组(需要ngx_http_upstream_module模块⽀持)。结合此次实验,直接跟上主机名或者ip+端口的形式即可,因为都是走的默认80端口,端口号也可以省去。

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_06


  1. 测试环节

    此时客户端再去访问站点主页面、download页面、products页面和news页面时,可以看到指定的两条path已经通过Nginx反向代理,将用户请求转发到后端Apache服务器了。

配置Nginx通过不同path反代至不同后端Apache服务器_apache_07


  1. 其他事项

5.1 端口号后是否加/

    在上面的配置中,笔者在利用proxy_pass参数做反向代理时,后端Apache服务器的端口号后加了/,这就相当于alias,它会把访问的路径重新定义到其指定的路径,即访问www.johnnyfang.com/download/或者www.johnnyfang.com/products/的请求直接转发到后端服务器的网站根目录下去寻找主页。如果取消了/,则相当于去后端服务器的网站根目录下的/download/目录或者/products/目录下去寻找默认主页。例如笔者这边取消了配置文件中的/,此时客户端再去访问时会报404错误,提示无法找到主页。

配置Nginx通过不同path反代至不同后端Apache服务器_apache_08

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_09

    如果是想要取消/,并能成功将用户请求转发出去,需要后端Apache服务器在网站对应的目录结构上与Nginx服务器保持一致。

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_10

配置Nginx通过不同path反代至不同后端Apache服务器_客户端_11

    此时客户端再去访问时,已经能成功转发至后端Apache服务器,并将web页面内容返回给客户端。

配置Nginx通过不同path反代至不同后端Apache服务器_客户端_12

5.2 客户端ip透传

    Nginx作为代理服务器时,默认情况下客户端访问后端服务器后,后端服务器是只能看到代理服务器的ip,而无法查看到客户端真实ip。

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_13

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_14

    要想让后端Apache服务器能查看到客户端真实ip,可以在Nginx服务器的对应站点配置文件中添加proxy_set_header参数,proxy_set_header参数可以和变量$remote_addr或者$proxy_add_x_forwarded_for相结合,实现客户端的真实ip透传。

配置Nginx通过不同path反代至不同后端Apache服务器_apache_15

    只在Nginx添加该参数依旧无法实现客户端真实ip的透传,还需要后端Apache服务器在配置文件添加对应的头部字段信息,添加完毕重启Apache服务。

配置Nginx通过不同path反代至不同后端Apache服务器_apache_16

配置Nginx通过不同path反代至不同后端Apache服务器_客户端_17

    此时客户端再去访问转发到后端Apache服务器的path时,后端Apache服务器通过访问日志已经能查看到客户端的真实ip。

配置Nginx通过不同path反代至不同后端Apache服务器_客户端_18

配置Nginx通过不同path反代至不同后端Apache服务器_服务器_19

配置Nginx通过不同path反代至不同后端Apache服务器_apache_20