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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue指令-v-for

vue指令-v-for 1、目标2、语法语法 1、目标 列表渲染&#xff0c;所在标签结构&#xff0c;按照数据数量&#xff0c;循环生成 2、语法 v-for "(值变量&#xff0c;索引变量) in 目标结构"示例&#xff1a; <template><div id"app"><di…

安装Anaconda3和MiniConda3

MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&#xff0c;请安装Anaconda。MiniConda3官方版还是一个开源的软件包管理系统和环境管理系统&#xff0c;能够帮助用户安装多个版本的软件…

ChatGPT漫谈(三)

AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…

上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则 点击添加规则 填写信息 3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 <template><div><input type="file" @change="handleFileChange" /&…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵&#xff0c;若的特征值为&#xff0c;则称为矩阵的奇异值。 0.2 SVD(分解)定理 设&#xff0c;则…

神经网络简单介绍

人工神经网络(artififial neural network) 简称神经网络&#xff0c;它是一种模仿生物神经网络结构和功能的非线性数学模型。 神经网络通过输入层接受原始特征信息&#xff0c;再通过隐藏层进行特征信息的加工和提取&#xff0c;最后通过输出层输出结果。 根据需要神经网络可以…

RTPSv2.2(中文版)

实时发布订阅协议 &#xff08;RTPS&#xff09; DDS互操作性 有线协议规范 V2.2 &#xff08;2014-09-01正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.2/PDF 目 录 1 范围Scope 9 2 一致性Conformance 9 3 参考文献References 9 4 术语和定义Terms a…

centos(linux)手动配置ip地址

查看系统 查看ip 进入网卡配置的目录 [root178-119-30-16 ~]# cd /etc/sysconfig/network-scripts/ [root178-119-30-16 network-scripts]# ls ifcfg-ens192 ifdown ifdown-ippp ifdown-post ifdown-sit ifdown-tunnel ifup-bnep ifup-ipv6 ifup-plus…

【Mysql】万字长文带你快速掌握数据库基础概念及SQL基本操作

文章目录 前言一、数据库相关概念1. 什么是数据库2. 数据库的种类3. Mysql 简介4. SQL简介5. 数据库中常见的数据类型 二、SQL基础1. SQL通用语法2. SQL的主要分类3. DDL&#xff08;数据库&#xff0c;表&#xff0c;索引&#xff0c;视图&#xff09;4. DML&#xff08;数据的…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

【每日一题】—— A - 1-2-4 Test (AtCoder Beginner Contest 270)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

HiveSQL SparkSQL中常用知识点记录

目录 0. 相关文章链接 1. hive中多表full join主键重复问题 2. Hive中选出最新一个分区中新增和变化的数据 3. Hive中使用sort_array函数解决collet_list列表排序混乱问题 4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法 5. HiveSQL & SparkSQL中炸裂…

c#[WebMethod]方法接收前端传入的JsonArray的方法

一、第一种方法&#xff1a;可以这样接收前端传入的jsonArray字符串到一个类的数组中&#xff0c;然后遍历该数组取值 这种方法需要创建PointConfig类 class PointConfig{public string ptcrossing { get; set; }public string ptcrossingId { get; set; }public string camId …

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

驱动开发day3 7.25

ioctl控制LED、蜂鸣器、风扇、马达 (为每一个硬件注册一个驱动) 头文件 #ifndef __HEAD_H__ #define __HEAD_H__typedef struct{volatile unsigned int MODER;volatile unsigned int OTYPER;volatile unsigned int OSPEEDR;volatile unsigned int PUPDR;volatile unsigned in…

list与erase()

运行代码&#xff1a; //list与erase() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istr…

JMM是如何保证原子性呢?

3.3.1加锁 锁是一种通用技术&#xff0c;比如Java提供的Synchronized关键字就是锁的一种实现&#xff0c;Synchronized是排他锁/独占锁&#xff0c;就是有你没我的意思&#xff0c;只要其他线程到来访问&#xff0c;发现锁还未释放&#xff0c;就要在外面等待&#xff0c;因为S…

Redis—相关背景

Redis—相关背景 &#x1f50e;Redis—特性In-memory data structures—在内存中存储数据Programmability—可编程性Extensibility—可扩展性Persistence—持久化Clustering—集群High availability—高可用 &#x1f50e;Redis 为什么快&#x1f50e;Redis 的使用场景Real-tim…

【TiDB理论知识06】PD架构与作用

目录 一 PD的架构与功能 PD架构 PD作用 名词解释 路由功能 二 TSO的分配 概念 分配过程 性能问题 高可用问题 三 PD的调度原理 总流程 1 信息收集 2 生成调度 3 执行调度 四 Label的作用 Label的配置 给TiKV打标签 PD配置 一 PD的架构与功能 PD架构 PD集群…

学习Maven Web 应用

Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署已经运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简单的 Java web 应用。 打开命令控制台&#xff0c;…