编程 Nginx 性能优化有这篇就够了!

2024-11-19 01:57:41 +0800 CST views 578

Nginx 性能优化有这篇就够了!

Nginx 作为高性能的 Web 服务器和反向代理服务器,被广泛应用于各种规模的互联网项目中。为了充分发挥 Nginx 的性能优势,进行合理的配置优化至关重要。本文将详细介绍 10 个实用的 Nginx 性能优化技巧,助你打造高效稳定的 Web 服务。

1. Nginx 工作进程数量配置

最佳实践:将 Nginx 的工作进程数设置为 CPU 核心数或核心数的两倍。

如何查看 CPU 核心数

  • 使用 top 命令后按 1 键查看。
  • 或者查看 /proc/cpuinfo 文件:
    grep ^processor /proc/cpuinfo | wc -l
    

配置示例

[root@lx~]# vi /usr/local/nginx1.10/conf/nginx.conf
worker_processes 4;
[root@lx~]# /usr/local/nginx1.10/sbin/nginx -s reload
[root@lx~]# ps -aux | grep nginx | grep -v grep
root      9834  0.0  0.0  47556  1948 ?        Ss   22:36   0:00 nginx: master process nginx
www      10135 0.0  0.0  50088  2004 ?        S    22:58   0:00 nginx: worker process
www      10136 0.0  0.0  50088  2004 ?        S    22:58   0:00 nginx: worker process
www      10137 0.0  0.0  50088  2004 ?        S    22:58   0:00 nginx: worker process
www      10138 0.0  0.0  50088  2004 ?        S    22:58   0:00 nginx: worker process

2. Nginx CPU 亲和力配置

合理配置 CPU 亲和力,可以提高 Nginx 的处理效率,避免多个进程在同一 CPU 上竞争资源。

4 核配置示例

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

8 核配置示例

worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

注意

  • worker_processes 最多开启 8 个进程,超过后性能提升不明显且稳定性下降。

3. Nginx 最大打开文件数

配置指令

worker_rlimit_nofile 65535;

该指令设置每个 Nginx 进程最大可打开的文件描述符数。建议与系统的 ulimit -n 值保持一致。

系统配置
编辑 /etc/security/limits.conf

*   soft nofile   65535
*   hard nofile   65535

注意:修改后需要用户重新登录才能生效。

4. Nginx 事件处理模型

推荐配置

events {
    use epoll;
    worker_connections 65535;
    multi_accept on;
}

说明

  • use epoll:采用高效的 epoll 事件模型,适用于 Linux。
  • worker_connections:单个 worker 进程允许的最大连接数,设置为 65535 足够应对高并发。
  • multi_accept
    • on:一个连接只能被一个 worker 唤醒,适合高吞吐量场景。
    • off:多个 worker 并行处理连接,适合连接数较少时降低负载。

5. 开启高效传输模式

配置示例

http {
    include mime.types;
    default_type application/octet-stream;
    ...
    sendfile on;
    tcp_nopush on;
    ...
}

配置说明

  • sendfile on:开启高效文件传输模式,减少用户态与内核态的切换。
  • tcp_nopush on:与 sendfile 配合使用,减少网络报文段数量,提升传输效率。

6. 连接超时时间配置

配置示例

http {
    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_timedout_connection on;
    send_timeout 15;
    server_tokens off;
    client_max_body_size 10m;
}

配置项说明

  • keepalive_timeout:保持客户端连接的超时时间,超过后断开连接。
  • tcp_nodelay:防止网络阻塞,需与 keepalive_timeout 配合使用。
  • client_header_buffer_size:设置请求头缓冲区大小,通常设置为系统分页大小(如 4k)。
  • open_file_cache 系列指令:优化文件缓存,减少磁盘 I/O。
  • client_header_timeoutclient_body_timeout:请求头和请求体的超时时间,防止资源被长时间占用。
  • reset_timedout_connection:自动关闭无响应的客户端连接,释放资源。
  • send_timeout:响应客户端的超时时间,确保连接活跃。
  • server_tokens off:隐藏 Nginx 版本信息,增强安全性。
  • client_max_body_size:限制上传文件的大小,防止过大文件占用资源。

7. FastCGI 调优

配置示例

http {
    ...
    fastcgi_connect_timeout 600;
    fastcgi_send_timeout 600;
    fastcgi_read_timeout 600;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_temp_path /usr/local/nginx1.10/nginx_tmp;
    fastcgi_intercept_errors on;
    fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=1d max_size=10g;
    
    server {
        ...
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_cache cache_fastcgi;
            fastcgi_cache_valid 200 302 1h;
            fastcgi_cache_valid 301 1d;
            fastcgi_cache_valid any 1m;
            fastcgi_cache_min_uses 1;
            fastcgi_cache_key "$host$request_uri";
            ...
        }
    }
}

配置项说明

  • fastcgi_connect_timeoutfastcgi_send_timeoutfastcgi_read_timeout:设置与 FastCGI 后端的连接和读取超时时间。
  • fastcgi_buffer_sizefastcgi_buffers:配置 FastCGI 响应的缓冲区大小和数量,优化内存使用。
  • fastcgi_busy_buffers_sizefastcgi_temp_file_write_size:配置繁忙状态下的缓冲区和临时文件写入大小,防止 502 错误。
  • fastcgi_temp_path:设置 FastCGI 缓存的临时文件路径。
  • fastcgi_intercept_errors on:拦截 FastCGI 错误,并使用 Nginx 的 error_page 处理。
  • fastcgi_cache_path:定义 FastCGI 缓存路径和参数,减少与 PHP 和数据库的通信次数,提高性能。

总结

  • proxy_cache:缓存后端服务器的内容,适用于静态和动态内容。
  • fastcgi_cache:专门缓存 FastCGI 生成的内容,如 PHP 页面,减轻后端压力。

8. Gzip 压缩优化

配置示例

http {
    ...
    gzip on;
    gzip_min_length 2k;
    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 application/x-javascript application/xml;
    gzip_vary on;
    gzip_proxied any;
    ...
}

配置项说明

  • gzip on:开启 Gzip 压缩功能,节省带宽,提高传输速度。
  • gzip_min_length 2k:设置启用压缩的最小文件大小,避免小文件压缩后体积变大。
  • gzip_buffers 4 32k:配置压缩缓冲区大小,优化内存使用。
  • gzip_http_version 1.1:设置支持的 HTTP 版本,确保大多数浏览器兼容。
  • gzip_comp_level 6:设置压缩级别,平衡压缩率和 CPU 消耗。
  • gzip_types:指定需要压缩的 MIME 类型,避免压缩图片、视频等不适合压缩的类型。
  • gzip_vary on:支持 Vary: Accept-Encoding 头,优化 CDN 和缓存服务器的处理。
  • gzip_proxied any:对所有通过代理的请求启用 Gzip 压缩。

9. Expires 缓存优化

配置示例

server {
    ...
    location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
        expires 30d;
        access_log off;
    }

    location ~* \.(js|css)$ {
        expires 7d;
        access_log off;
    }
    ...
}

配置项说明

  • expires:设置静态资源的缓存时间,减少重复请求,节省带宽。
    • 图片类资源(如 .jpg, .png 等)设置较长的缓存时间(如 30 天)。
    • 脚本和样式表(如 .js, .css)设置中等的缓存时间(如 7 天)。
  • access_log off:关闭访问日志记录,减少 I/O 开销。

优缺点

  • 优点
    • 降低带宽消耗,节省成本。
    • 提升用户访问体验,减少加载时间。
    • 减轻服务器压力,提高性能。
  • 缺点
    • 缓存内容更新后,用户可能仍然看到旧内容。
  • 解决办法
    • 缩短缓存时间。
    • 对更新频繁的资源使用版本号或哈希值进行命名,确保用户获取最新资源。

不建议缓存的内容

  • 动态统计工具。
  • 更新频繁的文件(如网站 logo)。

10. 内核参数优化

优化步骤
编辑 /etc/sysctl.conf 文件,添加或修改以下内核参数:

fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000

参数说明

  • fs.file-max:设置系统最大打开文件数,影响并发连接数。
  • net.ipv4.tcp_max_tw_buckets:允许的 TIME_WAIT 套接字最大数量,防止连接耗尽。
  • net.ipv4.ip_local_port_range:允许使用的本地端口范围,增加可用端口数。
  • net.ipv4.tcp_tw_recyclenet.ipv4.tcp_tw_reuse:快速回收和重用 TIME_WAIT 套接字,减少资源占用。
  • net.core.somaxconn:增加监听队列长度,防止连接被拒绝。
  • net.core.netdev_max_backlog:增加网络设备接收队列长度,提升高并发处理能力。
  • net.ipv4.tcp_rmemnet.ipv4.tcp_wmem:调整 TCP 接收和发送缓冲区大小,优化网络性能。
  • net.ipv4.tcp_keepalive_time:缩短 TCP keepalive 间隔,快速清理无效连接。
  • 其他参数:进一步优化内核对网络连接的处理,提升整体系统性能。

使配置生效

sysctl -p

结语

通过以上 10 个优化技巧,可以显著提升 Nginx 的性能和稳定性。然而,性能优化是一个持续的过程,需要根据实际业务需求和服务器环境进行调整和测试。希望本文能为你的 Nginx 优化之路提供有价值的参考。如果你有更多优化经验或建议,欢迎在下方留言分享!


参考链接

复制全文 生成海报 Web服务器 性能优化 技术文档

推荐文章

如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
imap_open绕过exec禁用的脚本
2024-11-17 05:01:58 +0800 CST
Nginx 实操指南:从入门到精通
2024-11-19 04:16:19 +0800 CST
四舍五入五成双
2024-11-17 05:01:29 +0800 CST
html一份退出酒场的告知书
2024-11-18 18:14:45 +0800 CST
如何在Vue中处理动态路由?
2024-11-19 06:09:50 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
【SQL注入】关于GORM的SQL注入问题
2024-11-19 06:54:57 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
Go 中的单例模式
2024-11-17 21:23:29 +0800 CST
20个超实用的CSS动画库
2024-11-18 07:23:12 +0800 CST
pin.gl是基于WebRTC的屏幕共享工具
2024-11-19 06:38:05 +0800 CST
Go 接口:从入门到精通
2024-11-18 07:10:00 +0800 CST
404错误页面的HTML代码
2024-11-19 06:55:51 +0800 CST
jQuery `$.extend()` 用法总结
2024-11-19 02:12:45 +0800 CST
nginx反向代理
2024-11-18 20:44:14 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
程序员茄子在线接单