本文共 10154 字,大约阅读时间需要 33 分钟。
所谓反代理功能就是将用户的请求转发至后端的某一台web服务器,而nginx不仅可以转发用户请求,并且还可以根据用户请求的URL来决定转发至那一台后端服务器。
相关模块ngx_http_proxy_module
指令
语法:proxy_pass URL; 可用在:location, if in location, limit_except
示例: server { listen 80; root /nginx/html; server_name www.b.com; location /bbs { proxy_pass http://www.a.com; "最后没有/" } ... } "什么是URL,就是域名后面的第一个/开始往后的才算URL,例如:http://www.a.com/bbs 这网址的URL就是/bbs" 上面示例:如果proxy_pass没有跟URL 那么访问此网页http://www.b.com/bbs 将访问的是后端服务器的此网页--> http://www.a.com/bbs 如果上面示例中有"/",即:http://www.a.com/ 意味着置换:当访问此网页http://www.b.com/bbs 将置换为,也就是访问后端服务器的主网页--> http://www.a.com/ 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/
server { listen 80; root /nginx/html/; index index.html server_name www.a.com; location /bbs { proxy_pass http://www.b.com/index.html; } location ~* .*\.php$ { proxy_pass http://www.c.com; }}上面的例子就是: 1,当用户访问www.a.com时将返回调度器本机的index.html文件 2,当用户访问www.a.com/bbs时将被调度之后端的www.b.com主机并将URL替换至http://www.b.com/index.html,也就是间接的访问了www.b.com主机的index.html页面了。 3,当用户访问www.a.com/index.php动态程序时将被调度至后端的www.c.com主机中的php动态程序,日志 www.b.com主机的日志 192.168.68.7 - - [24/Mar/2018:12:22:51 +0800] "GET /index.php HTTP/1.0" 200 5 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" www.c.com主机的日志 192.168.68.7 - - [23/Mar/2018:23:08:02 +0800] "GET / HTTP/1.0" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.168 Safari/537.36" "注意:为什么两个web服务器显示客户端IP都是一个,因为是nginx代理客户端访问数据再将数据转给客户端"
语法:proxy_set_header field value; 可用在:http, server, location 相关参数: field:可以是任意字符串,该字符串必须与后端的web的日志记录格式中的字符串一样,否则将不会记录该请求报文的首部信息 value变量 $remote_addr: 表示客户端的IP地址 $proxy_add_x_forwarded_for: 带有$remote_addr变量的“X-Forwarded-For”客户机请求标头字段,用逗号分隔。如果“X-Forwarded-For”字段在客户机请求头中不存在,则该$proxy_add_x_forwarded_for变量等于该$remote_addr变量。 $proxy_port proxy_pass指令中指定的代理服务器 的端口或协议的默认端口; $proxy_host proxy_pass指令中指定的代理服务器的名称和端口 ;
实现步骤:
客户端IP:192.168.68.16 调度器IP:192.168.68.7 1,修改调度器的主配置文件添加如下内容 server { listen 80; root /nginx/html/; server_name www.a.com; index index.html; location /bbs { proxy_pass http://www.c.com/; proxy_set_header client_ip $remote_addr; } location ~* .*\.php$ { proxy_pass http://www.b.com; proxy_set_header client_ip $remote_addr; } } 2,启动调度器服务 systemctl restart nginx 3,在后端的web服务器修改http主配置文件中的计入日志的配置段 原:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 修改后:LogFormat "%{client_ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined "注意:%h表示客户端的IP地址,%{client_ip}i就是在调度器中定义的请求报文首部,注意格式请求报文首部必须用{}i,至于没什么,因为没有为什么,这么写就对了" 4,确认日志记录是调用该格式 CustomLog "logs/access_log" combined 注意:CustomLog配置段最后的"combined"表示调用的那个日志记录格式 5,启动后端web服务器服务 systemctl restart httpd 6,查看后端服务器的访问日志 没有配置前的访问日志 192.168.68.7 - - [24/Mar/2018:12:16:07 +0800] "GET /index.php HTTP/1.0" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.168 Safari/537.36" "配置后" 192.168.68.16 - - [24/Mar/2018:16:24:15 +0800] "GET /index.php HTTP/1.0" 200 10 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
定义缓存
语法: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: 设置缓存的路径和其他参数。缓存数据存储在文件中。缓存中的文件名是将MD5函数应用于 缓存键的结果。该levels参数定义了缓存的层次结构级别:从1到3,每个级别接受值1或2.例如,在以下配置中 proxy_cache_path / data / nginx / cache levels = 1:2 keys_zone = 1:10m; 缓存中的文件名将如下所示:"一级目录是URL哈希值16进制的最后一位,二级目录是哈希值最后一位的前两位" / data / nginx / cache / c / 29 / b7f54b2df7773722d382f4809d650 29c use_temp_path=on|off: 临时文件的目录根据use_temp_path参数设置,如果省略此参数或将其设置为该值on,则将使用proxy_temp_path指令为给定位置设置的目录。如果该值设置为off,临时文件将直接放入缓存目录中 "keys_zone=name:size: 注意此指令必须定义,该值是定义缓存的名字也就是之后在其他配置段中方便调用,给多大内存用来做缓存用户请求的页面内容,例如:keys_zone=1:1g" inactive=time(s|m|h|d): 在inactive参数指定的时间内未访问的缓存数据将从缓存中删除,而不管其新鲜度如何。默认情况下,inactive设置为10分钟 max_size=10g: 表示这个zone的硬盘容量为10GB purger= on|off 指示缓存 清除程序是否将从磁盘中删除与通配符键匹配的缓存条目 。将参数设置为on(默认为off)将激活“缓存清除器”进程,该进程永久遍历所有缓存条目并删除与通配符键匹配的条目。 purger_files=number 设置在一次迭代期间将被扫描的项目数量。默认情况下,purger_files设置为10 purger_threshold=number 设置一次迭代的持续时间。默认情况下,purger_threshold设置为50毫秒。 purger_sleep=number 在迭代之间设置暂停。默认情况下,purger_sleep设置为50毫秒。
2,调用缓存
调用缓存功能,需要定义在相应的配置段,如server{...}; 在被代理的后端服务器出现哪种情况下,可以真接使用过 期的缓存响应客户端 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 ... 对哪些客户端请求方法对应的响应进行缓存,GET和 HEAD方法总是被缓存 proxy_cache_methods GET | HEAD | POST ...; 默认nginx在响应报文不传递后端服务器的首部字段Date, Server, X-Pad,X-Accel-等,用于隐藏后端服务器特定的响 应首部 proxy_hide_header field; 定义与后端服务器建立连接的超时时长,如超时会出现 502错误,默认为60s,一般不建议超出75s proxy_connect_timeout time; 将请求发送给后端服务器的超时时长;默认为60s proxy_send_timeout time; 等待后端服务器发送响应报文的超时时长,默认为60s proxy_read_timeout time;
1,定义缓存方法,注意只能在http语句块中定义
http { ... proxy_cache_path /var/nginx/cache/proxy_cache levels=1:2:2 keys_zone=proxycache:20minactive=120s max_size=1g; ... }
2,创建定义好的缓存存放路径目录
mkdir /var/nginx/cache/proxy_cache
3,调用
server { listen 80; root /nginx/html/; server_name www.a.com; index index.html; "proxy_cache proxycache; #调用keys_zone proxy_cache_key $request_uri; #对什么进行hash运算,这里指的是客户端请求的URL proxy_cache_valid 200 302 301 1h; #缓存那些状态码的内容,缓存多长时间,1h表示1小时 proxy_cache_valid any 1m;" #这里指的是其他的状态码的内容,只缓存1分钟 location /bbs { proxy_pass http://www.c.com/; proxy_set_header client_ip $proxy_port-$remote_addr; } location ~* .*\.php$ { proxy_pass http://www.b.com; proxy_set_header client_ip $remote_addr; } }
**4, 启动调度服务器
systemctl restart nginx
5, 测试
ab -c 10 -n 2000 http://www.a.com/bbs ab -c 10 -n 2000 http://www.a.com/index.php
6,这时候在调度服务器会出现这样一些目录,这就表示已经开始有缓存了
[root@centos7 ~]# tree /var/nginx/cache/proxy_cache/ /var/nginx/cache/proxy_cache/ └── d └── 4d └── f8 └── d3a08c68a64dfb2a23b30dae88a f8 4d d #这个文件就是hash客户端请求得出来的哈希值 3 directories, 1 file
相关模块ngx_http_headers_module
1、添加响应报文首部 语法:add_header name value [always]; 可用在:http, server, location, if in location 例如: add_header X-Via $server_addr; #后端服务器地址 add_header X-Cache $upstream_cache_status; #是否命中缓存,命中就显示"HIT",未命中显示"MISS",或者 REVALIDATED,UPDATIN,GSTALE,EXPIRED,BYPASS add_header X-Accel $server_name; #后端服务器域名 2,添加自定义响应信息的尾部 语法:add_trailer name value [always];示例: server { listen 80; root /nginx/html/; server_name www.a.com; index index.html; proxy_cache proxycache; proxy_cache_key $request_uri; proxy_cache_valid 200 302 301 1h; proxy_cache_valid any 1m; "add_header X-Via $server_addr; add_header X-Cache $upstream_cache_status; add_header X-Accel $server_name;" location /bbs { proxy_pass http://www.c.com/; proxy_set_header client_ip $proxy_port-$remote_addr; } location ~* .*\.php$ { proxy_pass http://www.b.com; proxy_set_header client_ip $remote_addr; } }测试:"未命中缓存:" [root@centos6 ~]# curl -I http://www.a.com/bbs HTTP/1.1 200 OK Server: nginx/1.12.2 Date: Sat, 24 Mar 2018 12:28:34 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 2097152 Connection: keep-alive Last-Modified: Fri, 23 Mar 2018 20:17:39 GMT ETag: "12092f-200000-5681a1dadad02" X-Via: 192.168.68.7 X-Cache: MISS X-Accel: www.a.com Accept-Ranges: bytes"命中缓存:" [root@centos6 ~]# curl -I http://www.a.com/bbs HTTP/1.1 200 OK Server: nginx/1.12.2 Date: Sat, 24 Mar 2018 12:29:28 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 2097152 Connection: keep-alive Last-Modified: Fri, 23 Mar 2018 20:17:39 GMT ETag: "12092f-200000-5681a1dadad02" X-Via: 192.168.68.7 X-Cache: HIT X-Accel: www.a.com Accept-Ranges: bytes
转载于:https://blog.51cto.com/13598893/2090726