Nginx 高级进阶篇 (Proxy代理,Proxy缓存)

一、服务器代理原理:Proxy代理

1.正向代理:内网客户机通过代理访问互联网。通常要设置代理服务器地址和端口。
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
2.反向代理:外网用户通过代理访问内网服务器。O S P 4 /内网服务器无感知。
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
3.模块:ngx_http_proxy_module
4.语法:
代理
Syntax: proxy_pass URL; 代理的后端服务器URL
DefaultL i X / ^ # r L u: —p G O y m
Context: location, if in location, limit_except

缓冲区
Syntax: proxy_buffering onU # G p d } | off;
Default: proxyr V [ $ 7 f I 9_buff & ZeriC T m E 4 ( / a bng on; 缓冲开关
Context: http, server, location
proxy_bufferiU + ; Mng开启的情况下,nix ] K p jgnx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端
(边收边传,不是全部接收完再传给客户端)。

Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k; 缓冲区大小
Contex[ a Rt: http, server, location

Syntax: proI p I z } ; uxy_buffers number size;
DefaulB E ? | c ,t: proxy_buffers 8 4k|8k; 缓冲区数量
Context:+ , ; 7 H http, server, loe & E !ca! T 5 F H 3 U / $tion

Syntax: proxy_busy_buffer5 b As_sizeZ N * # size;
Default: proxy_busy_buffers_size 8k|16k; 忙碌的缓冲区大小3 $ h S,控制同时传递给客户端的buffer数量
Context: http, server, location

头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host; 设置真实客户端地址
proxy_set_hH = 0 p # & oeader Conn2 @ 4 D ] 3 8 d uection close;
Context: http, s5 n g q . w 4 2erver, location

超时
Syntax: proxy_connect_t] A H S | f I d Iimeout time;
Da f ? eefault: proxy_connect_timeout 60s;~ ) 8 e 6 a 链接超时
Cont0 l B 9 b z a )ext: http, server, location

Syntax: proxy_read_tI m m . X -imeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location

Syn- Q B R j _ u Etax: proxy_send_timeout time;nginx进程向fastc, + D O Zgi进程发送request的整个过程的超时时间
Default: p1 E G W ) K | ~roxy_senW ^ ed_timeout 60s;
Context: http, serverK z ! N & 1 ^ +, location


二、代理案例:

1.准备两台服务器,
一台为代理服务器IP为 :10.8.162.6
一台 被代理服务器IP为:10.8.162.32
2.两台服务器准备基础环境:
yum install -y ngiP j 9 Onx
systemctl sA [ F xtart nginx
3.代理! J 7 ! j n k L服务器启动代理程序:
(1):vim /etc/ngi x g W 0 1 ,nx/conf.d/default.conf
把默认首页给注释掉
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
(2)在location中写入:
location / {
.....
proxy_pass http://192.168.1b D k 5 $ % A00.10:80;
proxy_redirect default;

proxy_set_header Host $http_host;
proxy_set_header X-Reak = S X ll-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x2 / #_forwarded_for;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 6Z X 7 l n0;

prox5 q ` l ~ Z Vy_b$ d v Xuffering on;
proxy_bufi } 3 . T % 2 K cfer_size 32k;
proxy_buffers 4 123 $ t 98k;
proxy_b= Q @ ! 1 W - Kusy_bF Q 4 Z / B # juffers_size 256k;
proxy_max_temp_file_size 256k;
}


解释:
proxy_pass :真实服务器(被代理服务器的IP)
proxy_redirect :如果真实服务器使用的是真实IP和非默认端口。则改成IP和默认端口。
proxy_set_h+ m D )eader:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-Iq b v Z @ w K =P :启( p Z r x T L $ 用客户端真实地址(否则日志中显示的是代理在访问网K w i ( 4站)c H H & K N s )
proxy_set_header X-Forwarded-For:记录代理地址

proxy_connect_timeout::后端服务器连接的超时时间_发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间_就是在规定时间之内后端服务器` k n p n c 3 V G必须传完所有的数据
proxy_read_timeou/ , q 0 % it :ngine 8 [x接收upstream(上游/真实) server数据超时, 默认i % & g z V60s, 如果连续的60s内没有收到1个字节, 连接W : t关闭。像长连接

proxy_buffering on;开启缓存
proxy_buP ; z v Dffer_size:proxy_buffer_size只是响应头的缓冲区
proxy_buffers 4 128k; 内容缓冲区域大小
proxy_busy_buffers_size 256k; 从proxy_buffers划出一部分缓冲区来7 [ ) . w L专门向客户端传送数据的地方
proxy_max_temp_file_size 256k;超大的响应头存储成文件。
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
4.重启服务:systemctl restart nginx
5.在被i 2 E #代理的服务器主页上写入东西进行验证:
vim /usr/share/nginx/htt o * 7ml/index.html
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
6.使用PC客户端访问代理服务器地址:
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
7.观察被代理服务器的日志 //tail /5 6 e b T f X Tvar/log/nginx/access~ h # : Y ! N }.log
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
(1)10.8.162.6 代理服务器地址
10.8.162.46 真机ip地址
(2)访问成功。 记录了客户机的IP和代理服务器的IP。


三、Proxy缓存(延续代理实验)

1.缓存类型:网页缓存9 [ c / (公网)CDN;数据库缓存 memcache redis;网页缓存 nginx-proxy;客户端缓存 浏览器缓存
2.模6 z ^ 5块:ngx_http_proxy_module
3.语法:
缓存开关
Syntax: proxy_cache zone | off;
D* N L | Y Mefa# ` v | k ` b EultF J l O - p: proxy_B H l 8 Pcache off;
ContexS 6 e ! = q H @ kt: http, server, location

代理缓存
Syntax: proxy_cache_path path [levels=levels] keys_zone=n6 # e 6 O 7 l U :ame:size[inactive=time] [max_size=size] [manager_files=number]
Default: —
Context: http
example:proxy_cache_path /data/nginx/cache levels=1:2 keys_zonc e Oe=on0 a h _ S - R oe:10m;

缓存维度
Syntax: proxy_cachm V L [ . - ~ _ |e_key strinJ b $ M I ] , |g; 定义缓存唯一key,通过唯一key来进行hash存取,缓存文件名
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

缓存过期
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, serU ? i 1 V 3 $ver, location
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

4.开启缓存:

(1= $ ! t d X)设置10.8.162.6为缓存服务器:
(2)打开主配置文件:vim /etc/nginx/nginx.conf
proxy_cache_path /app/qianfeng/cache levels=1:2 keys_zone=proxy_cachF @ #e:10m max_size=10g i/ x 1 e 2 / z Enactive=60m use_temp_path=off;
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)


proxy_j U C [ kcache_path命令中的参数及对应配置说明如下:
1.用于缓存的本地磁盘目录是/app/tianyun.me/cache
2.levels在/app/tiany{ N q 3 J G ^ Cun.me/cache/设置了一个两级层次结构的目录。
将大量的文件放z f )置在单个目录中会导致文件访问Y , 3 Y 6 2 ] Y d缓慢,所以针对大多数部署,我们g ) = ?推荐使用两级目录层次结构。
如果levels参数没有配置,则NGINX会将所有的文件放到同一个目录中。
3.keys_zone设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途。将键的Y T O ? 4 % X拷贝放入内存可以使NGINX在不检索磁盘的情况下快速决定一个请求是Ho @ GIT还是MISS,这样大大提高了检v u ] f k ) Z c索速度。一个1MB的内存空间可以存储大约8000个key,那么上面配置的10MB内存空间可以存储差J U O | S r [ 2 *不多80000个key。
4.max_size设置了缓存的上限(在上面的例子中是10G)。这是一个可选项;如果不指定具体值,那就是允许缓存不断增长,占用所有可用的{ / k V .磁盘L T ? u N空间。当缓存达到这个上线s 1 B : P & b J G,处理器便调用cache manager来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下。
5.Y $ ? 5 %inactive指定了项目在不被访问的情况下能够在内存中保持的时间) e s。在上面的例子中,如果一个文件在60分钟之内没有被请求,则缓存管理将会自动w # v O N P 0将其在内存中删除,不管该文件是否过期。该参数默认值为10分钟(10m)。注意,非活动内容有别于过期内容。NGINX不会自动删除由缓存控制头部指定的过期内容(本例中Cache-Control:max-age=120)。过期( ` w 4 c ] S内容只有在inactive指定时间内没有被访问的情况下才会被删除。如果过期内容被访问了,那么NGINX就会将其从原服务器上刷新,并更新对应的inactive计时器。
6.NGINX最初会将注定C 4 R / M _ 7 L ~写入缓存的文件先放入一个临时存储区域, use_temp_path=off命令指示NGINX将在缓存这些文件时将它们写入同一个目录下。我们强烈建议你将参数设置为off来避免在文件系统中不必要的数据拷8 s [ s贝。use_temp_path在NGINX1.7版本和NGINX Plus R6中有所介绍。


(3)在网站主页里面写入:vim /etc/nginx/conf.d/def@ m I %ault.conf
proxy_cache proxy_cachw N C = Z y 2 d Re;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m6 y 3 6;
proxy_cachl h @ Ge_key $host$uri$is_args$args;
add_header Np _ 4 B f a w nginx-Cn N * _ = } cache "$upstream_cache_status";proxy_next_upstream error timeout invalif k / ` A nd_header http_500 http_502 http_503 http_) I u 5 E504;
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)

解释:
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
(4):mkdir -p /app/qianfeng/cache //准备缓存文件的存放目录
(5):systemctl restart nginx //重启服务器
(6):使用PC客户机,再次访问nginx-2服务器 F12
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
(7)通过PC客户机浏览器开发者功能。观察是否命中缓存。F12

(8):未命中miss ; 命中hit
提示:新创建的网页文件,初次访问均为miss。
(9):nginx缓存工作原理
①:未启动缓存 :
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
②:启动缓存第一次查询
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
③:启动~ R g r缓存第二次查询:
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
(9):查看缓存 :ls /app/qianfeng/ca3 ! K # h * j l ]che/
Nginx 高级进阶篇 (Proxy代理,Proxy缓存)
(10)如何清理ngi) U T L 2 9nx_proxy缓存 :rm -rf /app/qianfeng/cache/*