Nginx是大型架构的必备技能,下面我重点详解Nginx性能优化@mikechen
1. 使用事件驱动模型
Nginx 采用事件驱动(event-driven)模型来处理请求,而不是为每个连接创建一个新的进程或线程。
这使得 Nginx 能够以更低的资源消耗处理大量并发连接。
2. 优化 Worker 进程配置
worker_processes 参数决定了 Nginx 启动多少个 worker 进程。一
个常见的做法是将这个值设置为服务器的 CPU 核心数,这样可以充分利用所有 CPU 资源。
worker_processes auto;
worker_connections 参数定义了每个 worker 进程可以处理的最大并发连接数。建议将这个值设置得足够大,例如 1024 或更高,以满足高并发需求。
events {
worker_connections 2048;
}
3. 启用 gzip 压缩
Gzip 压缩:可以显著减少发送给客户端的数据量,从而加快网页加载速度。
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_vary on;
注意:gzip_proxied any; 表示代理服务器会压缩所有请求。gzip_comp_level 设置压缩级别,1是最低压缩,9是最高。建议使用中等值,例如 5。
4. 静态文件缓存
通过设置适当的 HTTP 缓存头,可以指导浏览器缓存静态文件(如图片、CSS、JS)。这可以减少重复请求,减轻服务器压力。
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|eot|ttf)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
expires 30d; 指示浏览器缓存这些文件 30 天。
5. 使用缓存来加速动态内容
对于动态内容,可以使用 Nginx 的 fastcgi_cache 或 proxy_cache 来缓存后端应用(如 PHP-FPM, Node.js)的响应。
http {
# 定义缓存区域
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
location ~ \.php$ {
fastcgi_cache my_cache;
fastcgi_cache_valid 200 60m; # 缓存 HTTP 200 响应 60 分钟
fastcgi_pass 127.0.0.1:9000;
}
}
}
6. 减少 DNS 解析时间
在 Nginx 中,如果上游服务器地址是域名而不是 IP 地址,Nginx 会在启动时进行一次 DNS 解析。为了避免这个问题,可以使用 resolver 指令,并配置一个合适的 DNS 服务器。
location / {
resolver 8.8.8.8;
proxy_pass http://backend_server;
}
7. 开启 TCP_NODELAY
TCP_NODELAY 可以确保数据包立即发送,而不是等待更多数据来填满缓冲区。这对于低延迟的网络应用非常有用。
http {
tcp_nodelay on;
}
8. 优化日志记录
日志记录会产生 I/O 消耗。为了提升性能,可以考虑关闭不必要的日志或使用 buffer 指令将日志写入内存缓冲区。
http {
access_log off; # 关闭访问日志
# 或
# access_log /var/log/nginx/access.log buffer=32k;
}
9. 限制请求速率
使用 limit_req_zone 和 limit_req 模块可以限制来自单个 IP 地址的请求速率,防止恶意攻击或滥用。
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /login/ {
limit_req zone=one burst=5;
}
}
}
rate=1r/s 限制每秒一个请求,burst=5 允许短时间内的突发请求。
10. 使用 HTTP/2
HTTP/2 提供了多路复用、服务器推送和头部压缩等特性,可以显著提升网站性能。要启用 HTTP/2,只需在 listen 指令中添加 http2 参数。
server {
listen 443 ssl http2;
# ...
}
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》