Nginx 动静分离反向代理缓存添加隐藏信息多级IP透传等配置
Posted 林炜玮_51CTO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 动静分离反向代理缓存添加隐藏信息多级IP透传等配置相关的知识,希望对你有一定的参考价值。
实验内容
- 一级反向代理(指定location代理、隐藏信息、添加信息)
- 动静分离代理(针对特定资源反向代理、缓存代理)
- IP地址透传(一级透传、多级透传)
实验拓扑
实验1:一级反向代理
针对指定location反向代理
nginx目录
#172.16.10.8配置
yum install httpd -y
echo rs1 server > /var/www/html/index.html
systemctl start httpd
#172.16.10.21配置
vim /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
location /
root /etc/nginx/html/pc;
proxy_pass http://172.16.10.8; #默认端口可以不加端口号,非默认:端口号
#保存退出,检验语法并加载配置
#如果日志报错,例如13: Permission denied
setsebool -P httpd_can_network_connect on
强调:
- 如果proxy_pass url 后面无 / 符号,需要将location后面url 附加到proxy_pass指定的url后面,类似于root
- 如果proxy_pass url 后面有 / 符号相当于置换,即访问/web时实际返回proxy_pass后面uri内容.类似于alias
- 如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能使用uri
最后用客户机测试结果,效果正确~
隐藏信息
#172.16.10.21配置
vim /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
location /
root /etc/nginx/html/pc;
proxy_pass http://172.16.10.8; #默认端口可以不加端口号,非默认:端口号
proxy_hide_header ETag; #隐藏Etag
测试结果
添加信息
server
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
add_header X-Via $server_addr; #当前nginx主机的IP
add_header X-Cache $upstream_cache_status; #是否缓存命中
add_header X-Accel $server_name; #客户访问的FQDN
location /
proxy_pass http://172.16.10.8;
proxy_hide_header ETag;
是否命中缓存,第一次是X-cache=MISS,第二次是X-cache=HIT
实验2:动静分离代理
针对特定资源反向代理
#172.16.10.8配置
yum install httpd -y;systemctl enable --now httpd
echo rs1 server > /var/www/html/index.html
#172.16.10.9配置
yum install httpd -y;systemctl enable --now httpd
echo this is static server > /var/www/html/index.html
#172.16.10.21配置
vim /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
location /
root /etc/nginx/html/pc;
proxy_pass http://172.16.10.8; #默认端口可以不加端口号,非默认:端口号
#保存退出,检验语法并加载配置
#如果日志报错,例如13: Permission denied
setsebool -P httpd_can_network_connect on
上传静态资源图片到172.16.10.9
测试结果:当客户端输入静态类后缀的时候,由静态服务器提供服务,非静态类的由动态服务器提供服务
缓存功能
缓存功能默认关闭状态,需要先动配置才能启用
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_valid 200 302 10m;
proxy_cache_valid 404 1m;
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];
#示例:在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会自动创
建
levels=1:2:2 #定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata(如:使用次
数)
inactive=120s #缓存有效时间
max_size=1g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
#调用缓存功能,需要定义在相应的配置段,如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_use_stale error http_502 http_503;
proxy_cache_methods GET | HEAD | POST ...;
#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
写得有点累了,来个高清大图皮一下,接着进入缓存配置步骤
非缓存场景压测
配置缓存
mkdir /etc/nginx/data/nginx -pv #创建存放缓存目录,子目录重新加载Nginx会自动创建
vim /etc/nginx/nginx.conf
vim /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
proxy_cache proxycache; #proxycache改为off就是禁用缓存,proxycache需和创建的存放目录名一致
#ache_key $request_uri;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 5m; #必须指定哪些响应码的缓存
proxy_set_header clientip $remote_addr;
location /
proxy_pass http://172.16.10.8;
proxy_hide_header ETag;
location ~*\\.(jpe?g|png|bmp|gif)$
proxy_pass http://172.16.10.9;
#保存退出,nginx -t测试语法,nginx -s reload加载配置内容
首次访问地址获取内容,使nginx获得缓存
缓存场景压测
实验3:IP地址透传
一级透传
#172.16.10.21
vim /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
proxy_cache off;
#ache_key $request_uri;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 5m; #必须指定哪些响应码的缓存
proxy_set_header X-Real-IP $remote_addr; #透传ip变量$remote_addr=ip地址,X-Real-IP为自定义参数名,web端需配置一致
add_header X-Via $server_addr; #当前nginx主机的IP
add_header X-Cache $upstream_cache_status; #是否缓存命中
add_header X-Accel $server_name; #客户访问的FQDN
location /
proxy_pass http://172.16.10.8;
proxy_hide_header ETag;
location ~*\\.(jpe?g|png|bmp|gif)$
proxy_pass http://172.16.10.9;
#保存退出并加载新配置
vim /etc/httpd/conf/httpd.conf #添加与前端一致的IP参数名
从172.16.10.20进行url访问测试,结果IP地址被透传过来
多级透传
#第一个代理服务器
[root@centos8 ~]#vim /apps/nginx/conf/conf.d/pc.conf
server
location /
proxy_pass http://172.16.10.21;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
.......
#
第二个代理服务器
[root@centos8 ~]#vim /etc/nginx/nginx.conf
server
location /
proxy_pass http://172.16.10.22;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
.....
#
后端服务器
[root@centos8 ~]#vim /etc/httpd/conf/httpd.conf
LogFormat "\\"%x-Forwarded-Fori\\" %h %l %u %t \\"%r\\" %>s %b \\"%Refereri\\" \\"%
User-Agenti\\"" testlog
CustomLog "logs/access_log" testlog
以上是关于Nginx 动静分离反向代理缓存添加隐藏信息多级IP透传等配置的主要内容,如果未能解决你的问题,请参考以下文章
Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第三部分
项目实战2.2—nginx 反向代理负载均衡动静分离和缓存的实现
Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第一部分(LAMP)