Nginx - 反向代理、缓存详解

Nginx 核心参数配置

在写Nginx反向代理时,先总结一些重要的调参参数:

1、Cpu和内存

worker_cpu_affinity(重要优化项):将进程与Cpu绑定,提高了Cpu Cache的命中率,从而减少内存访问损耗,提高程序的速度。

#2核cpu,开启2个进程

worker_processes 2; worker_cpu_affinity 01 10;

#2核cpu,开启4个进程

worker_processes 4; worker_cpu_affinity 01 10 01 10;

#4个cpu,开启4个进程

worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;

#4核cpu,开启2个进程

worker_processes 2; worker_cpu_affinity 0101 1010;

#8核cpu,开启8个进程

worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

2、静态文件

对于静态大文件,启用sendfile加速文件读取,在Linux socket上启用TCP_CORK选项,和sendfile合用,加速大文件读取。

http { sendfile on; tcp_nopush on; }

3、超时时间

  • client_header_timeout:客户端必须在此指定的时间内把请求的header传输完成,请设置5s或以下值,对于抵挡慢速攻击有作用。
  • client_body_timeout:Nginx 2次连续读取客户端请求体的超时时间,请设置5s或以下值。
  • keepalive_timeout:定义保活时间,一般建议60s。
  • proxy_connect_timeout:Nginx连接后端服务器发送请求的超时时间,请设置5s或以下值。
  • proxy_read_timeout:Nginx 2次连续读取后端服务器返回的超时时间,请设置5s或以下值。

Nginx 反向代理

location /api { proxy_pass http://127.0.0.1:90; # 后端服务器地址 }

设置代理缓冲区

当代理服务器往真实服务器转发请求的时候,往往接收到的是请求头的一小部分信息,如果把proxy_buffering 打开,那么proxy会尽可能的去把请求收集完,然后在返回给客户端,这个起到了一个缓存的作用。

location /api {

proxy_pass http://127.0.0.1:90; # 后端服务器地址 proxy_buffering on; proxy_buffer_size 32k; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k; proxy_temp_file_write_size 256k;

}

参数说明:

  • proxy_buffering : 用户控制开启或关闭代理缓冲区。
  • proxy_buffer_size : 通常,该缓冲区大小设置为一个内存页的大小,具体是4k或8k,取决于服务器平台。也可以把它设置的更小,但是没必要设置过大了,因为只是用于缓冲初始部分响应。
  • proxy_buffers:复制代码该参数用于设置从server端读取响应所使用的缓冲区个数和大小。通常默认情况下,单个缓冲区大小设置为一个内存页的大小,如4k或8k。
  • proxy_busy_buffers_size: 在指定大小的缓冲区进入busy状态后将无法再写入,而剩余的缓冲区可以同时继续从server端读取响应,或者将响应写入磁盘临时文件。
  • proxy_max_temp_file_size:该参数用于设置磁盘临时文件的最大size。
  • proxy_temp_file_write_size:该参数用于设置每次写入磁盘临时文件的大小,通常该参数值设置为proxy_buffer_size和proxy_buffers中单个buffer之和,也就是单个内存页的2倍。
设置header头信息

location /api {

proxy_pass http://127.0.0.1:90;

proxy_set_header Host $host; # 设置后端服务器接收到的Host头为原始请求的

Host proxy_set_header X-Real-IP $remote_addr; # 设置X-Real-IP头为客户端的IP地址

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #用来表示HTTP请求端真实IP

}

在之前的实践场景中设置信息头遇到了这个一个场景,如下图,只要设置header信息头就回导致超时,翻查资料,产生的原因可能是如下原因:

1、我当时的反向代理和Nginx部署在同一台服务器上,在Nginx解析上应该是进入了死循环,后来我换了一种监听方式,就可以正常使用了。

location /api {

proxy_pass http://127.0.0.1:90;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

2、Nginx Proxy协议的选择:

Nginx反向代理Http协议时,默认使用的是Http1.0去后端服务器获取响应内容,再返回给客户端。 Http 1.0 和 Http 1.1的一个重要的区别是前者不支持Http Kepp-Alive

http {

         upstream backend {

                keepalive 50; # 必须配置,建议50-100 server http://127.0.0.1:90; # 后端服务器地址

         }

        server {

                        listen 80; location / {

                                proxy_pass http://backend; proxy_http_version 1.1;

                                ## 必须 proxy_set_header Connection "keep-alive"; proxy_keepalive_timeout 60s; # 保持连接的超时时间      

                           }

                }

}

反向代理(缓存)

代理缓存配置语法如下,在做参数的详细说明:

upstream klsgapi { server 127.0.0.1:90; }

proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=klsgapi_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {

listen 80;

server_name localhost;

if ($request_uri ~ ^/(index.html|login|register|password|\/reset)) {

set $cookie_nocache 1;

}

location / {

        proxy_cache klsgapi_cache;

        proxy_pass http://klsgapi; proxy_cache_valid 200 304 12h; proxy_cache_valid any 10m;         proxy_cache_key $host$uri$is_args$args;

        proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; proxy_no_cache         $http_pragma $http_authorization;

        add_header Nginx-Cache "$upstream_cache_status";

        }

}

关于缓存参数说明:

proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=klsgapi_cache:10m max_size=10g inactive=60m use_temp_path=off;

  • /usr/local/nginx/proxy_cache 定义缓存目录
  • levels=1:2 目录分级,按照两层目录的方式来进行分级。
  • keys_zone=chrdai_cache:10m zone空间的名字,后面配置 proxy_cache 后面配的就是这个名字。10m表示开辟key空间的大小,一般1m大概能存放8000个key。
  • max_size=10g 表示缓存目录最大是多大,不能让缓存无限增长占满整个磁盘。当缓存空间满了后,Nginx就会触发淘汰规则,把不常访问的就会淘汰掉。
  • inactive=60m 这个60m是时间单位,表示60分钟,表示如果在60分钟内如果某个缓存没有被访问过,就会把它清理掉。
  • use_temp_path=off 这个是用来存放临时文件的,建议关闭,如果打开的话,Nginx会另外建立一个目录和cache目录两个目录在更新缓存时容易出现一些性能方面的损耗。
  • proxy_cache chrdai_cache 表示我们已经开启了代理缓存,该值是proxy_cache_path中的 keys_zone 的值,如果不想使用代理缓存,将该值配置成 off。
  • proxy_cache_valid 200 304 12h; 状态码为200,304的响应过期时间为 12h。
  • proxy_cache_valid any 10m;除了200和304状态码的其它状态码的缓存时间为10分钟。
  • proxy_cache_key $host$uri$is_args$args: 在这个配置中,proxy_cache_key 被设置为请求的主机名($host)、URI($uri)、是否有参数($is_args)和参数($args)的组合。这样,每个独特的请求都会被缓存到基于这些信息生成的键值对应的位置。
  • add_header Nginx-Cache "$upstream_cache_status";增加一个http响应头信息,Nginx-Cache,告诉客户端是否已经命中代理缓存。
  • proxy_no_cache 这里配置的意思就是当url中匹配到了 index.html , login, register, password 和 reset 时,不缓存该url所对应的页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值