反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预 定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主 要在不同的场景使用以下模块实现不同的功能。
ngx_http_proxy_module: 将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module :用于定义为proxy_pass,fastcgi_pass,uwsgi_pass,等指令引用的后端服务器分组
ngx_stream_proxy_module: 将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module: 将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
逻辑调用关系:
访问逻辑图:
同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需 要经过处理才能被访问
官方文档:Module ngx_http_proxy_module
一、HTTP协议反向代理
1.1 反向代理配置参数
官方文档:Module ngx_http_proxy_module
proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机
#可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能
使用uri
#即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host:port; #proxy_pass后面的url 不能加/
}
...
}
http://HOSTNAME/uri/ --> http://host/uri/
proxy_hide_header field; #用于nginx作为反向代理的时候
#在返回给客户端http响应时
#隐藏后端服务器相应头部的信息
#可以设置在http,server或location块
proxy_pass_header field; #透传
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数
#如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
proxy_pass_request_body on | off;
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
proxy_pass_request_headers on | off;
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
proxy_set_header;
#可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的
时候,就要更改每一个报文的头部
proxy_connect_timeout time;
#配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒
proxy_read_timeout time;
#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s
proxy_send_timeout time;
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60s
proxy_http_version 1.0;
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0
proxy_ignore_client_abort off;
#当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器、
会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后Nginx也会中断客户端请求
并立即记录499日志,默认为off
1.2 反向代理单台web服务器
要求:将用户对域 www.timinglee.org 的请求转发给后端服务器处理
1、编辑子配置文件
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name ou.qisheng.org;
location / {
proxy_pass http://172.25.254.30;
}
}
2、重启nginx,并测试
nginx -s reload
1.3 指定location实现反向代理
1.3.1 针对指定的location
1.编辑子配置文件
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name ou.qisheng.org;
location / {
proxy_pass http://172.25.254.20;
}
location ~ /static {
proxy_pass http://172.25.254.30;
}
}
2、后端web服务器必须要有相对于的访问URL
[root@apache20 ~]# echo web2 172.25.254.20 > /var/www/html/index.html
[root@apache30 ~]# mkdir /var/www/html/static
[root@apache30 ~]# echo static 172.25.254.30 > /var/www/html/static/index.html
3、重启nginx并访问测试
nginx -s reload
1.3.2 针对特定的资源实现代理
[root@Nginx ~]# vim /apps/nginx/conf.d/vhost.conf
server {
listen 80;
server_name ou.qisheng.org;
location / {
proxy_pass http://172.25.254.20;
}
location ~ \.(png|jpg|gif) {
proxy_pass http://172.25.254.30;
}
}
1.4 缓存功能
缓存功能默认关闭状态,需要先动配置才能启用。
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
proxy_cache_key string;
#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时长,定义在http{...}中
proxy_cache_path;
#定义可用于proxy功能的缓存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间
proxy_cache_valid any 1m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置, 否则不会缓存
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ;
#默认是off #在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端
proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
1.4.1 非缓存场景压测
1、准备后端服务器测试页面
[root@apache30 static]# mkdir /var/www/html/static
[root@apache30 static]# cat /var/log/messages > ./log.html
2、开始压测
[root@Nginx ~]# ab -n1000 -c100 http://ou.qisheng.org/static/log.html
1.4.2 准备缓存配置
1、编辑nginx.conf配置文件
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
2、编辑子配置文件
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
3、重启nginx,查看
/data/nginx/proxycache/ 目录会自动生成
1.4.3 访问并验证缓存文件
1、访问web并验证缓存目录
[root@Nginx ~]# ab -n1000 -c100 http://ou.qisheng.org/static/index.html
[root@Nginx ~]# ab -n2000 -c200 http://ou.qisheng.org/static/log.html
2、验证缓存目录结构及文件大小
二、HTTP 反向代理负载均衡
Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而 且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提 供服务器分组转发、权重分配、状态监测、调度算法等高级功能。
官方文档:Module ngx_http_upstream_module
2.1 http upstream配置参数
#自定义一组服务器,配置在http块内
upstream name {
server .....
......
}
#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检
测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性
检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再
次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down #标记为down状态,可以平滑下线后端服务器
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx
hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性
hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致
性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash
hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑定
ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持
least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC
2.2 后端多台 web服务器
环境说明:
172.25.254.10 #Nginx 代理服务器
172.25.254.20 #后端web A,Apache部署
172.25.254.30 #后端web B,Apache部署
部署后端 Apache服务器:
[root@apache20 ~]# yum install httpd -y
[root@apache20 ~]# echo "web1 172.25.254.20" > /var/www/html/index.html
[root@apache20 ~]# systemctl enable --now httpd
[root@apache30 ~]# yum install httpd -y
[root@apache30 ~]# echo "web2 172.25.254.30" >> /var/www/html/index.html
[root@apache30 ~]# systemctl enable --now httpd
访问测试:
2.2.1 配置nginx反向代理
注意: 本节实验过程中先关闭缓存
1、编辑子配置文件
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webserver {
server 172.25.254.20 weight=1 fail_timeout=15s max_fails=3;
server 172.25.254.30 weight=1 fail_timeout=15s max_fails=3;
server 172.25.254.10 backup;
}
server {
listen 80;
server_name ou.qisheng.org;
location ~ / {
proxy_pass http://webserver;
}
}
2、重启nginx,并访问测试
关闭172.25.254.20和172.25.254.30,测试nginx backup服务器可用性:
while true;do curl http://ou.qisheng.org;sleep 1;done