Nginx 优化 — 系统优化/代理长连接/缓存机制/防盗链/跨域/PHP优化
主题:架构优化思路、系统内核优化、Nginx 单节点与代理优化、静态资源缓存机制、防盗链、跨域、PHP-FPM 优化
结构总览
优化概述(三步法)
├─ 先摸清状况(画链路图 + 了解业务特点)
├─ 再发现瓶颈(可计算 QPS / 需排查 top/netstat/慢查询)
└─ 针对性优化(高频读→少读/就近读/缓存;高频写→少写/漏斗写/buffer写)
系统优化
├─ 文件描述符(/etc/security/limits.d/ + ulimit)
└─ 内核参数(/etc/sysctl.conf 完整清单)
Nginx 单节点优化
├─ 全局:worker_processes / worker_rlimit_nofile
├─ events:use epoll / worker_connections
├─ http:sendfile / tcp_nopush / tcp_nodelay / keepalive / gzip / 请求头缓冲区
└─ server:线程池(aio threads)+ reuseport
Nginx 代理优化
├─ upstream keepalive 长连接(proxy_http_version 1.1 + Connection "")
├─ fastcgi_keep_conn on(Nginx→PHP-FPM 长连接)
└─ proxy_params 标准配置(超时/缓冲/next_upstream)
静态资源缓存
├─ 响应头:Cache-Control / Expires / Last-Modified / ETag
├─ 请求头:If-Modified-Since / If-None-Match
└─ 浏览器缓存流程(cache-control → expires → ETag → Last-Modified → 304)
防盗链
├─ valid_referers none|blocked|server_names|string
└─ 伪造请求头可绕过(防的是 img 标签盗链,不是反爬虫)
跨域
├─ 同源策略(协议+域名+端口)+ CSRF 攻击详解
└─ Access-Control-Allow-* 响应头配置
PHP-FPM 优化
├─ 慢日志(request_slowlog_timeout + slowlog)
└─ 状态页(pm.status_path = /php_status)
关键要点
系统优化完整清单(/etc/sysctl.conf):
| 参数 | 值 | 作用 |
|---|---|---|
net.ipv4.tcp_fin_timeout | 2 | 快速释放 FIN_WAIT 连接 |
net.ipv4.tcp_tw_reuse | 1 | 复用 TIME_WAIT 端口 |
net.ipv4.tcp_tw_recycle | 1 | 快速回收 TIME_WAIT(NAT 环境慎用) |
net.ipv4.tcp_syncookies | 1 | 开启 SYN Cookie 防洪水攻击 |
net.ipv4.tcp_keepalive_time | 600 | 长连接探活间隔 |
net.ipv4.ip_local_port_range | 4000 65000 | 本地端口范围 |
net.ipv4.tcp_max_syn_backlog | 16384 | 半连接队列 |
net.ipv4.tcp_max_tw_buckets | 36000 | TIME_WAIT 桶上限 |
net.core.somaxconn | 16384 | 全连接队列 |
net.core.netdev_max_backlog | 16384 | 网卡收包队列 |
文件描述符:写入 /etc/security/limits.d/k8s.conf(* soft nofile 65535 / * hard nofile 131070),无需重启,重新登录生效。
Nginx 代理长连接优化: 反向代理默认每请求新建连接,通过 upstream { keepalive 8; } + proxy_http_version 1.1; + proxy_set_header Connection ""; 复用后端连接;Nginx→PHP-FPM 用 fastcgi_keep_conn on;。
proxy_params 标准配置: proxy_set_header Host $http_host / X-Real-IP / X-Forwarded-For + 三个超时(connect/read/send 60s)+ proxy_buffering on + proxy_buffer_size 8k / proxy_buffers 8 8k + proxy_next_upstream http_500 http_502 http_503 http_504。
浏览器缓存机制: 响应头 Cache-Control(优先级最高)> Expires > ETag > Last-Modified。浏览器流程:cache-control 未过期→直接用缓存;no-cache→看 expires;都无→发 If-None-Match(ETag) 验证→304;ETag 优先于 If-Modified-Since。配置 etag off + Cache-Control no-cache 可强制不走缓存。
防盗链: valid_referers none blocked server_names *.baidu.com; + if ($invalid_referer) { return 500; }。注意:curl -e 伪造 Referer 可绕过——防盗链防的是 img 标签直接引用,不是反爬虫。
跨域: 同源策略是浏览器丢弃跨域响应包(不是拦截请求)。前后端分离时后端需返回 Access-Control-Allow-Origin/Methods/Headers/Credentials 头放行。同源策略防不了 CSRF(CSRF 关键在发请求,不在读响应),防 CSRF 靠服务端 token 校验。
PHP-FPM 优化: request_slowlog_timeout = 5s + slowlog = /var/log/php_slow.log 记录慢脚本;pm.status_path = /php_status 开启状态页(Nginx 用 location /php_status { fastcgi_pass 127.0.0.1:9000; } 代理)。
相关页面
- Nginx 概念页 — 核心内容集中页
- Nginx Part5 — 优化三步法/防盗链/跨域/CPU亲和(Day45)
- PHP 体系架构 — PHP-FPM 优化相关
- HTTP 协议 — 缓存头/Cookie 机制
- 防火墙与系统优化 — 内核参数调优