fastcgi 不处理静态资源,应由 nginx 直接服务并绕过 fastcgi;需通过高优先级 location 匹配静态后缀、正确配置 root/alias、启用 open_file_cache、sendfile、tcp_nopush/nodelay 及 read_ahead 等优化。

FastCGI 本身不处理静态资源——它专用于动态内容(如 PHP 脚本)与 Nginx 的通信。静态资源(CSS、JS、图片等)应由 Nginx 直接服务,**绕过 FastCGI 链路**。若发现静态请求走 FastCGI,说明配置存在路径匹配错误或 location 优先级问题。真正的优化方向是:让静态资源彻底“避开”FastCGI,再针对性强化 Nginx 自身的文件读取能力。
确保静态资源不进入 FastCGI 处理流程
这是前提,否则所有后续优化都无意义。常见错误包括 location 正则过于宽泛、root 路径拼接出错、或未显式拦截静态后缀。
- 在 server 块中,优先声明静态资源 location,例如:
location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
# 不加 fastcgi_pass,也不加 proxy_pass
} - 避免使用类似
location /或location ~ \.php$覆盖所有路径;静态资源必须有独立、高优先级的匹配规则 - 检查 root/alias 设置是否正确:用 alias 处理带前缀的路径(如
location /static/ { alias /var/www/static/; }),避免 root 拼接导致路径解析延迟
启用 open_file_cache 缓存文件元数据
静态文件高频访问时,反复调用 stat() 和 open() 是主要开销。该缓存复用文件句柄、大小、修改时间等,大幅降低系统调用次数。
- 在 http 或 server 块中添加:
open_file_cache max=10000 inactive=60s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on; - max=10000 适合中高流量站点;inactive=60s 表示 60 秒未访问即淘汰;min_uses=2 防止一次性请求污染缓存
- 务必配合 文件系统挂载参数 noatime(如
mount -o remount,noatime /data),禁用访问时间更新,减少写操作
开启 sendfile 零拷贝与 TCP 优化
跳过用户态内存拷贝,让内核直接把磁盘页缓存中的数据送入 socket,显著降低 CPU 和延迟。
- 全局启用:
sendfile on;
tcp_nopush on;
tcp_nodelay on; - tcp_nopush 确保 sendfile 发送的数据填满 TCP 包,避免小包堆积;tcp_nodelay 则对非 sendfile 场景(如长连接响应头)减少延迟
- 注意:gzip、sub_filter、ssl_buffer_size 等模块会禁用 sendfile,静态资源 location 中应关闭 gzip(或仅对 text/* 启用)
针对大文件补充 read_ahead 与存储优化
视频、PDF、安装包等大文件顺序读取时,预读机制可提前加载后续块到页缓存,减少寻道等待。
- 在静态资源 location 中添加:
read_ahead 1m;(对匹配的文件,内核最多预读 1MB) - 缓存路径建议放在 SSD 上;机械盘预读收益有限,且易因随机 IO 成为瓶颈
- 若静态资源实际来自远端(如 OSS/S3),则需配置 proxy_cache_path + proxy_cache,而非 FastCGI 缓存











