反向代理指的是用代理服务器来响应客户端的请求,然后根据一定的调度算法将请求发送到后端服务器,当后端服务器处理完请求后,再将请求处理的结果发送给反向代理服务器,由代理服务器将处理结果发送给客户端的一种数据请求模式。
Nginx作为近年来比较火的反向代理服务器,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求。


后端的服务器我们在这里称为upstream server,在上图所示中,中间的反向代理服务器,首先自己扮演一个用户所请求的资源服务器,比如http服务器,然后接受客户端的请求,将请求报文拆解封装,根据请求的内容,再把自己扮演成客户端将请求发送到后端upstream server进行资源获取。取得资源之后,反向代理服务器将反馈回来的的资源数据包进行拆除,然后由自己进行封装反馈给客户端。客户端看来就是反向代理服务器自己在响应资源请求。
反向代理服务器是工作在应用层的,所以它能够取得用户所请求的URL,然后根据请求文件的后缀名决定将请求调度到哪一种服务器上面去。 nginx工作在应用层面, 通信需要借助套接字,最大并发能力大概在65535的一半。
其中为了保持反向代理服务器的正常运行可以基于DNS域名解析做轮询调度,也可以用keepalived做高可用性。
在nginx反向代理的组织架构中日志分析记录应该怎样实现?
客户端将请求发送给反向代理服务器,此时源IP为cip目标IP为pip,代理服务器通过nginx进程对数据包进行拆包,分析用户请求的资源,然后将数据包封装起来发送给后端的upstream server,此时源IP为lip,目标IP为uip,此时后端的upstream server服务器日志记录的所有请求ip应该都为反向代理服务器的lip地址,无法获取到客户端的真实IP地址。所以日志分析可以加在代理服务器上面,对客户端的请求做用户行为分析。当然代理服务器在向后端发送数据包的时候可以给它加一个自定义的首部;在自定义的首部说明对应的请求客户端的ip地址,后端服务器在记录日志时只记录新添加的首部的ip信息,这样就可以获取到客户端的真时ip地址。

nginx反向代理服务器的定义格式及常用配置参数
ngx_httpproxy module模块:nginx反向代理模块
格式为:

server{ listen port#; server_name location / { proxy_pass http://upstream_server:port/; //port可以省略 } }

例如将客户端的请求通过反向代理服务器发送到后端的web1主机,只需要在nginx的主配置文件的location字段中定义

location / { porxy_pass http://web1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_adrr; //同时将客户端的真实IP地址与主机名添加在数据包首部,传递给后端服务器。 }

url的重定向

location /url { proxy_pass http://upstream_server:port/newurl; 表示客户端请求的是一个URL,然后调度器调度到一个新的URL上面去 }

使用正则表达式进行url的匹配

location ~* \.(jpg|png|gif)$ { proxy_pass http://upstream_port; //无论正则表达式匹配到的是什么都会自动补到ip地址的后面 }

例如在后端服务器上的web目录下上传一张.jpg格式的文件,然后在nginx反向代理服务器的主配置文件中用正则表达式定义url

location ~* \.(jpg|png|gif)$ { proxy_pass http://upstream_server; }

upstream负载均衡模块:只能定义在http中,内部使用server指令
例如我们有多台upstream server主机,此时反向代理服务器需要在http字段定义

upstream up_name { server upstream_server1; server upstream_server2; server upstream_server3; ……; }

当我们定义了upstream功能之后在调用时只需要在location中使用upstream定义字段的名字即可

location / { proxy_pass http://up_name/; //这样定义反向代理服务器在接收到客户端的请求之后会根据调度算法将请求传递给所有定义在upstream中的服务器。 }

nginx反向代理的缓存功能定义
操作系统的缓存靠键值存储,其中键是存放在内存中的,值存放在磁盘中,内存中存放的键其实就是url加上磁盘存放的值对应的节点号,反向代理可以定义缓存在磁盘中存放时可以使用多少级子目录来存放值。
如果启用反向代理服务器的缓存功能需要在nginx的主配置文件中的http字段来定义,格式为

proxy_cache_path path levels=num:num keys_zOne=cache_name:#m 具体事例 proxy_cache_path /cache/ngxin levels=1:1 keys_zOne=mycache:32m //表示定义一个名称为mycache的2级缓存,每级缓存使用1个字符进行标识,缓存路径为/cache/nginx,缓存空间大小为32M

使用缓存只需要在location中引用名称以及一些参数即可

location / { proxy_cache mycache; proxy_cache_valid 200 1d; //返回结果为200的缓存时间为1天; proxy_cache_valid 301 302 10m; //返回结果为301,302的缓存时间为10分钟; prixy_cache_valid ant 1m; //其它的缓存时间为1分钟; proxy_cache_use_stale error timeout; //如果返回结果为错误,或者请求超时则返回给客户端一个陈旧的缓存信息 proxy_pass http://up_upstream/; }

反向代理服务器为upstream server服务器做健康状态检查

upstream up_name { server upstream_server1 max_fails=2 fail_timeout=1; //单位周期为1的时间内,达到2次请求失败则标记为节点不可用,并等待下一个周期的检查,判断其是否恢复正常。 server upstream_server2 max_fails=2 fail_timeout=1; }

备用服务器的标记

upstream up_name { server upstream_server1 ; server upstream_server2 backup; //标记此服务器为备用服务器,只有主服务器出现故障时,此服务器才会工作,否则处于待机状态。

其它一些配置定义在location的参数

proxy_connect_tineout:会话超时时长 proxy_read_tineout:等待响应会话时长 proxy_hide_header:隐藏由反向代理服务器响应给客户端时指定的首部