表单验证失败时出现 502 Bad Gateway 错误
Posted
技术标签:
【中文标题】表单验证失败时出现 502 Bad Gateway 错误【英文标题】:502 Bad Gateway Error on failed form validation 【发布时间】:2017-08-15 01:32:40 【问题描述】:目前有一个包含大量字段的表单需要验证,但遇到了一个我不太理解的问题。使用 php 5.6、nginx 1.11.9 和 Laravel 5.1.45。
表单有无限数量的需要验证的字段,因为用户可以动态地将更多字段添加到一个部分,如果添加这些字段中的每一个都需要包含信息。所以这个修复需要考虑到这一点。
验证失败后,我的一个表单遇到 502 Bad Gateway 错误。我查看了一下nginx日志,发现如下错误:
upstream sent too big header while reading response header from upstream
所以经过一番搜索,我找到了this thread on stack overflow,并且接受的答案说我应该将以下内容添加到我的 nginx.conf 文件中:
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
当我这样做时,验证失败时不会出现 502 错误,它只是将我重定向回表单,就好像我刚刚打开它一样(没有填充任何字段,也没有显示错误消息)。
所以我进一步研究了缓冲是如何工作的,我预感闪现的错误消息被存储在这些缓冲区中,所以我删除了除了一个字段之外的所有验证,只是为了看看这是否相关,它作品!验证失败,页面告诉用户一个字段有什么问题。
所以我一个一个地重新为字段添加验证,直到我再次中断。它最终在 15 个字段失败后中断,这比 fastcgi_buffers 参数指定的少一个。
我删除了我之前添加的 fastcgi 行(这使得 fastcgi_buffers 参数默认为 8),然后一个接一个地继续,直到它在 7 个字段处中断,再次比 fastcgi_buffers 参数少一个。所以我认为这可能与此有关。
我尝试进一步增加这些值,但它总是会导致我的网站崩溃,可能是因为无效的 nginx 配置。
另一个重要的一点是,这只发生在实时服务器上,而不是在我的电脑上运行的本地设置上。所以我想这是因为服务器根本没有内存来处理它,但是一个人的请求可能对服务器来说太多了,这似乎是错误的。从站点到我的本地设置,nginx 配置似乎没有什么不同。
我还有什么遗漏的吗?我可以进一步增加 fastcgi_buffer 行来解决这个问题吗?我应该以不同的方式解决这个问题吗?任何帮助表示赞赏!
【问题讨论】:
你的 phpfpm 日志显示什么? 当我在验证中遇到这些问题时,phpfpm 日志似乎没有记录任何内容,否则它似乎也没有显示任何错误。 @Arty 我遇到了完全相同的问题。你最终设法解决了吗?怎么样? 【参考方案1】:您可以尝试增加post_max_size。
【讨论】:
我尝试更改我的 php.ini 文件中的 post_max_size,但不幸的是,无论有没有我的 nginx.conf 文件中的 fastcgi_buffer 行,它都没有改变结果。 为了澄清,我将 post_max_size 从 8M 更改为 32M,然后也更改为 0(无限制)。 您是否比较过您的实时和本地 php.ini?你的 Laravel 应用程序没有错误吗? (laravel.log 是空的吗?)【参考方案2】:这很可能与在 PHP 中设置 cookie 会话驱动程序以及浏览器中 cookie 的限制有关。解决方案是使用除 cookie 之外的另一个会话驱动程序(文件、redis 等)
见Cookie session driver won't save any validation error or flash data
【讨论】:
以上是关于表单验证失败时出现 502 Bad Gateway 错误的主要内容,如果未能解决你的问题,请参考以下文章
将 Spring Boot 应用程序部署到 Elastic Beanstalk 时出现 502 Bad Gateway
使用 AWS Elastic Beanstalk 部署 Django 应用程序时出现 502 Bad Gateway nginx/1.20.0 错误