为 nginx 中的特定位置设置 fastcgi 缓冲区

为 nginx 中的特定位置设置 fastcgi 缓冲区

是否可以为一个 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;
    }

}

虽然有点冗长,但应该可以起作用。

相关内容