我正在尝试缩短第一个字节的时间。HTTP2 有很大帮助,但 TTFB 仍然在 500-700 毫秒之间。我想将其降低到 200 左右。
我看到了一些使用 FastCGI 的建议。我的设置有点棘手,所以我试图了解在哪里/如何设置它:
我在 Apache 服务器上有一个 wordpress 应用,监听端口 8090。这只是为了拥有一个 wordpress 仪表板、公开 API 端点并提供媒体服务。我的第二个 NextJS 应用在 nodejs 上,监听端口 8000。它使用 wordpress API 并实际呈现网站。
Nginx 位于这两个应用程序的前面,用于执行 https/www 重定向,并将请求代理到相应的端口。
据我所知,至少所有资产和页面都是由 nginx 提供的。例如:curl -I -L https://www.example.com/wordpress/wp-content/uploads/2015/05/image.jpg
- 响应标头告诉我是 nginx 为它们提供服务。
但我仍然对在 Nginx 上设置 FastCGI 是否合理感到困惑。我仍然猜测实际上是 Apache 处理 PHP 执行,因为我最初使用默认的 apache droplet 设置了工作的 wordpress,然后稍后将 Nginx 放在了前面。我错了吗?在这种情况下,我改善 TTFB 的途径是什么?也许我应该看看我的 Node 应用程序,但我只是不确定如何确定延迟来自哪里。
仅供参考这是我的 /etc/nginx/sites-available/example.com:
server {
listen 80;
server_name example.com www.example.com;
rewrite ^/(.*) https://www.example.com/$1 permanent;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /var/www/html;
index index.php index.js index.html index.htm index.nginx-debian.html;
server_name example.com;
return 301 https://www.example.com$request_uri;
ssl_certificate /home/ssl/example.com.chained.crt;
ssl_certificate_key /home/ssl/example.com.key;
location / {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /wordpress {
proxy_pass http://localhost:8090;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html;
index index.php index.js index.html index.htm index.nginx-debian.html;
server_name www.example.com;
ssl_certificate /home/ssl/example.com.chained.crt;
ssl_certificate_key /home/ssl/example.com.key;
location / {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /wordpress {
proxy_pass http://localhost:8090;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
答案1
我最近将一个 wordpress 网站从运行良好的 apache 服务器移出,我不知道 TTFB,但我决定将新服务器更改为 NGINX,它运行得非常好。
我为 Fastcgi_pass 设置的 Fastcgi 应该更改为您安装的 php fpm 的任何版本。
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 300;
}
通过添加上述内容,我现在的 TTFB 为 200ms 左右,这也可以通过前端的 Haproxy 负载均衡器实现。所以是的,我认为改用 fastcgi 和 nginx 会带来某种程度的改进。
- 编辑 *
最近的变化和信息导致我对此做了一些改变。
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
include snippets/fastcgi-php.conf;
fastcgi_read_timeout 600;
}
通过包含自动包含路径和脚本参数以及参数的片段可以改变这一点。