Nginx (五)


一、ngx_http_proxy_module
1、 proxy_pass URL;
2、 proxy_set_header field value;
3、 proxy_cache_path;  代理缓存模块
4、 proxy_cache zone | off;
5、 proxy_cache_key string;
6、 proxy_cache_valid [code ...] time;
7、 proxy_cache_use_stale;
8、 proxy_cache_methods GE
9、 proxy_hide_header field;
10、 proxy_connect_timeout time;
11、 proxy_send_timeout time;
12、 proxy_read_timeout time;

http反向代理

一、ngx_http_proxy_module

The ngx_http_proxy_module module allows passing requests to another
server.
1、 proxy_pass URL;
Context:location, if in location, limit_except
注意: proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port]; 最后没有/
}
...
}
上面示例: http://HOSTNAME/uri --> http://host/uri
http://host[:port]/ 意味着: http://HOSTNAME/uri --> http://host/

proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host/new_uri/;
}
...
}
http://HOSTNAME/uri/ --> http://host/new_uri/
如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri; 用户请求时传递的uri将直接附加代理到的服务的之后
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; 不能加/
}
...
}
http://HOSTNAME/uri/ --> http://host/uri/
不加斜线后面有*.jpg之类的都能显示出来,只要用正则表达式就不能用uri
负载机:107 centos7
后端机器:106 centos6
后端机器:108 centos7
实验目的:
访问107机器www.a.com/.imgs文件转发到108机器
访问107机器www.a.com/.html文件转发到106机器
后端机启动http服务

106
cd /var/www/html
cat index.html 
Welcome to centos6 106

108
cd /var/www/html
cat index.html 
centos7 108
负载机107
location 代理功能必须放在location if语句块里面,只要访问根数据都会调度到某个服务器上面去调度到106机器上面
106机器查看日志显示负载机107访问
为了测试看的更清楚些,创建a.html,在107负载机上面更容易查看
107负载机查看日志,访问网页看到的是106后端机里面的内容
进入正题
访问107机器www.a.com/.imags文件转发到108机器
访问107机器www.a.com/.html文件转发到106机器
测试跳转到108机器
108机器
访问images目录107负载机做反向代理到108机器上
107测试跳转到106机器
106机器
访问107机器下的a.html,b.html
107机器
访问图片后缀的更合理些108图片后缀(静态),106php后缀(动态)
106机器安装php模块
yum install php
cd /var/www/html
vim a.php
service httpd restart
108机器
图片存放到html目录下面
图片比较小
实现了代理动静分离
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port]; 最后没有/
}
最后ip后面加斜线做测试 ,前面测试都没有加斜线
加斜线效果就不一样了,相当于置换 images=/var/www/html/,相当于看到的是/var/www/html/下的aa.jpg
没有斜线代表补加uri
2、 proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值

remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当
你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)
就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后
再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理
服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)
加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP

Context: http, server, location
proxy_set_header X-Real-IP $remote_addr;     X-Real-IP首部名
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   可以看到多层首部代理地址
标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2

分析类型
在proxy里面添加新的字段,客户端本身不带字段,人为插上首部,服务器就能收到首部
把后端首部信息修改,把监控的对应日志首部信息加上
vim vhosts.conf 添加首部信息
108机器要在http配置文件中设置头部信息
vim /etc/httpd/conf/httpd.conf 在客户端显示首部 ,首部信息必须加 " i "
引用格式
重启httpd服务
访问刷新代理机器地址,查看日志信息得到真实ip
强制刷新 -f
 vip公网地址,后端是私网地址,
后端rsserv1
后端rsserv2
客户端把请求发送给vip

公网客户端访问107代理机器公网ip
107机器两个网卡  一个公网,一个内网
客户端访问107公网会转发到106机器
客户端访问107看到的信息实际上是从106转发过去的,
106测试
108机器测试性能
ab -c 100 -n 2000 http://172.18.0.107/m.html
107机器
代理缓存模块
3、 proxy_cache_path; 
定义可用于proxy功能的缓存; Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_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代码段定义path路径  levels 设置缓存文件目录层次;levels=1:2:2 表示三级目录
keys_zone 设置缓存名字和共享内存大小
inactive 在指定时间内没人访问则被删除  过期时间
max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
vim /etc/nginx/nginx.conf 设置pass路径
调用keys_zone 设置缓存名字
vim /etc/httd/conf/vhost.conf
nginx -t
nginx -s reload
访问 107  curl http://172.18.0.107/m.html
107机器 
-文件夹名字叫pcache 里面还没有缓存,访问一次里面就有缓存
在有缓存的情况下再去测试加速访问很明显 ab -c 100 -n 2000 http://172.18.0.107/m.html
4、 proxy_cache zone | off; 默认off
指明调用的缓存,或关闭缓存机制; Context:http,
server, location

5、 proxy_cache_key string;
缓存中用于“键”的内容
默认值: proxy_cache_key $scheme$proxy_host$request_uri;
6、 proxy_cache_valid [code ...] time;
定义对特定响应码的响应内容的缓存时长
定义在http{...}中
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
示例:
在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:1:1 keys_zone=proxycache:20m
inactive=120s max_size=1g;
调用缓存功能,需要定义在相应的配置段,如server{...};
proxy_cache proxycache;
proxy_cache_key $request_uri;   请求的uri
proxy_cache_valid 200 302 301 1h;      响应码缓存    时间
proxy_cache_valid any 1m;   其他内容响应1分钟

7、 proxy_cache_use_stale;
proxy_cache_use_stale error | timeout |
invalid_header | updating | http_500 | http_502 |
http_503 | http_504 | http_403 | http_404 | off ...
在被代理的后端服务器出现哪种情况下,可以真接使用过期的缓存响应客户端

 8、 proxy_cache_methods GET | HEAD | POST ...;
对哪些客户端请求方法对应的响应进行缓存, GET和HEAD方法总是被缓存
 9、 proxy_hide_header field;
By default, nginx does not pass the header fields
“Date”, “Server”, “X-Pad”, and “X-Accel-...” from the
response of a proxied server to a client. 用于隐藏后端服务器特定的响应首部

10、 proxy_connect_timeout time;
定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为60s,一般不建议超出75s,

11、 proxy_send_timeout time;
把请求发送给后端服务器的超时时长;默认为60s

 12、 proxy_read_timeout time;
等待后端服务器发送响应报文的超时时长, 默认为60s

推荐阅读更多精彩内容