面试题整理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库支持)
    ...}
相关推荐
Menior_1 分钟前
[Linux] vim及gcc工具
linux·运维·vim
weixin_4738947723 分钟前
前端服务器部署分类总结
前端·网络·性能优化
不念霉运28 分钟前
2025年中国DevOps工具选型指南:主流平台能力横向对比
运维·ci/cd·团队开发·devops
珹洺40 分钟前
Jsp技术入门指南【十四】实现基于MySQL+JDBC+JSP数据库验证的登录界面与登录跳转功能
java·运维·数据库·mysql·servlet
珹洺1 小时前
计算机操作系统(七)详细讲解进程的组成与特性,状态与转换
运维·服务器·计算机网络
alden_ygq1 小时前
nginx 出现大量connect reset by peer
服务器·网络·nginx
EulerBlind1 小时前
【运维】MacOS蓝牙故障排查与修复指南
运维·macos
大大小小聪明1 小时前
Nginx核心功能及同类产品对比
运维·nginx
wangchen_02 小时前
linux-进程信号的产生
linux·运维·服务器
乌鸦乌鸦你的小虎牙2 小时前
linux 抓包工具tcpdump使用小记(使用时注意权限和系统资源)
linux·运维·tcpdump