Php Nginx 502坏网关。通过增加缓冲区来解决。为什么?

Php Nginx 502坏网关。通过增加缓冲区来解决。为什么?,php,nginx,fastcgi,Php,Nginx,Fastcgi,我正在建立一个LEMP堆栈来运行Drupal。我安装了Nginx和PHP-FastCGI Nginx运行得很好,但任何运行PHP的尝试都会导致错误“502坏网关” 一个快速的谷歌显示:,增加缓冲区大小解决了这个问题 fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; 问题是为什么 我的理解 从前面的链接来看,nginx似乎正在向PHP FastCGI发送请求,但没有响应。这些请求让它超时了怎么办 它没有足够的时间响应,因为php很复杂(不是,它是ph

我正在建立一个LEMP堆栈来运行Drupal。我安装了Nginx和PHP-FastCGI

Nginx运行得很好,但任何运行PHP的尝试都会导致错误“502坏网关”

一个快速的谷歌显示:,增加缓冲区大小解决了这个问题

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
问题是为什么

我的理解

从前面的链接来看,nginx似乎正在向PHP FastCGI发送请求,但没有响应。这些请求让它超时了怎么办


它没有足够的时间响应,因为php很复杂(不是,它是
phpinfo();
)。现在我已经增加了缓冲区,我应该在什么时候担心必须再次增加缓冲区?

如果您查看nginx错误日志,很可能会看到以下消息:
从上游读取响应头时,上游发送的头太大

fastcgi\u buffers
设置用于快速CGI上游响应的缓冲区段的数量和内存大小。

文档中显示的默认值:
fastcgi|u缓冲区84k | 8k
其中默认缓冲区大小等于操作系统的页面大小。
getconf PAGESIZE
允许获取当前内存页大小

例如,在Ubuntu 14.01中,默认页面大小是4KB。 也就是说,您有8个段,每个段4KB。总共32KB。 FastCGI的响应超过了这个数字,这就是为什么我们得到响应代码
502-服务器收到了


这不是一个很好的解释,但我希望它能帮助您更好地理解。

实际上,这个问题只与
fastcgi\u buffer\u size
直接相关。这是一个非常特殊的缓冲区,只保存来自响应的HTTP头

如果您的应用程序发出大量
Set Cookie
头(或其他有助于HTTP头总大小的内容),此处的默认缓冲区大小可能不够,您需要增加它

要了解如何增加它,您可以阅读我的超级详细的writeup-它是关于
代理缓冲区大小的
但是
fastcgi\u
缓冲区的行为非常相似。引用基本命令:

curl -s -w \%{size_header} -o /dev/null https://example.com
确保根据正确的URL进行测试,并在需要时通过
-H
添加请求头

这将提供以字节为单位的标题大小。然后需要将结果值与4k(内存页的典型大小)对齐

因此,如果您得到,例如14342字节,则需要设置:

fastcgi_buffer_size 16k;
棘手的部分不在这里,而是当您增加这个缓冲区大小时,您需要增加
fastcgi\u buffer\u size
和/或
fastcgi\u busy\u buffers\u size
以及NGINX使用/计算后者默认值的方式


无论哪种方式,都不要将缓冲区设置得太高,而是使用特定于应用程序的计算。任意高的值对RAM没有好处,因为每个连接都使用这些缓冲区

这个问题实际上可能与
/var/lib/nginx/tmp
目录中容器中的权限有关(我们在Alpine上遇到过这个问题,但在其他发行版上也可能遇到)。该目录由nginx用户拥有,并且只能由nginx组写入。当请求缓冲区超过缓冲区大小时,会将
/var/lib/nginx/tmp
用作临时写入位置,直到释放足够的缓冲区来完成请求。写入
tmp
目录的请求是由
www用户
(同样在Alpine Linux中)发出的,该用户没有写入该位置的权限

如果查看Nginx的预安装脚本(同样适用于Alpine Linux),您会发现正在将
Nginx
组添加到
www-data
组。这是安装所必需的,因为nginx用户负责安装和引导nginx实例。之后,所有Nginx职责都移交给
www-data
用户,该用户负责处理通过容器的http流量。为了让
www-data
用户能够写入
/var/lib/nginx/tmp
目录,目录的所有权需要更改为
www-data
用户,或者需要将
www-data
用户添加到nginx组(这可能会带来安全问题)

我已经在Nginx repo上创建了一个问题,更好地解释了这一点,如果您使用的是Alpine Linux,还包含了一个解决方案:

虽然这是一个Alpine Linux问题,但我怀疑其他对此有问题的人也遇到了类似的权限问题。可以找到解释这一工作原理的Nginx文档


我知道这个问题由来已久,但我们最近遇到了这个问题,花了大约一周的时间来解决它,因为简单地增加缓冲区大小对我们来说似乎不是一个可行的长期解决方案。希望这能让其他人免于一周来遇到同样的解决方案时的头痛。

只有在某些php调用中,我才得到相同的nginx 502坏网关-添加缓冲区和缓冲区大小对我也有帮助。不知道为什么。这是一个好问题,尽管在错误的论坛上。一、 我也一直在想这个问题,我很恼火为什么每个解决方案都要增加缓冲区大小而不告诉我原因。多少是太多?什么东西太少了?为什么这不在默认配置中?WHYYYYY?查看此链接:那么如何知道FastCGI响应的大小?我想这取决于您的应用程序;fpm处理请求并呈现nginx接收的html输出。这个输出的大小比快速cgi缓冲区大。@antonbormotov它缓冲整个响应,仅第一个块,响应头?@ThomasDecaux据我所知,
fastcgi\u buffers
缓冲正文或其第一个块(如果响应大小更大)和
fastcgi\u buffer\u size
buffe