Nginx - 反向代理、缓存详解

2024-08-25 12:20:48 浏览数 (2)

概述

本篇博客对配置Nginx的第二篇,主要介绍Nginx设置反向代理、缓存、和负载均衡三个知识点,在之前的生产实践中遇到的问题进行归纳和总结,分享出来,以方便同学们有更好的成长。

Nginx 核心参数配置

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

1、Cpu和内存

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

代码语言:bash复制
#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合用,加速大文件读取。

代码语言:bash复制
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 反向代理

Nginx得到市场的广泛应用,除了有高性能、高扩展性、功能丰富、配置简单以外,最重要的在于它的代理服务器的特点和功能,通过简单的配置就可以实现反向代理、和负载均衡的作用,是之前的web服务所无法进行匹敌的。

Nginx的反向代理是通过http_proxy模块实现的,在Nginx中设置缓冲区的目的是为了缓存大的请求或响应,减少对后端服务器的频繁请求,从而提高性能。

代码语言:bash复制
location /api {
    proxy_pass http://127.0.0.1:90; # 后端服务器地址
}
设置代理缓冲区

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

代码语言:bash复制
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头信息
代码语言:bash复制
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解析上应该是进入了死循环,后来我换了一种监听方式,就可以正常使用了。

代码语言:bash复制
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。

代码语言:bash复制
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; # 保持连接的超时时间
        }
    }
}

反向代理(缓存)

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

代码语言:bash复制
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";
    }
}

关于缓存参数说明:

代码语言:bash复制
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所对应的页面。

最后

这些就是总结出来的Nginx反向代理和反向代理设置缓存的知识点,更新不易,等有时间再更新其他的Nginx知识。

Nginx反向代理官网文档 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path

0 人点赞