本文部分参照博客https://blog.51cto.com/1992tao/1868267
Nginx除了作为web server,还具有反向代理、负载均衡和缓存的功能。
正向代理:是一个位于客户端和原始服务器之间的服务器,为了从原始服务器去的内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
反向代理:指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
两者区别:
1. 从用途来讲:
1) 正向代理可以为在防火墙内的局域网客户提供访问internet的途径。正向代理还可以使用缓冲特性减少网络使用率;
2) 反向代理将防火墙后面的服务提供给internet用户访问。反向代理还可以为后端的多台服务器提供负载均衡,或为后端的服务器提供缓存服务。
2. 从安全性讲:
1) 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
2) 反向代理对外是透明的,访问者并不知道自己访问是一个代理服务器。
ngx_http_proxy_module模块:
1. proxy_pass URL
作用:将作为代理服务器,把客户端访问的资源的url映射到后端服务器;
格式:
Server {
listen
server_name
location / {
proxy_pass http://host[:port]/ ;
}
location /uri {
poxy_pass http://back_server:port/newuri;
location ~* /uri {
proxy_pass http://back_server;
}
}
}
示例:
1) 实验环境
两台虚拟主机,一台作为nginx反向代理服务器,另外一台作为后端web服务器;nginx代理服务器要有一外网网卡和外网客户端通信,还要有一个内网网卡和后端主机通信;后端web服务器内网和nginx在同一网段。
2) 环境搭建
a. 设置nginx反向代理服务器的IP地址,外网地址ip:192.168.19.130,内网ip:172.16.23.1
b. 后端web服务器IP地址为172.16.23.110;
c. 准备网页文件;
3) 编辑代理服务器配置文件并测试
a. 编辑配置文件如下:
访问测试:
b. 我们再次编辑配置文件,不代理整个跟,只代理test目录到后端服务器;
测试访问:
Note:此次我们在proxy_pass加了根,会将其替换吊location的uri,所以访问测试的结果还是访问了后端服务器的默认页面文件;
c. 我们再次编辑配置文件,去掉proxy_pass后面的根;
测试:
Note:在proxy_pass后面不加根,会将location中的uri不到proxy的后面,及访问后端主机的test目录下的默认页面;
d. 编辑配置文件,如果location是正则表达式匹配的。Proxy后面一定不能带uri,即不能带根,否则会报错;
测试:
2. proxy_set_header field value;
作用:将客户端请求代理服务器请求报文首部的值附加到代理服务器发往后端服务器请求报文的首部
Proxy_set_header X-Real-IP $remote_addr:直接记录前段主机的ip地址;
Proxy_set_header X-Forward-For $proxy_add_x_forwarded_for:记录IQ那段合租记发请求时记录的proxy_add_x_forwarded_for的值;
示例:
1) 查看后端服务器日志,可以看出请求的IP地址都是代理服务器的IP地址;
2) 编辑nginx代理服务器配置文件;
修改后端服务器配置文件的日志格式,添加以下内容:
重新访问测试:可以看出,在访问日志中出现了源地址信息;
具体可参考https://www.cnblogs.com/jsonhc/p/7199295.html?utm_source=itdadao&utm_medium=referral这篇博客,有具体的日志格式设置;
Note:如果后端服务器用的apache,日志格式可改成如下格式即可;
3. proxy_cache缓存
proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] ;
作用:定义proxy功能的缓存路径等;
参数:
levels=levels:缓存目录的层级数量;
例如:levels=1:2:2,表示一个一级子目录,两个二级子目录,两个三级子目录,每一级的数量为十六进制数;
keys_zone=name:size :k/v映射的内存空间的名称和大小;
inactive=time:非活动时长;
max_size=size:磁盘上用于缓存数据的缓存空间上限;
示例:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
proxy_cache zone_name;
作用:指明要调用的缓存,或者关闭缓存机制;
proxy_cache_valid [code] time;
作用:定义对特定的响应码的响应内容的缓存时长;
proxy_cache_methods
作用:指明为哪些请求方法去检测使用缓存;一般情况下,通常是GET HEAD可以使用缓存;
proxy_cache_use_stale error timeout ...
作用:当代理服务器于后端主机出现故障时,在后端服务器的响应结果为哪种情况下,可以直接用缓存中的缓存项(可能是过期的内容)来响应客户端。
proxy_cache_min_uses
作用:设置响应将被缓存的请求的数量;
proxy_cache_bypass string: 设置在何种情形下nginx将不从cache取数据的;
$cookie_nocache $arg_nocache $http_authorization
作用:定义不从缓存中响应的条件,如果参数字符串中至少有一个值不是空的,并且不等于0,name响应就不从缓存中获取;
proxy_cache_key string
;
作用:缓存中用于“键”的内容;
示例:定义调用缓存机制;
1) 创建缓存目录;
2) 在配置文件中定义缓存路径(proxy_cache_path路径只能定义在http段)
3) 可以在其它的location段定义缓存调用;
4) 测试访问http://192.168.19.130/test,查看缓存目录;
ngx_http_upstream_module模块
作用:定义服务器组;
格式:
upstream name {
server_adress [parameters];
ip_hash;
}
示例:
1. server address [parameters];
作用:定义upstream中server成员的地址和其他相关参数;
address:这个地址可以指定为一个域名或者ip地址,后面加一个可选择的端口,或者是在unix前缀之后指定的unix域的套接字路径如果没有指定端口,则使用默认的80端口。一个域名解析到多个ip地址,同时定义多个服务器。
parameters:
weight=number :权重,默认为1;
man_fails=number :失败尝试的最大次数;超出此处指定的次数时,server将被标记不可用;
fail_timeout=time :设置将服务器标记为不可用状态的超时时长;
down :手动标记server不可用;
backup :标记这个服务器为一个备用服务器,当主服务器不可用时,它将被传递请求。
示例:定义两个upstream server,用两台upstream server提供web测试界面,一台nginx服务器做反向代理服务器,实现负载均衡;
1) 编辑/etc/nginx/nginx.conf配置文件,配置upstream servers;
2) 编辑配置文件调用upstream server;
3) 重载服务,并测试;
Note:可以看出,访问根目录时,实现了负载均衡,访问test目录下页面文件时,都是172.16.23.210那台upserver在响应,这是因为在/test/的location下,定义了缓存机制,第一次从upstream server1上都到响应,之后的都是从缓存中获取的。
4) 注释掉缓存机制,重新访问测试;
重新访问测试:
5) 编辑配置文件,设置权重,max_fails等参数;
6) 重载配置文件,我们手动停掉172.16.23.211的web服务这台upserver测试,可以发现只有第一台upserver响应了;
7) 再重新启动停掉web服务的upserver的web服务,再次测试;
健康检查:
health_check;
建议:关闭访问日记
调度算法:
1. ip_hash;
源地址hash调度方法
2. least_conn;
最少连接调度算法,当server拥有不同的权重是其为wlc;
3. hash key [consistent];
基于指定的的key的hash表来实现对请求的调度,此处的key可以直接是文本、变量或者二者的组合;
作用:将请求分类,同一类请求将发往同一个upstream server;
示例:
hash $request_uri consistent;一致性hash算法;
hash $remote_addr;来自于同一个ip地址的请求,将始终被发往同一个后端服务器;
4. keepalive connections;
为每个worker进程保留的空闲的长连接数量;
演示:
1. ip_hash算法;
1) 编辑配置文件,采用ip调度方法;
2) 重载服务测试;
2. hash key算法;
1) 在172.16.23.210后端主机上准备测试网页文件;
2) 在172.16.23.211后端主机上准备网页测试文件;
3) 不添加任何算法测试;
4) 编辑配置文件,把用户请求的uri做哈希运算,用hash key算法;
5) 重载服务,测试;
自定义响应首部:
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
示例:
1. 编辑配置文件,自定义响应首部;
2. 测试;