Nginx性能优化配置
一、全局优化
# 工作进程数
worker_processes auto; # 建议 CPU核心数|CPU线程数# 最大支持的连接(open-file)数量;最大值受限于 Linux open files (ulimit -n)
# 建议公式:worker_rlimit_nofile > worker_processes * worker_connections
worker_rlimit_nofile 65535;events {use epoll; # 高效的IO多路复用(RedHat6+ 都支持 epoll)multi_accept on; # 设置一个进程是否同时接受多个网络连接worker_connections 10240; # 单个工作进程,可承载的最大连接数;
}
二、 与客户端之间的优化
http {###### 零拷贝技术sendfile on; # 开启不读到(应用本身)内存,直接通过系统发出数据#sendfile_max_chunk 2m; # 每个进程每次调用传输数量不能大于设定的值,默认0为无上限。###### 网络传输# on:累积到一定容量的数据再发,发送次数少# off:有数据就发,发送次数多,占用网络资源tcp_nopush on;###### 长连接;用户端比较分散,keepalive 默认值已经足够,个人不建议重设###### 响应数据 开启压缩模式gzip on;gzip_vary on; # 为兼容老浏览器,追加到Header的压缩标注gzip_proxied any; # 所有代理请求都压缩,也可指定类型gzip_comp_level 2; # 压缩等级1-9(比例)等级越大 压缩越高 越耗CPUgzip_min_length 128; # 压缩前提,当返回内容大于指定时再压缩gzip_types text/css text/xml image/svg+xml; # 指定压缩的文件类型;更多压缩项可参考 mime.types
}
三、 与后端服务之间的优化
http {upstream backend_A {# ...# 长连接;所有请求汇聚到后端服务器,并发时是有必要在此基础上重配 keepalive 的# 以下 keepalive 需要 http 1.1 版本,并且 header connection closekeepalive 100; # 每个Worker与后端的连接池中,保持指定量的空闲连接数(QPS的10%)keepalive_time 1h; # 每个长连接的(忙碌+空闲)总时长,超出后强制失效keepalive_timeout 60s; # 每个长连接,最大空闲时长,超出后自动关闭长连接keepalive_requests 1000; # 每次长连接支持的 Request 次数,超出后自动关闭}server {location \ {proxy_pass http://backend_A;proxy_http_version 1.1; # 1.1 支持 keep-liveproxy_set_header connection ""; # 覆盖客户端的连接头}}
}
四、 扩展优化
多级缓存:通过 Nginx 实现各种缓存的配置,浏览器缓存、CDN缓存、Nginx内存、代理缓存、后端服务应用缓存等。
资源静态化 ssi 模块:请求结果生成静态页,Nginx设置拦截,更多的请求直接读静态页后返回;减少后端请求,定时生成静态页。
静态资源同步 rsync:每台服务都安装,监控目录变化,把生成的静态页推送到多台服务器。
合并请求 concat 第三方模块:将多个静态资源文件 合并为一次请求加载完成,减少并发量;淘宝示例:??xxx.js,yyy.js,zzz.js
五、优化项梳理
1、worker_processes 工作进程最大连接数
worker进程数(worker_processes )默认为 1 ,单进程最大连接数(worker_connections)为1024
-
每个 worker 进程都是单线程的进程,它们会调用各个模块以实现多种多样的功能
-
如果这些模块确认不会出现阻塞式的调用,那么有多少CPU内核就应该配置多少个进程
-
反之,如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程
例如:如果业务方面会致使 用户请求 大量读取 本地磁盘上的静态资源文件,而且服务器上的内存较小,以至于 大部分的请求 访问 静态资源文件 时,都必须读取磁盘(磁头的寻址是缓慢的),而不是内存中的磁盘缓存,那么磁盘 IO 调用可能会 阻塞 住 worker 进程少量时间,进而导致服务整体性能下降。
运行工作进程个数一般设置CPU的核心或者核心数x2
如果不了解CPU的核数,可以top命令后按1来看
# 编辑ng的配置文件
> vi /usr/local/nginx/conf/nginx.conf
> worker_processes 4;
# 保存退出
# 重新加载ng配置文件
> /usr/local/nginx/sbin/nginx-s reload
# 查看进程情况
> ps -aux | grep nginx |grep -v grep
2、worker_cpu_affinity工作进程绑定CPU内核
假定每一个 worker 进程都是非常繁忙的,如果多个 worker 进程都在抢同一个 CPU,那么这就会出现 同步问题。
反之,如果每一个 worker 进程都独享一个 CPU,就在 内核的调度 策略上实现了完全的 并发。
注意:worker_cpu_affinity 配置仅对 Linux 操作系统有效。
# 如:如果有`2`颗`CPU`内核,就可以进行如下配置
worker_processes 2;
worker_cpu_affinity 10 01;# 如:如果有`4`颗`CPU`内核,就可以进行如下配置
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;# 如:如果有`8`颗`CPU`内核,就可以进行如下配置
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
8个以上性能不会再提升了,而且稳定性变得更低,所以worker_processes 最多开8个就可以了。
3、worker_rlimit_nofile打开文件的最大限制
每个进程的最大文件打开数,所以最好与ulimit -n的值保持一致。
linux一切皆文件,每一次用户发起请求就会生成一个文件句柄,文件句柄可以理解为就是一个索引,所有文件句柄就会随着请求量的增多,而进程调用的频率增加,文件句柄的产生就会越多,系统对文件句柄默认的限制是1024个,对于nginx来说需要改大一点。
4、work_connections连接数
work_connections表示每个worker(子进程)可以创建多少个连接,默认1024,最大是65535
worker_connections的数值根据操作系统允许打开的最大文件数目设定。
从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法:
-
nginx作为http服务器
max_clients = worker_processes * worker_connections/2
-
nginx作为反向代理服务器:
max_clients = worker_processes * worker_connections/4
为啥除以4呢?
因为在反向代理时,浏览器会和nginx建立2条连接,nginx也会建立对应的2条连接到后端服务器,所以需要除以4。
5、连接超时时间设置
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。
keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timeout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
-
keepalive_timeout:客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
-
tcp_nodelay:也是防止网络阻塞,需要keepalived参数。
-
client_header_buffer_size:客户端请求头部的缓冲区大小,这个可以根据系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
-
open_file_cache:这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
-
open_file_cache_valid:这个是指多长时间检查一次缓存。
-
open_file_cache_min_uses:open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的。
-
client_header_timeout:设置请求头的超时时间。也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误。
-
client_body_timeout:设置请求体的超时时间。可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示。
-
reset_timeout_connection:告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
-
send_timeout:响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接。
-
server_tokens:关闭nginx版本,符合等保要求。
-
client_max_body_size:上传文件大小限制。
6、GZIP压缩设置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript;
gzip_vary on;
-
gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K。
-
gzip_buffers:压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
-
gzip_http_version:压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
-
gzip_comp_level:压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
-
gzip_types text/css text/xml application/javascript:用来指定压缩的类型,text/html类型总是会被压缩
-
gzip_vary: varyheader支持,此选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据。
注意:gzip_types 默认是不压缩css和js的。
7、proxy超时设置
-
proxy_connect_timeout:后端服务器连接的超时时间
-
proxy_send_timeout:后端服务器数据回传时间
-
proxy_read_timeout:连接成功后,等候后端服务器响应时间
-
proxy_buffers:4是数量,32k是大小。该指令设置缓存区的大小和数量,从被代理的后端服务器取得的第一部分响应内容,会放置到这里,默认情况下,一个缓存区的大小等于内存页面大小,可能是4k也可能是8k取决于平台。
-
proxy_busy_buffers_size:nginx分配一部分缓冲区来用于向客户端发送数据。大小通常是proxy_buffers单位大小的两倍,默认是8k/16k。
8、proxy_set_header配置
它用来设定被代理服务器接收到的header信息。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。
也可以加一写安全校验字段。
Access-Log缓存
# 工作进程数
worker_processes auto; # 建议 CPU核心数|CPU线程数# 最大支持的连接(open-file)数量;最大值受限于 Linux open files (ulimit -n)
# 建议公式:worker_rlimit_nofile > worker_processes * worker_connections
worker_rlimit_nofile 65535;events {use epoll; # 高效的IO多路复用(RedHat6+ 都支持 epoll)multi_accept on; # 设置一个进程是否同时接受多个网络连接worker_connections 10240; # 单个工作进程,可承载的最大连接数;
}
9、Access-Log缓存
access_log /mnt/logs/nginx-access.log buffer=64k gzip flush=1m
-
buffer 设置指定要使用的缓冲区的大小
-
flush 多长时间后把缓冲区中的条目写入文件
记录日志的I/O开销比较高,可以利用这个功能,降低写日志文件的频率,从而提高性能。
10、Expires缓存
# 增加客户端过期请求,可以路径,也可以是文件夹
location ~ ^/(images|javascript|js|css|media|static)/ {expires 360d;
}
一般通过这个配置,缓存图片/JS/CSS等静态文件到浏览器,减少每次的网络请求,加快网页浏览速度。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=page_cache:10m inactive=1d max_size=200M;
server {location / {proxy_cache page_cache; proxy_pass http://backend;proxy_cache_bypass $http_pragma;proxy_cache_purge page_cache "$scheme$request_method$proxy_host$request_uri";proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;proxy_cache_min_uses 90;}
}
11、静态资源防盗链
防盗链:通过在其自身网站程序里调用其他网站的资源,然后在自己的网站上显示这些调用的资源,使得被盗链的那一端消耗带宽资源。
-
通过 HTTP referer实现防盗链
-
水印,品牌宣传,你的带宽,服务器足够
-
防火墙,直接控制,前提是你知道IP来源
-
防盗链策略下面的方法是直接给予404的错误提示
#第一种,匹配后缀
location ~ .*.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ { # 指定需要使用防盗链的媒体资源
access_log off; # 不记录日志
expires 15d; # 设置缓存时间
valid_referers none blocked *.test.com *.abc.com; # 表示仅允许这些域名访问上面的媒体资源
if ($invalid_referer) { # 如果域名不是上面指定的地址就返回403
return 403
}
}
#第二种,绑定目录
location /images {
root /web/www/img;
vaild_referers none blocked *.test.com *.abc.com;
if ($invalid_referer) {
return 403;
}
}
参数说明
-
none :不存在的Referer头(直接访问,比如直接在浏览器打开一个图片)
-
blocked :意为根据防火墙伪装Referer头,如:“Referer:XXXX”
-
server_names :为一个或多个服务器的列表
12、非法user_agent拦截
进入到Nginx安装目录下的conf目录,编写代码为 agent_deny.conf
切换到ng安装目录
> cd ../nginx/conf
# 新配置文件
> vim agent_deny.conf
#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient))
{
return 403;
}
#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" )
{
return 403;
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$)
{
return 403;
}
将此文件添加到nginx.conf
> cd ../
> vi nginx.conf
include agent_deny.conf
# 保存,退出,重启
> ./nginx -s reload
相关文章:

Nginx性能优化配置
一、全局优化 # 工作进程数 worker_processes auto; # 建议 CPU核心数|CPU线程数# 最大支持的连接(open-file)数量;最大值受限于 Linux open files (ulimit -n) # 建议公式:worker_rlimit_nofile > worker_processes * worker_connections…...

杭州多校2023“钉耙编程”中国大学生算法设计超级联赛(4)
1003Simple Set Problem 首先将元素的值 x 以及所属集合的编号 y 作为二元组 (x,y) 存入数组,然后按照 x 升序排列, 之后使用双指针扫描数组(尺取法),当区间内出现了所有编号时更新答案的最小值, #includ…...

音视频入门之音频采集、编码、播放
作者:花海blog 今天我们学习音频的采集、编码、生成文件、转码等操作,我们生成三种格式的文件格式,pcm、wav、aac 三种格式,并且我们用 AudioStack 来播放音频,最后我们播放这个音频。 使用 AudioRecord 实现录音生成…...

在 Linux 系统中,如何发起POST/GET请求
在 Linux 系统中,可以使用命令行工具 curl 或者 wget 来发送 POST 请求。这两个工具都是非常常用的命令行工具,可以通过命令行直接发送 HTTP 请求。 1. 使用 curl 发送 POST 请求: curl -X POST -H "Content-Type: application/json&q…...

文心一言大数据模型-文心千帆大模型平台
官网: 文心千帆大模型平台 (baidu.com) 文心千帆大模型 (baidu.com) 模型优势 1、模型效果优:所需标注数据少,在各场景上的效果处于业界领先水平 2、生成能力强:拥有丰富的AI内容生成(AIGC)能力 3、应用…...

django学习笔记(1)
django创建项目 先创建一个文件夹用来放django的项目,我这里是My_Django_it 之后打开到该文件下,并用下面的指令来创建myDjango1项目 D:\>cd My_Django_itD:\My_Django_it>"D:\zzu_it\Django_learn\Scripts\django-admin.exe" startpr…...

postgresql主从搭建
postgresql主从搭建 主从服务器分别安装好postgresql 主库 创建数据库热备帐号replica,密码123456为例,则执行以下命令 create role replica login replication encrypted password 123456;打开 pg_hba.conf 配置文件,设置 replica 用户白…...

将Parasoft和ChatGPT相结合会如何?
ChatGPT是2023年最热门的话题之一,是OpenAI训练的语言模型。它能够理解和生成自然语言文本,并接受过大量数据的训练,包括用各种编程语言编写的许多开源项目的源代码。 软件开发人员可以利用大量的知识库来协助他们的工作,因为它具…...

Go text/template详解:使用指南与最佳实践
I. 简介 A. 什么是 Go text/template Go text/template 是 Go 语言标准库中的一个模板引擎,用于生成文本输出。它使用类似于 HTML 的模板语言,可以将数据和模板结合起来,生成最终的文本输出。 B. Go text/template 的优点 Go text/templa…...

Stable Diffusion在各种显卡上的加速方式测试,最高可以提速211.2%
Stable Diffusion是一种基于扩散模型的图像生成技术,能够从文本生成高质量的图像,适用于CG,插图和高分辨率壁纸等领域。 但是它计算过程复杂,使得它的生成速度较慢。所以研究人员就创造了各种提高其速度的方式,比如Xf…...

Java读取外链图片忽略ssl验证转为base64
最近在对接外部接口时遇到返回的图片所在的服务器全都没有ssl证书,导致在前端直接用img标签展示时图片开裂。于是转为通过后端获取,绕过ssl验证之后转为base64返回。记录一下代码段。 package com.sy.ai.common.utils;import cn.hutool.core.codec.Base…...

系统架构设计师 10:软件架构的演化和维护
一、软件架构演化 如果软件架构的定义是 SA{components, connectors, constraints},也就是说,软件架构包括组件、连接件和约束三大要素,这类软件架构演化主要关注的就是组件、连接件和约束的添加、修改与删除等。 二、面向对象软件架构演化…...

Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2023 年 7 月更新)
Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2023 年 7 月更新) 在虚拟机、Mac 电脑和 TPM 不符合要求的旧电脑上安装 Windows 11 的通用方法总结 请访问原文链接:https://sysin.org/blog/windows-11-no-tpm/,查看最新版。原创作品…...

EXCEL,如何比较2个表里的数据差异(使用数据透视表)
目录 1 问题: 需要比较如下2个表的内容差异 1.1 原始数据喝问题 1.2 提前总结 2 使用EXCEL公式方法 2.1 新增辅助列: 辅助index 2.2 具体公式 配合条件格式 使用 3 数据透视表方法 3.1 新增辅助列: 辅助index 3.2 需要先打开 数据透视表向导 …...
字节抖音小程序,使用 uniapp 调起内置支付
字节抖音小程序,使用 uniapp 调起内置支付 第一步:提交订单 后端通过抖音预下单接口,提交支付订单信息。 预下单接口_小程序_抖音开放平台预下单接口 提交支付订单信息。 ## 使用限制 无 ## 接口说明 预下单接口需要保证同一app_id下每笔订…...

django模板继承和组件了解
1、模板继承 什么时候需要用到模板呢,比如我们在开发的页面的导航栏,你点不同的功能页面这个导航栏都是一样的,如果每个页面都要加上这个导航条会写重复代码,而且如果导航条有变化,每个页面都要修改,这个是…...

首屏优化,给以图片为背景的元素增加相似背景,优化用户体验,background-image 绘制规则
每日鸡汤:每个你想要学习的瞬间都是未来的你向自己求救 假设你的项目首页有个大大的图片作为背景,那么这个图片肯定会在网络不好的时候加载出来很慢,导致用户回看到一大片白屏,这样很影响体验。这也是老生常谈的首屏优化的问题。例…...

【用户体验分析报告】 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包预加载方案来了!
首先,我们看一些针对《如何提升应用首屏加载体验》的文章,提到的必不可少的措施,便是减少首屏幕加载资源的大小,而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件与 react 组件实现的一套研发高度自定义…...

idea 关闭页面右侧预览框/预览条
idea 关闭页面右侧预览框 如图,预览框存在想去除 找了好多方法,什么去掉“setting->appearance里的show editor preview tooltips”的对钩;又或者在该预览区的滚动条上右键,“取消勾选show code lens on scrollbar hover”。都…...

CSS3 Flexbox
Flex 是 Flexible Box 的缩写,意为弹性盒子布局。 CSS3中一种新的布局模式:W3C在2009年提出的一种布局方案,一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。其目的是提供一种更加有效的方式来对一个容器…...

东南大学轴承故障诊断(Python代码,CNN模型,适合复合故障诊断研究)
运行代码要求: 代码运行环境要求:Keras版本>2.4.0,python版本>3.6.0 本次实验主要是在两种不同工况数据下,进行带有复合故障的诊断实验,没有复合故障的诊断实验。 实验结果证明,针对具有复合故障的…...

ubuntu--Motrix
Motrix官网 https://motrix.app/ 适用于windows和ubuntu 资源链接 链接: https://pan.baidu.com/s/16ka-w30BXJn066absXJXCA 密码: cds2 下载上面的资源,打开终端,安装Motrix sudo dpkg -i XXX.deb 在ubuntu安装好chrome,然后打开设置中…...

PHP 3des加解密新旧方法可对接加密
一、旧3des加解密方法 <?php class Encrypt_3DES {//加密秘钥,private $_key;private $_iv;public function __construct($key, $iv){$this->_key $key;$this->_iv $iv;}/*** 对字符串进行3DES加密* param string 要加密的字符串* return mixed 加密成…...

【朴素贝叶斯-新闻主题分类】
朴素贝叶斯对新闻进行分类 朴素贝叶斯算法是一种常用的文本分类方法,特别适用于自然语言处理任务,如新闻分类。在这篇博客中,我们将使用Python的scikit-learn库来实现朴素贝叶斯算法,并将其应用于新闻分类任务。 数据准备 首先…...

安卓面试问题记录
目录 1. JNI和NDK1.谈谈你对JNI和NDK的理解2.简要的JNI调用过程:2. 线程、同步、异步1.Java创建线程的方式有几种?start()方法和 run()方法的区别2.Handler 机制和原理3.为什么在子线程中创建Handler会抛异常?4.Android中的ANR的解决方法5.intentservice有什么优点?6.okhtt…...

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践
golang代码: package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…...

听力词汇笔记(6级)
2022年9月六级 1.personality traits:人格特征 2.all of this notwithstanding:尽管如此 3.come under:受到 4.scrutiny:关注 5.highly responsive to:对....高度敏感 6.preteen year:青春期前 7.susceptible to:受....影响 8.take sharp preced…...

【JVM】详细解析java创建对象的具体流程
目录 一、java创建对象的几种方式 1.1、使用new关键字 1.2、反射创建对象 1.2.1、Class.newInstance创建对象 1.2.2、调用构造器再去创建对象Constructor.newInstance 1.3、clone实现 1.4、反序列化 二、创建对象的过程 2.1、分配空间的方式 1、指针碰撞 2、空闲列表 …...

kafka怎么用代码读取数据
Kafka可以通过Java语言中的Kafka客户端库来读取数据。以下是一个简单的Java代码示例,通过Kafka Consumer API从Kafka集群中读取数据: java import java.util.Properties; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.…...

网关与路由器的区别
仅需2分钟,彻底明白网关的工作原理_哔哩哔哩_bilibili网关_百度百科 一、网关的概念 网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域…...