本篇博客对配置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、超时时间
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;
}参数说明:
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;proxy_cache_key $host$uri$is_args$args: 在这个配置中,proxy_cache_key 被设置为请求的主机名($host)、URI($uri)、是否有参数($is_args)和参数($args)的组合。这样,每个独特的请求都会被缓存到基于这些信息生成的键值对应的位置。这些就是总结出来的Nginx反向代理和反向代理设置缓存的知识点,更新不易,等有时间再更新其他的Nginx知识。
Nginx反向代理官网文档 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。