nginx(六)--Nginx Proxy服务器

  1. 代理原理
  2. Proxy代理
  3. Proxy缓存

1.代理原理

        1.1正向代理

内网客户机通过代理访问互联网。通常要设置代理服务器地址和端口。

        1.2反向代理

外网用户通过代理访问内网服务器。内网服务器无感知。 

2. Proxy代理

        2.1模块:ngx_http_proxy_module

        2.2语法

代理
Syntax:         proxy_pass URL;                        代理的后端服务器URL
Default:     —
Context:     location, if in location, limit_except

缓冲区
Syntax:     proxy_buffering on | off;
Default:    proxy_buffering on;                缓冲开关
Context:     http, server, location
proxy_buffering开启的情况下,nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端
(边收边传,不是全部接收完再传给客户端)。

Syntax:       proxy_buffer_size size;
Default:     proxy_buffer_size 4k|8k;            缓冲区大小
Context:     http, server, location

Syntax:         proxy_buffers number size;
Default:     proxy_buffers 8 4k|8k;                    缓冲区数量
Context:     http, server, location

Syntax:        proxy_busy_buffers_size size;
Default:     proxy_busy_buffers_size 8k|16k;        忙碌的缓冲区大小,控制同时传递给客户端的buffer数量
Context:     http, server, location

头信息
Syntax:         proxy_set_header field value;
Default:     proxy_set_header Host $proxy_host;                设置真实客户端地址
                proxy_set_header Connection close;
Context:     http, server, location

超时
Syntax:         proxy_connect_timeout time;
Default:     proxy_connect_timeout 60s;                    链接超时
Context:     http, server, location

Syntax:         proxy_read_timeout time;
Default:     proxy_read_timeout 60s;
Context:     http, server, location

Syntax:         proxy_send_timeout time;nginx进程向fastcgi进程发送request的整个过程的超时时间
Default:     proxy_send_timeout 60s;
Context:     http, server, location
    buffer 工作原理

1. 所有的proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。

2. proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。

3. 无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。

4. 在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们 被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的 话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer 传输完了会从temp_file里面接着读数据,直到传输完毕。

5. 一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处 在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户 端的buffer数量的。

        2.3启用代理  

        (两台nginx真是服务器)

        (一)1 nginx-1 启动网站(内容)

nginx-1的IP:192.168.26.144
yum install -y nginx
systemctl start nginx

        (二)2 nginx-2 启动代理程序

nginx-2的IP:192.168.26.147
yum install -y nginx
systemctl start nginx

        vim /etc/nginx/conf.d/default.conf

    location / {
.....
proxy_pass http://192.168.100.10:80;
proxy_redirect default;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
    }

proxy_pass :真实服务器
proxy_redirect :如果真实服务器使用的是的真是IP:非默认端口。则改成IP:默认端口。
proxy_set_header:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP :启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For:记录代理地址

proxy_connect_timeout::后端服务器连接的超时时间_发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout :nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接

proxy_buffering on;开启缓存
proxy_buffer_size:proxy_buffer_size只是响应头的缓冲区
proxy_buffers 4 128k; 内容缓冲区域大小
proxy_busy_buffers_size 256k; 从proxy_buffers划出一部分缓冲区来专门向客户端传送数据的地方
proxy_max_temp_file_size 256k;超大的响应头存储成文件。

请注意:proxy_pass http://  填写nginx-1服务器的地址。

proxy_set_header X-Real-IP     启用客户端真实地址(否则日志中显示的是代理在访问网站)

未配置        Nginxbackend 的日志:记录只有192.168.107.112

配置       Nginxbackend 的日志,记录的有192.168.107.16 192.168.107.107 192.168.107.112

proxy_buffers    内容缓冲区域大小

的缓冲区大小一般会设置的比较大,以应付大网页。 proxy_buffers当中单个缓冲区的大小是由系统的内存页面大小决定的,Linux系统中一般为4k。 proxy_buffers由缓冲区数量和缓冲区大小组成的。总的大小为number*size。

若某些请求的响应过大,则超过_buffers的部分将被缓冲到硬盘(缓冲目录由_temp_path指令指定), 当然这将会使读取响应的速度减慢, 影响用户体验. 可以使用proxy_max_temp_file_size指令关闭磁盘缓冲.

        (三)使用PC客户端访问nginx-2服务器地址

        成功访问nginx-1服务器页面

        (四) 观察nginx-1服务器的日志 

192.168.26.147 - - [02/Feb/2023:22:27:08 +0800] "GET / HTTP/1.0" 200 604 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "192.168.26.1"

192.168.26.147 代理服务器地址
192.168.26.1 客户机地址。

访问成功。 记录了客户机的IP和代理服务器的IP。

3.Proxy缓存

        3.1缓存类型

网页缓存 (公网)CDN
数据库缓存 memcache redis
网页缓存  nginx-proxy
客户端缓存 浏览器缓存

        3.2模块:ngx_http_proxy_module

        3.3语法

缓存开关
Syntax:         proxy_cache zone | off;
Default:         proxy_cache off;
Context:     http, server, location

代理缓存
Syntax:     proxy_cache_path path [levels=levels]             keys_zone=name:size[inactive=time] [max_size=size]             [manager_files=number]
Default:  —
Context: http
example:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

缓存维度
Syntax:         proxy_cache_key string;  定义缓存唯一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, server, location
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

        3.4启动缓存

        (一) 延续代理实验

        (二)设置代理服务缓存:

vim /etc/nginx/nginx.conf  :

http {
...

 proxy_cache_path /app/test/cache levels=1:2 keys_zone=proxy_cache:10m max_size=10g inactive=60m use_temp_path=off;

...
}

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

vim /etc/nginx/conf.d/default.conf:

location / {

...

proxy_cache proxy_cache;        Proxy_cache   使用名为 的对应缓存配置

proxy_cache_valid 200 304 12h;      proxy_cache_valid  200 206 304 301 302 12h; 对httpcode为200…的缓存12小时

proxy_cache_valid any 10m;      proxy_cache_valid 设置不同相应码的缓存时间,除了上面的,其他的的存10分钟

proxy_cache_key $host$uri$is_args$args;      proxy_cache_key $uri  定义缓存唯一key,通过唯一key来进行hash存取

add_header  Nginx-Cache "$upstream_cache_status";         add_header:缓存命中情况如何在http头中体现,以及在nginx日志中查看  proxy_cache_path     缓存文件路径

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

proxy_next_upstream 出现502-504或错误,会跳过此台服务器访问下一台服务器

本实验只有一个真实服务器:(扩展)结合LB功能的设置

...

}

mkdir -p /app/test/cache        准备缓存文件的存放目录 

systemctl restart nginx           重启服务器

         使用PC客户机,再次访问nginx-2服务器

        (三) 通过PC客户机浏览器开发者功能。观察是否命中缓存。

        命中hit

        未命中miss

        提示:新创建的网页文件,初次访问均为miss。

        (四)nginx缓存工作原理

        未启动缓存

        启动缓存第一次查询 

        第一次访问,proxy_cache并没有找到对应的缓存文件(未命中缓存MISS),所以当第一次请求完成的同时,proxy_cache会保持缓存:

        启动缓存第二次查询

        同一个url第二次访问,当同一个文件再次到达源站,proxy_cache就会找到其对应的缓存文件(命中缓存HIT)直接返回给请求端,无需再执行php程序

        3.5如何清理nginx_proxy缓存

1.rm删除已缓存的数据
rm -rf /cache/*
2.通过ngx_cache_purge扩展模块清理,需要编译安装nginx 

        nginx  proxy_cache_purge

      location ~ /purge(/.*) {
        allow       all;
        proxy_cache_purge proxy_cache $1$is_args$args;
   }

浏览器访问服务器的清理缓存页面即可。

http://192.168.26.147/purge/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值