是否可以为一个 URL 设置自定义 fastcgi 缓冲区配置?无需重复大量的配置行。
因此从基本的 PHP-FPM(通过 fastcgi)设置开始:
server {
...
location / {
try_files $uri @php-fpm;
}
location @php-fpm {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
...
}
}
它基本上将任何未知的请求发送到文件index.php
。
假设该index.php
脚本可以响应一个非常大的sitemap.xml
文件(约 600k)...这会导致错误:
an upstream response is buffered to a temporary file
我可以使用以下命令设置缓冲区:
location @php-fpm {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
...
fastcgi_buffer_size 4k;
fastcgi_buffers 170 4k;
}
但对于其他一切来说,这似乎有点过分(也隐藏了潜在的问题,例如我知道的sitemap.xml
很大,网站上的其他任何东西都不应该很大)。
我希望使用:
server {
...
location / {
try_files $uri @php-fpm;
}
location = /sitemap.xml {
fastcgi_buffer_size 4k;
fastcgi_buffers 170 4k;
try_files $uri @php-fpm;
}
location @php-fpm {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
...
}
}
但它似乎忽略了缓冲区配置。
也无法在以下位置创建子位置@php-fpm
:
location @php-fpm {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
...
location = /sitemap.xml {
fastcgi_buffer_size 4k;
fastcgi_buffers 256 4k;
}
}
导致错误:
location "/sitemap.xml" cannot be inside the named location "@php-fpm"
答案1
如何对 sitemap.xml 进行单独重写,使其转到具有不同 fastcgi 设置的不同命名位置。
未经测试:)
服务器 { ... 地点 / { try_files $uri@php-fpm; } 位置/sitemap.xml { try_files $uri@php-fpm-sitemap; } 位置@php-fpm { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_param 脚本文件名 $document_root/index.php; ... } 位置@php-fpm-sitemap { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_param 脚本文件名 $document_root/index.php; fastcgi_buffer_size 是4k; fastcgi_缓冲区 256 4k; } }
虽然有点冗长,但应该可以起作用。