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_timeout2快速释放 FIN_WAIT 连接
net.ipv4.tcp_tw_reuse1复用 TIME_WAIT 端口
net.ipv4.tcp_tw_recycle1快速回收 TIME_WAIT(NAT 环境慎用)
net.ipv4.tcp_syncookies1开启 SYN Cookie 防洪水攻击
net.ipv4.tcp_keepalive_time600长连接探活间隔
net.ipv4.ip_local_port_range4000 65000本地端口范围
net.ipv4.tcp_max_syn_backlog16384半连接队列
net.ipv4.tcp_max_tw_buckets36000TIME_WAIT 桶上限
net.core.somaxconn16384全连接队列
net.core.netdev_max_backlog16384网卡收包队列

文件描述符:写入 /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; } 代理)。


相关页面