Nginx反向代理、负载均衡与缓存
## Nginx反向代理和缓存
-
实验环境
- nginx反向代理服务器:Centos7 192.168.10.123
- LAMP:Centos7 192.168.10.121
- LNMP:Centos7 192.168.10.124
-
Nginx的代理模块
- proxy模块,由ngx_http_proxy模块支持
- upstream模块,由ngx_http_upstream模块支持
- fastcgi模块,由模块支持
Nginx配置反向代理
-
使用yum安装nginx服务
-
修改配置,启用proxy模块反向代理功能
location / { if ( $request_filename ~* \.php$ ) { proxy_pass http://192.168.10.121; } if ( $request_filename !~* \.php$ ) { proxy_pass http://192.168.10.124; } }
-
检查配置语法并启动服务
-
访问测试
代理服务器将受到的以.php为后缀的连接请求转发给主机192.168.10.121处理,其他请求则转发至192.168.10.124主机处理
-
使用这种方法进行反向代理时后端的日志记录不能收集源客户端地址,只会记录反向代理服务器的ip地址,无法进行准确的日志分析
LNMP服务器无法收集正确的源客户端地址,只会记录反向代理服务器的ip
-
修改nginx反向代理服务器配置
location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $remote_addr; #HTTP的请求端真实的IP if ( $request_filename ~* \.php$ ) { proxy_pass http://192.168.10.121; } if ( $request_filename !~* \.php$ ) { proxy_pass http://192.168.10.124; } } #标准格式:X-Forwarded-For: client1, proxy1, proxy2... #X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,其余为经过的代理或负载均衡的ip地址,经过几个就会出现几个 #$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开 #$remote_addr变量的值是客户端的IP #$http_x_forwarded_for变量,保存了请求中的X-Forwarded-For信息 参考:https://blog.51cto.com/wjw7702/1150225
-
若出现如下提示表示添加的额外附加信息超出了hash bucket size的大小,需要进行调整
proxy_headers_hash_max_size 1024; proxy_headers_hash_bucket_size 128;
-
修改LAMP服务器的Apache服务的日志格式
-
访问测试,查看日志结果
LNMP服务器日志
Apache服务器日志
Nginx反向代理服务器配置缓存
-
修改反向代理服务器配置
proxy_cache_path位于http容器中
http { ... proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=xcache:10M max_size=500M; ... location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $remote_addr; proxy_cache xcache; #使用xcache类型缓存 proxy_cache_valid 200 1d; #响应状态码为200的页面缓存1天 proxy_cache_valid 301 302 1m; #响应状态码为301、302的页面缓存1分钟 proxy_cache_valid any 1m; #其余的缓存1分钟 proxy_cache_revalidate on; #指示NGINX在刷新来自服务器的内容时使用GET请求 proxy_cache_use_stale error timeout http_500 http_502 http_504; #若请求出现timeout、500、502、504s时使用过期的缓存响应请求 add_header X_cache_hit $upstream_cache_status; #添加缓存命中状态到报文首部 ... } #内容参考来自:https://www.cnblogs.com/howhy/p/6732216.html
-
创建指定的缓存存放目录,并赋予相应的权限
-
浏览器查看效果
-
查看缓存文件存放
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=xcache:10M max_size=500M; #proxy_cache_path 定义缓存目录 #目录的生成对应levels=1:2 #:隔离目录,一个分号表示有两级目录 #1表示父目录为1个字符,目录名为缓存文件名的最后一个字符 #2表示子目录下为2个字符,目录名为倒数第3和倒数第2两个字符 #keys_zone 定义缓存名称和内存空间大小 #max_size 定义缓存硬盘空间大小
upstream 负载均衡
-
修改代理服务器nginx配置
http { ... upstream webservers{ [rr|wrr|ip_hash|least_conn] server 192.168.10.121 max_fails=3 fail_timeout=30s weight=1; server 192.168.10.124 max_fails=3 fail_timeout=30s weight=1; server 192.168.10.122 backup; #backup 备用服务器 } ... location / { proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Real-IP $remote_addr; # proxy_cache xcache; # proxy_cache_valid 200 1d; # proxy_cache_valid 301 302 1m; # proxy_cache_valid any 1m; # proxy_cache_revalidate on; # proxy_cache_use_stale error timeout http_500 http_502 http_504; # add_header X_cache_hit $upstream_cache_status; proxy_pass http://webservers; } ... } #Nginx的调度算法: # rr:轮询,轮流分配请求 # wrr:加权轮询,参考权重轮分配请求(如:定义upsteam_server默认算法就是wrr) # ip_hash源地址hash,对源ip地址计算hash值,一样的hash值将请求送到相同服务器,实现session绑定 # least_conn:最少连接调度算法 #后端服务器状态 #down:表示当前server暂时不参与负载均衡。 #backup:预留的备份机,当其他所有非backup机器出现故障或者繁忙的时候,才会请求backup机器 #max_fails:允许请求的失败次数,默认为1,配合fail_timeout一起使用 #fail_timeout:经过max_fails次请求失败后服务将会暂定fail_timeout时间不向请求失败的主机发送请求
-
为所有集群中的服务器添加测试网页
192.168.10.121 LAMP服务器
192.168.10.124 LNMP服务器
-
访问测试