proxy_fcgi:来自脚本错误标头的错误格式错误标头

问题描述 投票:0回答:1

我正在尝试使用 Docker 为我公司的开发团队“重建”基础设施。我大约在一年前完成了这个工作,现在我正在对其进行重构和重写,以更好地匹配我们的生产环境。我已经成功地将大部分 apache 指令翻译为 nginx。因此,我们在开发环境中使用 nginx 作为代理和 Web 服务器。然而,在我们的生产设置中,我们使用 apache 作为 Web 服务器,使用 nginx 作为反向代理。这就是我当前努力使设置保持一致的原因。

我正在构建一个新项目,并将 apache、php-fpm 和 nginx 分离到不同的容器中。这就是问题出现的地方。 Apache + FCGI 配置不断生成下列错误:

这应该是响应正文,但由于某种原因它显示为响应标头

[proxy_fcgi:error] malformed header from script 'index.php': Bad header: {"success":true,"token":"1F535, referer: http://localhost/
[proxy_fcgi:error] AH01070: Error parsing script headers, referer: http://localhost/
[proxy_fcgi:error] (22)Invalid argument: [client 172.19.0.1:42216] AH01075: Error dispatching request to : , referer: http://localhost/

这是我当前的 apache 设置

ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
<VirtualHost *:80>
    <IfModule proxy_module>
      ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/company/public/$1
    </IfModule>

    <IfModule mod_deflate.c>
      SetOutputFilter DEFLATE
    </IfModule>

    DocumentRoot /var/www/html/company/public
    <Directory /var/www/html/company/public>
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

版本

APACHE_VERSION=2.4.57-alpine
PHP_VERSION=7.4.33-fpm-alpine3.16
NGINX_VERSION=1.25.1-alpine3.17

PHP 应用程序非常旧,我们使用的是 ZendFramework v1

我尝试修改ProxyRules,但事实证明这种方法无效。当我将 PHP 和 Apache 组合在同一个容器中时,设置可以正确运行,因为它绕过了对 fastcgi 层的需要。我探索了 Apache 文档和 Stack Overflow 上的各种答案,但不幸的是,它们似乎都没有提供解决方案。

php apache nginx fastcgi fpm
1个回答
0
投票

在花了很长时间尝试修复这个错误,来来回回近一年后,我终于找到了问题所在。我们从我们的界面调用了一些 Ajax 方法,并且出于某种原因,有人将字符集标头拆分为新行,导致类似这样的结果:

header('Content-Type: application/json;');
header('charset=ISO-8859-1');

一旦我弄清楚了这一点,我只需删除新行并将字符集添加到内容类型标题中。

header('Content-Type: application/json; charset=ISO-8859-1');

我还遇到了另一个来自 Zend 的错误,在 Zend 中返回“无法发送标头;标头已发送”?”如果您遇到类似的情况,可能是由于某些空格或换行符以及 php 文件的开头/结尾所致。

如何修复 Zend 中的“无法发送标头;标头已发送”?

© www.soinside.com 2019 - 2024. All rights reserved.