谈到Nginx性能优化,很多新手可能只想到简单的worker_processes调优,但真正的性能提升往往藏在那些容易被忽略的细节里。比如上次我给一个日PV百万的电商站做优化,光是调整TCP缓冲区和文件描述符就带来了近15%的吞吐量提升,这让我意识到性能优化确实是个技术活,不能光靠蛮力调整参数。
TCP协议栈的那些隐藏参数
很多人都知道要调整worker_connections,但很少有人会去动TCP参数。在/etc/sysctl.conf中加入这几行配置后,我们的长连接性能立即改善了:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192
特别是tcp_tw_reuse这个参数,简直是解决TIME_WAIT状态的救命稻草。记得有次线上突发流量导致端口耗尽,加上这个配置后问题直接解决,连服务器重启都不用。
静态资源服务的极致优化
对于图片、CSS这类静态资源,我常用的优化组合拳是这样的:启用sendfile、开启tcp_nopush、设置合理的过期头。举个真实的案例,某资讯网站经过如下配置后,静态资源加载时间从1.2秒降到了600毫秒:
location ~* .(jpg|png|css|js)$ {
expires 365d;
add_header Cache-Control "public";
sendfile on;
tcp_nopush on;
open_file_cache max=1000 inactive=20s;
}
最神奇的是open_file_cache这个指令,它能缓存文件描述符,对于频繁访问的静态文件来说简直是性能倍增器。不过要注意inactive时间的设置,太长会浪费内存,太短又起不到缓存效果。
反向代理场景下的性能陷阱
用Nginx做反向代理时,看似简单的proxy_pass藏着不少坑。我就遇到过因为buffer配置不当导致大文件上传频繁失败的案例。现在的标准配置模板是这样的:
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 512k;
proxy_http_version 1.1;
特别是proxy_http_version 1.1这个参数,很多人会漏掉,它能让Nginx和上游服务保持长连接,减少TCP握手开销。根据我们的压力测试,加上这行配置后代理吞吐量提升了近30%。
性能优化真的没有银弹,每次优化都需要结合具体业务场景。我习惯先用ab或wrk做基准测试,然后对着Nginx的stub_status模块逐个指标分析。有时候一个简单的keepalive_timeout调整,可能比加服务器还管用。你们在Nginx优化方面有什么独门秘籍吗?欢迎一起讨论!
评论