1. nginx 基础优化
gzip 优化
#gzip优化
gzip on;
gzip_min_length 500;
gzip_buffers 4 256k;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
报文头的修改行为:
- 删除所有空值的报文头,空值没有意义的,不需要转发到后台服务器
- 包含下划线 "_" 的报文头会被默认丢弃,如需要开启可以使用指令 underscores_in_headerson 这样做是为了避免在讲header射到CGI变量时混淆,因为在这个过程中,破折号和下划线都呗映射到了下划线.
- Host报文头会被重写为 $proxy_host变量值,这个变量值在 proxy_pass 指令中所包含的域名或IP地址
- Conntection报文头会被修改为close, HTTP1.1协议会被修改为HTTP1.0,这样的行为会让收到服务器端响应后立即关闭,服务器中的连接不会被保持,HTTP1.1变量,可以用 proxy_http_version 指定
修改host报文头例子:
语法:
proxy_set_header field value;
默认语法: proxy_set_header Host $proxy_host; proxy_set_header Connection close;
作用区块: http,server,location
变量值 | 描述 |
---|---|
$proxy_host | 该变量的值是从proxy_paas指令后的url获取,为替换host请求报文头的默认值 |
$http_host | $http_变量群中的一个,$http_后跟小写的报文头名称,所有短划线均由下划线代替。当客户端请求没有有效的“Host”报文头时,这可能会获取失败。 |
$host | 该如果原始请求中包含Host,就是请求中host除端口部分,如果没有,就是server_name |
2. 负载均衡 proxy 优化
2.0 负载均衡
在多台服务器之间有效的分配客户端请求,或者网络负载 通过仅向正常服务器发送请求来确保高可用和可靠性 业务不中断的情况下,按需弹性分配服务器资源 优势: 1. 减少宕机时间 2. 系统高可用 3. 动态扩展 4, 加快访问速度
2.1 负载均衡基本配置
1. 负载均衡基本配置:
http {
upstream leilei {
server 10.0.0.10:8080;
server 10.0.0.11:8080; <----- 后端服务器
}
server {
listen 80;
server_name www.chenleilei.net; <---- 前端接受流量的入口
location / {
proxy_pass http://leilei;
}
}
}
2.2 proxy_cache
proxy_cache 示例:
http {
...
...
proxy_cache_path /www/cache keys_zone=my_cache:10m levels=1:2 max_size=10g inactive=60m use_temp_path=off;
...
...
upsteam leilei {
server 127.0.0.1:8080 max_fails=10;
}
server {
location / {
proxy_cache my_cache;
proxy_pass http://leilei
}
}
2.3 proxy_buff
proxy_buffering : 是否开启buffer 默认开启, 如果关闭的花,服务器发送的数据会直接发送给客户端.
proxy_buffers : 控制一个TCP连接对后端影响的缓冲区数量, 第一个参数: 数量 第二个参数: 大小 默认是 8个缓冲区,每个缓冲区是一页 也就是4k或8k
proxy_buffer_size: 来自后端服务器的响应的初始部分与其余相应分开缓冲,该指令为响应的这一部分设置的缓冲区大小,默认情况下,它和porxy_buffers相同
proxy_busy_buffers_size: 用于 标记 客户端就绪,并因此繁忙的缓冲区最大大小.客户端一次只能从一个缓冲区读取数据,而缓冲区却被放入列队中,以成束的形式发送给客户端,
proxy_max_temp_file_size: 这是请求磁盘上的临时文件的最大大小,他们是再上游响应太大,而无法放入缓冲区时创建的 准备就绪,因此很忙. 客户端一次只能从一个缓冲区读取数据,而缓冲区被放入列队中,以成束的形式发送给客户端. 此伪指令控制 允许处于此状态的缓冲区空间的大小.
2.4 proxy_ignore_client_abort
proxy_ignore_client_abort off; #默认关闭
开启为 on 的情况下: 如果nginx和Linux系统中有buffers,客户端请求的时候会缓存为buffer再给nginx,如果开启后,客户端请求会直接传递给nginx,不再产生buffers,它的效率会更高.
2.5 client_max_body_size
client_max_body_size 1M; #默认1M,客户端请求正文允许的大小,在 "Content-Length" 请求字段中指定,如果请求的大小超过配置的值,则会向用户返回413错误,设置为0 将会金庸对客户端请求主体大小的检查.
2.6 proxy_connect_timeout
proxy_connect_timeout 45; #默认值75 这是设置代理服务器简历连接的超时时间,通常不超过75s
2.7 proxy_send_timeout
proxy_send_timeout 60; #设置请求发送到后端服务器的超时,超时尽在两个连续写操作之间设置,而不用于整个请求的传输,如果后端服务器在此时间内未收到任何信息,它将会被关闭.
2.8 proxy_read_timeout
proxy_read_timeout 90; #设置读取后端响应后的超时时间 连接建立成功后,多久没数据传输被关闭.
2.9 proxy_set_header
proxy_set_header Host $host; # 是把原http请求的Header中的Host字段也放到转发的请求里
proxy_set_header X-Forwarded-Proto $scheme; #将请求转变为https
proxy_set_header X-Real-IP $remote_addr; #引用后端真实IP
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; #记录IP
3.upstream优化
upstream leilei {
#创建一个共享内存区域
zone backend 64k;
#加密算法
#ip_hash;
#后端节点信息
server 127.0.0.1:8080 max_fails=10;
#keep连接缓存.
keepalive 128;
#每个连接最大请求书
keepalive_requests 100;
#长连接超时时间
keepalive_timeout 45s;
3.cpu优化
#自动配置使用进程数
worker_processes auto;
#cpu指定
worker_cpu_affinity 0101 1010;
#文件句柄数
worker_rlimit_nofile 65535;
#进程优先级
worker_priority -20;
4. 事件驱动优化
use epoll;
multi_accept on;
accept_mutex on;
accept_mutex_delay 1ms;
5. 系统内核优化 /etc/sysctl.conf
#fast open 配置 协议级别的优化 其中1表示客户端开启,2表示服务端开启,3表示客户端和服务器同时开启
net.ipv4.tcp_fastopen = 3
#丢包重传上限,到达上限,更新缓存
net.ipv4.tcp_retries1 = 3
# 到达上限,关闭tcp连接
net.ipv4.tcp_retries2 = 15
#TIME_WAIT状态优化
net.ipv4.tcp_fin_timeout = 30
#允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
#可用端口数
net.ipv4.ip_local_port_range 20000 65000
#单个进程较大可以打开的句柄数
fs.file-max = 999999
#当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为10分钟
net.ipv4.tcp_keepalive_time = 600
#减少TIME_WAIT连接状态
net.ipv4.tcp_tw_recycle = 1
#服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求
net.ipv4.tcp_syncookies = 1
#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时。
net.ipv4.tcp_keepalive_time = 600
=======================================
#优化参数:
cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
EOF
sysctl -p
6.缓冲列队
6. nginx后端真实IP获取案例
例子: 服务器获取真实客户端IP
location /leilei {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://example.com;
}
X-Forwarded-Proto | 所使用的传输协议http/https |
---|---|
X-Real-IP | 使用$remote_addr的值,该值为客户端IP地址 |
X-Forwarded-For | 该报文头是一个list,如该请求被多次代理转发,在每次的转发中 每一级转发服务器都可以将自己的IP地址添加到这个list, $proxy_add_x_forwarded_for 这个变量继承来原来报文头中的X-Forwarded-For 报文内容 并且把nginx自己的ip地址添加在最后 |

最后修改:2020-03-06 22:29:26
© 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

发表评论