阅读量:30
Ubuntu上Nginx性能优化技巧
1. 进程模型调优:匹配CPU资源,提升并发处理能力
Nginx的进程模型是其高性能的核心基础,需合理配置以充分利用服务器CPU资源。
- worker_processes:设置为
auto,让Nginx自动检测服务器CPU核心数(如4核服务器会启动4个工作进程),避免手动配置的资源浪费或不足。 - worker_cpu_affinity:配合
auto使用,将每个工作进程绑定到独立的CPU核心,减少进程切换的开销,提升CPU缓存命中率。 - worker_rlimit_nofile:设置为65535或更高,突破系统默认的文件描述符限制(Ubuntu默认通常为1024),确保高并发时不会因文件描述符耗尽而拒绝请求。
- events块配置:
worker_connections 4096:每个工作进程的最大并发连接数(需根据服务器内存调整,每连接约消耗2-4KB内存);multi_accept on:让工作进程一次性接受所有新连接,减少accept系统调用的次数;use epoll:采用Linux高效的epoll事件驱动模型(适用于高并发场景),替代传统的select/poll模型。
2. 传输效率优化:减少数据传输开销
通过优化传输层的配置,降低网络延迟和带宽占用。
- sendfile on:启用零拷贝技术,直接将文件从磁盘通过内核缓冲区发送到网卡,避免数据在用户态和内核态之间的多次复制,显著提升静态文件(如图片、CSS、JS)的传输效率。
- tcp_nopush on:与
sendfile配合使用,仅在数据包填满时才发送,避免小数据包的频繁传输,提高网络利用率。 - client_body_buffer_size 16k:请求体缓冲区大小(默认8k或16k),根据上传文件的大小调整(如16k可满足多数小型表单提交需求),避免频繁的内存分配。
- client_header_buffer_size 4k + large_client_header_buffers 4 32k:处理大请求头(如包含大量Cookie的请求),避免因缓冲区不足导致的请求拒绝。
3. 缓存策略优化:减少重复计算与IO
通过缓存静态资源和代理响应,降低后端服务器的压力。
- 静态资源缓存:针对图片、CSS、JS等静态文件,配置
expires和Cache-Control头部,让浏览器缓存文件,减少重复请求。示例:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; # 浏览器缓存1年 add_header Cache-Control "public, max-age=31536000"; } - open_file_cache:开启文件缓存,缓存文件描述符、大小、修改时间等信息,加速静态文件的访问。示例:
open_file_cache max=1000 inactive=20s; # 缓存1000个文件,20秒未访问则失效 open_file_cache_valid 30s; # 每30秒验证缓存有效性 open_file_cache_min_uses 2; # 至少被访问2次才缓存 - 代理缓存:针对动态内容(如PHP、API),配置代理缓存,减少后端服务器的请求压力。示例:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; location / { proxy_cache my_cache; proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟 proxy_cache_valid 404 1m; # 404状态码缓存1分钟 proxy_cache_use_stale error timeout updating; # 缓存过期或更新时仍可使用旧缓存 }
4. 操作系统调优:解决系统级瓶颈
调整Ubuntu内核参数,优化TCP连接管理和文件系统性能。
- 文件描述符限制:编辑
/etc/security/limits.conf,添加以下内容,提升用户和root的最大文件描述符数:* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535 - TCP/IP堆栈优化:编辑
/etc/sysctl.conf,添加以下配置并执行sudo sysctl -p生效:net.core.somaxconn = 65535 # 监听队列的最大长度(避免SYN洪水攻击导致连接被拒绝) net.ipv4.ip_local_port_range = 1024 65535 # 临时端口范围(扩大端口可用数量) net.ipv4.tcp_tw_reuse = 1 # 快速回收TIME-WAIT状态的连接(提升TCP连接复用率) net.ipv4.tcp_fin_timeout = 30 # TIME-WAIT状态的超时时间(默认60秒,缩短减少资源占用)
5. HTTP/2协议优化:提升传输效率
HTTP/2相比HTTP/1.1支持多路复用、头部压缩等特性,能显著提升页面加载速度。
- 启用HTTP/2:在
server块中修改listen指令,添加http2参数:listen 443 ssl http2; # 必须配合SSL证书使用(HTTP/2通常在加密连接上运行) - SSL优化:配置安全的SSL协议和会话复用,减少SSL握手开销。示例:
ssl_protocols TLSv1.2 TLSv1.3; # 仅使用TLS 1.2及以上安全协议 ssl_session_cache shared:SSL:10m; # 会话缓存(10MB),存储SSL会话信息 ssl_session_timeout 10m; # 会话超时时间(10分钟)
6. Keepalive优化:减少TCP握手开销
Keepalive通过保持客户端与服务器的连接,避免频繁的TCP三次握手和四次挥手,提升并发性能。
- keepalive_timeout:设置连接保持时间(如65秒),超过该时间未活动的连接将被关闭。
- keepalive_requests:每个连接允许的最大请求数(如100次),达到次数后连接将被关闭。示例:
http { keepalive_timeout 65; keepalive_requests 100; }
7. 负载均衡:分散请求压力
对于高流量场景,通过Nginx的反向代理功能将请求分发到多个后端服务器,提升整体处理能力。
- upstream配置:定义后端服务器组,支持轮询、权重、IP哈希等负载均衡算法。示例:
http { upstream backend { server backend1.example.com weight=3; # 权重3,处理更多请求 server backend2.example.com; server backend3.example.com; } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }