Nginx性能优化的几个方法
off999 2025-01-07 14:56 20 浏览 0 评论
@[toc]小伙伴们平时使用 Nginx 是否有进行过性能优化呢?还是软件装好了就直接使用呢?
今天松哥和大伙分享几个常见的 Nginx 优化配置。
整体上来说,Nginx 的优化可以从多个层面进行:
- 系统层面
- 配置层面
- 缓存利用
- 压缩策略
- 负载均衡策略
接下来我们就来看看具体该如何做。
一 Nginx 配置优化
- 调整 worker_processes 参数,通常设置为等于服务器的 CPU 核心数。
- 调整 worker_connections 参数,以增加每个 Worker 进程可以打开的连接数。
events {
worker_connections 1024;
}
worker_processes auto;
- 使用 HTTP/2 协议,利用多路复用和头部压缩等特性,提高页面加载速度。
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
}
- 优化 SSL/TLS 配置,如关闭不安全的加密算法、使用 TLS 1.3 等,提高安全性和性能。
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
二 缓存利用
- 启用文件缓存,减少磁盘 I/O 操作。
- 使用代理缓存,缓存后端服务器的响应内容。
- 设置合理的缓存过期策略,通过 Cache-Control 和 Expires 头控制浏览器缓存的有效期,减少请求次数。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
}
}
在上面这段配置中,proxy_cache_path 指令用于配置一个缓存区域,该区域用于存储代理请求的响应内容。这个指令通常在 http 块中使用,并且是 ngx_cache_purge 模块和 ngx_http_proxy_module 模块的一部分。
这项配置中的各参数含义如下:
- /data/nginx/cache:这是缓存文件存储的物理路径。Nginx 将在该目录下存储缓存数据。
- levels=1:2:这定义了缓存文件的目录结构。在这个例子中,1:2 意味着 Nginx 将缓存文件存储在 /data/nginx/cache 下的一级目录和二级目录中。1 代表第一级目录的数量(通常是 3 个,如 data、tmp、html),2 代表第二级目录的数量(通常是 64 个,基于 0 到 63 的数字或字母)。
- keys_zone=my_cache:10m:这定义了一个共享内存区域,用于存储缓存键和元数据。my_cache 是该区域的名称,10m 表示分配的共享内存大小为 10MB。这个区域用于存储缓存的键和相关信息,以便快速检索和验证缓存的有效性。
- max_size=10g:这指定了缓存区域的最大大小,单位是字节。在这个例子中,缓存区域的最大大小为 10GB。当缓存数据达到这个大小时,Nginx 将使用一种策略(通常是最近最少使用 LRU 算法)来移除旧的缓存数据,为新的缓存数据腾出空间。
- inactive=60m:这定义了缓存对象在多久没有被访问后会被认为“非活跃”并可能被移除。在这个例子中,如果一个缓存对象在 60 分钟内没有被访问,它将被认为是非活跃的。这个参数有助于控制缓存中旧数据的生命周期。
- use_temp_path=off:这指定了是否使用临时路径来存储缓存文件。off 表示不使用临时路径,所有的缓存文件都直接存储在指定的 /data/nginx/cache 路径下。如果设置为 on,则 Nginx 会使用一个临时目录来存储缓存文件,在文件被访问后,它们会被移动到永久的缓存目录中。
三 压缩策略
- 启用 Gzip 压缩,减少数据传输量,提高响应速度。
- 根据服务器的 CPU 能力和网络条件平衡压缩级别和最小压缩大小,以达到最佳的性能。
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain application/xml application/json application/javascript text/css;
各项配置的含义分别如下:
- gzip on;:启用 Gzip 压缩。当这个指令被设置为 on 时,Nginx 会尝试压缩响应体并发送给客户端。
- gzip_vary on;:这个指令告诉 Nginx 在响应头中添加Vary: Accept-Encoding。这允许缓存系统(如代理或 CDN)根据客户端是否支持压缩来存储不同的响应版本。
- gzip_proxied any;:这个指令允许 Nginx 对从任何代理服务器接收的响应进行压缩,无论响应是否已经被压缩。any 表示无论原始响应是否被压缩,Nginx 都会尝试再次压缩它。其他选项包括 off(不压缩任何代理的响应)和 expired(只压缩那些已经过期的代理响应)。
- gzip_comp_level 5;:这个指令设置 Gzip 压缩级别。压缩级别范围从 1(最快,压缩比最低)到 9(最慢,压缩比最高)。5 是一个在速度和压缩比之间取得平衡的常用值。
- gzip_min_length 256;:这个指令设置响应体的最小长度,只有当响应体大于或等于这个值时,Nginx 才会对其进行压缩。这里设置为 256 字节,意味着只有当响应体大于或等于 256 字节时,才会进行压缩。
- gzip_types text/plain application/xml application/json application/javascript text/css;:这个指令指定了哪些 MIME 类型的响应应该被压缩。在这个例子中,文本、XML、JSON、JavaScript 和 CSS 类型的响应将被压缩。
四 安全性优化
- 隐藏 Nginx 版本号信息,更改源码隐藏 Nginx 软件名及版本号。
- 修改 Nginx 服务的默认用户,提高安全性。
- 配置 OCSP stapling、ssl_stapling、ssl_stapling_verify 等以增强 SSL/TLS 的安全性。
隐藏版本信息可以提高服务器的安全性,使攻击者难以通过版本信息推断出服务器可能存在的安全漏洞。
要隐藏 Nginx 版本号,有三个办法,一般来说我们使用第一种方式就可以了。
修改配置文件
在 Nginx 的配置文件中,在 http 块中添加以下配置:
server_tokens off;
这样设置后,Nginx 将不会在错误页面上显示版本号。
配置完成之后,保存配置文件并重新加载 Nginx 以应用更改:
nginx -t # 测试配置文件是否正确
nginx -s reload # 重新加载Nginx配置
这种方法可以隐藏错误页面上的版本信息,但可能无法完全隐藏所有响应头中的版本信息 。
修改 Nginx 源码
如果想要从根源上修改 Nginx 版本信息,需要重新编译 Nginx,步骤如下:
- 修改 src/core/nginx.h 文件中的版本定义。
- 修改 src/http/ngx_http_header_filter_module.c 文件中的服务器字符串。
- 修改 src/http/ngx_http_special_response.c 文件中的错误页面底部信息。
修改完这些文件后,需要重新编译 Nginx。这样编译安装后,Nginx 的版本信息将被彻底修改 。
使用第三方模块
如果需要动态修改响应头中的版本信息,可以使用如 headers-more-nginx-module 模块。这个模块允许你动态地添加、修改或删除 Nginx 的响应头。通过这个模块,可以完全控制 Server 响应头的内容 。
选择哪种方法取决于你的具体需求和环境。
如果你只是想简单地隐藏版本信息,修改配置文件可能是最简单的方法。如果你需要更彻底地控制版本信息,可能需要考虑修改源码并重新编译 Nginx。
五 监控和日志优化
- 使用日志分析工具(如 ELK Stack、Graylog 等)来分析和可视化 Nginx 的日志数据。
- 定期维护策略,如更新 Nginx、审查配置文件、备份配置文件等。
- 使用定时任务工具(如 cron)定期清理缓存,使用 Nginx 的 proxy_cache_path 指令中的 inactive 参数设置缓存的过期时间。
日志配置如下:
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
六 系统层面优化
- 调整文件描述符限制(在 /etc/sysctl.conf 中设置):
fs.file-max = 65535
- 调整 TCP 连接队列大小(在 /etc/sysctl.conf 中设置):
net.core.somaxconn = 1024
七 故障转移优化
- 优化健康检查,调整健康检查的频率、超时时间、检查的内容等参数,以更准确地检测服务器的故障。
- 结合监控系统,实时监控服务器的健康状况、请求流量、响应时间等指标,及时发现潜在的问题,并进行预警和处理。
配置健康检查(使用第三方模块 nginx_upstream_check_module):
upstream backend {
server backend1.example.com check;
server backend2.example.com check;
}
小伙伴们还做过哪些 Nginx 性能优化配置呢?欢迎留言讨论。
- 上一篇:如何轻松监控Nginx?
- 下一篇:如何对ESB平台进行性能测试
相关推荐
- 全网第一个讲清楚CPK如何计算的Step by stepExcel和Python同时实现
-
在网上搜索CPK的计算方法,几乎全是照搬教材的公式,在实际工作做作用不大,甚至误导人。比如这个又比如这个:CPK=min((X-LSL/3s),(USL-X/3s))还有这个,很规范的公式,也很清晰很...
- [R语言] R语言快速入门教程(r语言基础操作)
-
本文主要是为了从零开始学习和理解R语言,简要介绍了该语言的最重要部分,以快速入门。主要参考文章:R-TutorialR语言程序的编写需要安装R或RStudio,通常是在RStudio中键入代码。但是R...
- Python第123题:计算直角三角形底边斜边【PythonTip题库300题】
-
1、编程试题:编写一个程序,找出已知面积和高的直角三角形的另外两边(底边及斜边)。定义函数find_missing_sides(),有两个参数:area(面积)和height(高)。在函数内,计算另外...
- Tensor:Pytorch神经网络界的Numpy
-
TensorTensor,它可以是0维、一维以及多维的数组,你可以将它看作为神经网络界的Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便。但它们也不相同,最大的区别就是Numpy...
- python多进程编程(python多进程进程池)
-
forkwindows中是没有fork函数的,一开始直接在Windows中测试,直接报错importosimporttimeret=os.fork()ifret==0:...
- 原来Python的协程有2种实现方式(python协程模型)
-
什么是协程在Python中,协程(Coroutine)是一种轻量级的并发编程方式,可以通过协作式多任务来实现高效的并发执行。协程是一种特殊的生成器函数,通过使用yield关键字来挂起函数的执行...
- ob混淆加密解密,新版大众点评加密解密
-
1目标:新版大众点评接口参数_token加密解密数据获取:所有教育培训机构联系方式获取难点:objs混淆2打开大众点评网站,点击教育全部,打开页面,切换到mobile模式,才能找到接口。打开开发者工具...
- python并发编程-同步锁(python并发和并行)
-
需要注意的点:1.线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock仍然没有被释放则阻塞,即便是拿到执行权限GIL也要立刻...
- 10分钟学会Python基础知识(python基础讲解)
-
看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了。最好还是把代码敲一下。一、函数基础简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。...
- Python最常见的170道面试题全解析答案(二)
-
60.请写一个Python逻辑,计算一个文件中的大写字母数量答:withopen(‘A.txt’)asfs:count=0foriinfs.read():ifi.isupper...
- Python 如何通过 threading 模块实现多线程。
-
先熟悉下相关概念多线程是并发编程的一种方式,多线程在CPU密集型任务中无法充分利用多核性能,但在I/O操作(如文件读写、网络请求)等待期间,线程会释放GIL,此时其他线程可以运行。GIL是P...
- Python的设计模式单例模式(python 单例)
-
单例模式,简单的说就是确保只有一个实例,我们知道,通常情况下类其实可以有很多实例,我们这么来保证唯一呢,全局访问。如配置管理、数据库连接池、日志处理器等。classSingleton: ...
- 更安全的加密工具:bcrypt(bcrypt加密在线)
-
作为程序员在开发工作中经常会使用加密算法,比如,密码、敏感数据等。初学者经常使用md5等方式对数据进行加密,但是作为严谨开发的程序员,需要掌握一些相对安全的加密方式,今天给大家介绍下我我在工作中使用到...
- 一篇文章搞懂Python协程(python协程用法)
-
前引之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线...
- Python开发必会的5个线程安全技巧
-
点赞、收藏、加关注,下次找我不迷路一、啥是线程安全?假设你开了一家包子铺,店里有个公共的蒸笼,里面放着刚蒸好的包子。现在有三个顾客同时来拿包子,要是每个人都随便伸手去拿,会不会出现混乱?比如第一个顾...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python字典遍历 (54)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (60)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)