概述
本篇博客对配置Nginx的第二篇,主要介绍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 反向代理
Nginx得到市场的广泛应用,除了有高性能、高扩展性、功能丰富、配置简单以外,最重要的在于它的代理服务器的特点和功能,通过简单的配置就可以实现反向代理、和负载均衡的作用,是之前的web服务所无法进行匹敌的。
Nginx的反向代理是通过http_proxy模块实现的,在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 被设置为请求的主机名( h o s t )、 U R I ( host)、URI( host)、URI(uri)、是否有参数( i s a r g s )和参数( is_args)和参数( isargs)和参数(args)的组合。这样,每个独特的请求都会被缓存到基于这些信息生成的键值对应的位置。- add_header Nginx-Cache "$upstream_cache_status";增加一个http响应头信息,Nginx-Cache,告诉客户端是否已经命中代理缓存。
- proxy_no_cache 这里配置的意思就是当url中匹配到了 index.html , login, register, password 和 reset 时,不缓存该url所对应的页面。
最后
这些就是总结出来的Nginx反向代理和反向代理设置缓存的知识点,更新不易,等有时间再更新其他的Nginx知识。