面试题整理2---Nginx 性能优化全方案

面试题整理2---Nginx 性能优化全方案

    • [1. 调整工作进程数和线程数](#1. 调整工作进程数和线程数)
        • [1.1 调整工作进程数](#1.1 调整工作进程数)
        • [1.2 调整进程的最大连接数](#1.2 调整进程的最大连接数)
    • [2. 配置Gzip压缩](#2. 配置Gzip压缩)
      • [2.2 配置Gzip压缩](#2.2 配置Gzip压缩)
    • [3. 配置缓存策略](#3. 配置缓存策略)
        • [3.1 配置浏览器缓存时间](#3.1 配置浏览器缓存时间)
        • [3.2 配置代理服务器缓存时间](#3.2 配置代理服务器缓存时间)
    • [4. 优化文件访问方式](#4. 优化文件访问方式)
        • [4.1 使用sendfile()函数发送文件数据](#4.1 使用sendfile()函数发送文件数据)
        • [4.2 启用sendfile_max_chunk和tcp_nopush参数](#4.2 启用sendfile_max_chunk和tcp_nopush参数)
    • [5. 优化日志配置](#5. 优化日志配置)
        • [5.1 调整日志级别](#5.1 调整日志级别)
        • [5.2 配置日志切割和压缩](#5.2 配置日志切割和压缩)
    • [6. 针对 Nginx 的系统内核参数调优](#6. 针对 Nginx 的系统内核参数调优)
        • [6.1 增加内核参数调优内容](#6.1 增加内核参数调优内容)
        • [6.2 文件句柄数量限制](#6.2 文件句柄数量限制)
    • [7. 其他优化建议](#7. 其他优化建议)
        • [7.1 使用CDN加速静态资源访问](#7.1 使用CDN加速静态资源访问)
        • [7.2 使用HTTP/2协议提高传输效率](#7.2 使用HTTP/2协议提高传输效率)

Nginx是一款高性能的Web服务器,广泛应用于互联网领域。然而在高并发、大流量的情况下,Nginx的性能可能会受到一定的影响。因此,对Nginx进行性能优化是非常必要的。

1. 调整工作进程数和线程数

Nginx采用异步非阻塞的方式处理请求,这种方式可以充分利用CPU资源,提高并发处理能力。但是,过多的工作进程和线程会导致系统资源浪费,降低性能。因此,需要根据实际情况调整Nginx的工作进程数和线程数。

1.1 调整工作进程数

在描述调整工作进程数时,可以提到如何根据 CPU 核心数来调整。通常情况下,worker_processes 的设置推荐为 CPU 核心数,或者是根据机器的负载情况适当调整。

例如,常见的做法是设置为系统的 CPU 核心数:

nginx 复制代码
worker_processes auto; # 自动根据 CPU 核心数调整
1.2 调整进程的最大连接数

worker_connections 是每个工作进程可以同时处理的连接数。如果服务器负载较高,可以适当增大这个值,典型值为 10242048

例如:

nginx 复制代码
worker_connections 1024; # 每个进程的最大连接数

表示将每个工作进程的线程数设置为1024。

需要注意的是,线程数并不是越大越好,因为线程之间的竞争可能会导致性能下降。因此,需要根据实际情况进行调整。

2. 配置Gzip压缩

2.2 配置Gzip压缩

在Nginx配置文件中添加以下内容:

nginx 复制代码
http {
    ...
    gzip on; # 开启Gzip压缩功能
    gzip_vary on;  # 启用gzip内容编码变化
    gzip_min_length 1k; # 设置最小压缩文件大小为1KB
    gzip_buffers 4 16k; # 设置压缩缓冲区个数和大小
    gzip_http_version 1.1; # 设置支持的HTTP协议版本为1.1
    gzip_comp_level 2; # 设置压缩级别为2(速度与压缩率的平衡)
    gzip_types text/plain application/x-javascript text/css application/xml application/javascript image/svg+xml; # 设置需要压缩的文件类型
    ...
}

3. 配置缓存策略

缓存是提高网站性能的重要手段之一。Nginx提供了多种缓存策略,可以根据实际需求进行配置。以下是一些常见的缓存策略:

3.1 配置浏览器缓存时间

配置浏览器缓存时间的示例没有问题。需要注意的是,对于不同类型的文件,可以设置不同的缓存时间。

例如,图片可以设置较长的缓存时间,而 HTML 文件则可以设置较短的缓存时间:

nginx 复制代码
location ~* \.(jpg|jpeg|gif|png|svg)$ {
    add_header Cache-Control "public, max-age=31536000, immutable"; # 图片缓存1年,且不变动
}

location ~* \.(html|htm)$ {
    add_header Cache-Control "no-cache, must-revalidate"; # HTML文件不缓存
}
3.2 配置代理服务器缓存时间

对于代理缓存,您可以考虑增加一些更灵活的缓存策略,如缓存条件或不同状态码的缓存策略.

例如:

nginx 复制代码
location / {
    proxy_pass http://backend; # 将请求转发到后端服务器
    proxy_cache mycache; # 启用缓存,命名为mycache
    proxy_cache_valid 200 302 10m;  # 正常和重定向响应缓存10分钟
	proxy_cache_valid 404 1m;       # 404错误响应缓存1分钟
	proxy_cache_valid 500 502 503 504 1m;  # 错误响应缓存1分钟
}

4. 优化文件访问方式

在处理静态文件时,Nginx默认会将文件读取到内存中进行处理。这种方式在大文件或高并发情况下会导致内存消耗过大,影响性能。因此,可以采用优化文件访问方式来提高性能。以下是一些优化方法:

4.1 使用sendfile()函数发送文件数据

sendfile_max_chunk 用于控制每次 sendfile() 发送的最大数据块大小,通常对于大文件下载,适当增大这个值可以提高性能。而 tcp_nopush 启用 TCP_CORK 功能,可以优化 TCP 数据包的发送,提高传输效率。

nginx 复制代码
http {
    ...
    sendfile on; # 开启sendfile()函数支持功能(需要操作系统支持)
    ...
}
4.2 启用sendfile_max_chunk和tcp_nopush参数

通过设置sendfile_max_chunktcp_nopush参数,可以控制Nginx在发送文件时的最大分片大小和TCP_CORK选项。

例如:

nginx 复制代码
http {
    ...
    sendfile_max_chunk 1m; # 设置最大分片大小为1MB
    tcp_nopush on; # 开启TCP_CORK选项
    ...
}

5. 优化日志配置

日志是排查问题的重要手段,但是过多的日志会导致磁盘空间不足,影响系统性能。因此,需要对Nginx的日志进行优化。以下是一些优化方法:

5.1 调整日志级别

Nginx支持多种日志级别,如debuginfonoticewarnerror等。可以通过修改Nginx配置文件中的log_level参数来调整日志级别。

例如:

nginx 复制代码
http {
    ...
    error_log /var/log/nginx/error.log warn;  # 错误日志
    access_log /var/log/nginx/access.log combined;  # 访问日志
    ...
}
5.2 配置日志切割和压缩

日志切割和压缩的设置是正确的。如果日志文件过大,您还可以考虑使用日志轮转(logrotate)来定期压缩和删除旧的日志文件。

nginx 复制代码
http {
    ...
    access_log /var/log/nginx/access.log combined buffer=32k flush=1m; # 配置访问日志切割和压缩功能
    error_log /var/log/nginx/error.log warn buffer=32k flush=1m; # 配置错误日志,并设置日志级别为warn
    ...
}

6. 针对 Nginx 的系统内核参数调优

6.1 增加内核参数调优内容

针对高并发场景,需对系统内核参数进行优化,主要包括文件句柄限制、TCP 参数调整等:

内核参数优化示例: 在 /etc/sysctl.conf 中增加以下内容:

conf 复制代码
# 增加文件句柄数量
fs.file-max = 2097152

# 调整网络参数以提高并发性能
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_keepalive_time = 300

生效命令:

bash 复制代码
sysctl -p
6.2 文件句柄数量限制

Nginx 需要足够的文件句柄来处理高并发连接,需调整 ulimit 参数:

/etc/security/limits.conf 中增加:

conf 复制代码
* soft nofile 65535
* hard nofile 65535

7. 其他优化建议

除了上述优化方法外,还有一些其他的优化建议:

7.1 使用CDN加速静态资源访问

CDN(Content Delivery Network)是一种内容分发网络

  • 可以将静态资源缓存到离用户更近的节点上,提高访问速度。
  • 可以使用阿里云、腾讯云等云服务商提供的CDN服务。
7.2 使用HTTP/2协议提高传输效率

HTTP/2协议是一种新的HTTP协议,支持多路复用、头部压缩等功能,可以提高传输效率。需要在Nginx和客户端同时支持HTTP/2协议才能生效。可以通过修改Nginx配置文件中的listen指令来启用HTTP/2协议。例如:

nginx 复制代码
server {
    listen 443 ssl http2; # 启用HTTPS并启用HTTP/2协议支持功能(需要操作系统和SSL库支持)
    ...}
相关推荐
laoliu19963 分钟前
Odoo 18企业版源码 包含 部署教程
运维·服务器
守城小轩28 分钟前
基于Chrome140的Quora账号自动化(关键词浏览)——运行脚本(三)
运维·自动化·chrome devtools·指纹浏览器·浏览器开发
未来之窗软件服务34 分钟前
幽冥大陆(五十五)ASR SetThreadInformation C语言识别到自动化软件
运维·自动化·asr·东方仙盟·操作系统级别错误
开开心心就好41 分钟前
免费卸载工具,可清理残留批量管理启动项
linux·运维·服务器·windows·随机森林·pdf·1024程序员节
Lbwnb丶1 小时前
检测服务器是否是虚拟化,如KVM,VM等
linux·运维·服务器
老猿讲编程1 小时前
【车载信息安全系列4】基于Linux中UIO的HSE应用实现
linux·运维·服务器
鸡吃丸子1 小时前
初识Docker
运维·前端·docker·容器
wanhengidc2 小时前
巨椰 云手机 云游戏稳定运行
运维·服务器·arm开发·游戏·云计算
林义满2 小时前
大促零宕机背后的运维升级:长三角中小跨境电商的架构优化实践
大数据·运维·架构
linweidong2 小时前
顺丰运维面试题及参考答案
运维·nginx·容器·ansible·运维开发·防火墙·python面试