apache2.4 + php-fpm + phpmyadmin 在 debian

Posted

技术标签:

【中文标题】apache2.4 + php-fpm + phpmyadmin 在 debian【英文标题】:apache2.4 + php-fpm + phpmyadmin in debian 【发布时间】:2014-06-03 11:21:34 【问题描述】:

我在 debian 中有这个设置:apache 2.4 proxy_fcgi 和 php-fpm (v5.5)。在我的虚拟主机文件中,我有:

<VirtualHost *:80>
DocumentRoot /var/www/html
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/var/run/php5-fpm.sock|fcgi://./var/www/html
CustomLog $APACHE_LOG_DIR/access.log combined
ErrorLog $APACHE_LOG_DIR/error.log
</VirtualHost>

一切正常,我可以在 /var/www/html/ 下看到 phpinfo() 和我请求的每个 php 文件。

我继续从 debian repo 安装 phpmyadmin,但是当我浏览到 http://MY.IP/phpmyadmin 时,我收到“找不到文件”错误并在 apache 错误日志中

"[proxy_fcgi:error] AH01071: Got error 'Primary script unknown\n'"

Debian phpmyadmin 软件包将内容转储到 /usr/share/phpmyadmin。如果我在 /usr/share/phpmyadmin 下创建一个 test.html 文件,我可以从 http://MY.IP/phpmyadmin/test.html 看到它的内容

问题是 /usr/share/phpmyadmin 下的 php 文件没有被处理。 phpmyadmin apache 的配置是这样的:

# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
        Options FollowSymLinks
        DirectoryIndex index.php

        <IfModule mod_php5.c>
                AddType application/x-httpd-php .php
                <FilesMatch ".+\.php$">
                    SetHandler application/x-httpd-php
                </FilesMatch>

                php_flag magic_quotes_gpc Off
                php_flag track_vars On
                php_flag register_globals Off
                php_admin_flag allow_url_fopen Off
                php_value include_path .
                php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
                php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/
        </IfModule>

</Directory>
...

并加载到apache配置文件中。

由于没有安装 mod_php,因此没有对 php 文件进行处理。如何告诉 apache 使用 proxy_fcgi 处理 /usr/share/phpmyadmin 目录下的 php 文件?

>>更新 我在 phpmyadmin apache 的 conf 中添加了一个 proxypassmatch 指令

ProxyPassMatch ^/phpmyadmin/(.*\.php(/.*)?)$ unix:/var/run/php5-fpm.sock|fcgi:///usr/share/phpmyadmin/

期待工作,但我不断收到同样的错误。

>>更新 2 我将 php-fpm unix socket 替换为 network (127.1:9000) 并将 virthualhost 文件的 ProxyPassmatch 替换为:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1

在 phpmyadmin 的 apache conf 中:

ProxyPassMatch ^/phpmyadmin/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/share/phpmyadmin/$1
ProxyPassMatch ^/phpmyadmin/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/share/phpmyadmin$1index.php

一切正常。当我访问 MY.IP/phpinfo.php 时,我从 /var/www/html/phpinfo.php 获取 phpinfo,当我访问 MY.IP/phpmyadmin/phpinfo.php 时,我得到/usr/share/phpmyadmin/phpinfo.php 的处理内容。

我的问题解决了,但我还是不明白为什么用 php-fpm 的网络连接可以工作,但 unix 套接字却不行。

【问题讨论】:

如果我能吻你我会的,纯属天才! 你救了我的命!非常感谢! 我也尝试过使用 Unix 套接字,直到我放弃了。它行不通。所以决定回退到tcp连接!! 【参考方案1】:

我在同样的问题上苦苦挣扎,我无法让 phpmyadmin 工作。我仍然收到上面提到的“找不到文件”。我的问题是我必须将我的 ProxyPassMatch 放在我的 ./sites-available 文件夹内的 000-default.conf 文件中,并且我必须将这些条目放在我的默认条目之前。这是本页最底部的大纲,我在其中找到了解决方案: http://jordanconway.com/set-up-apache-2-4-with-php-fpm-on-ubuntu-13-10/

这是我的设置方式以供参考。

<VirtualHost *:80>
   ...
    DocumentRoot /var/www/html
   ...
    ProxyPassMatch ^/phpmyadmin/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/share/phpmyadmin/$1
    ProxyPassMatch ^/phpmyadmin/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/share/phpmyadmin$1index.php
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1
</VirtualHost>

【讨论】:

【参考方案2】:

这可能是因为套接字是supported from Apache 2.4.9 并且您使用了一些早期版本的 2.4 吗?

【讨论】:

是的,这是 unix socket 的问题,Apache 支持 v2.4.9 及更高版本的 unix socket(或带有 v2.4.7 的补丁)。我使用的是 2.4.7,但当时 Apache 文档没有指定不支持 unix 套接字。【参考方案3】:

看来你解决了这个问题。

    您的 PHPMyAdmin 设置为使用 mod_php5,由于您通过 PHP-FPM 使用 PHP,因此可能没有安装它。 您正确地确定了 phpmyadmin 设置需要一个代理密码,该代理密码具有正确的 PHP 文件路径。

最后一点,通常 php-fpm 会在一个 unix socket 上监听 TCP,但不会同时监听。在/etc/php5/fpm/pool.d/www.conf 中设置的listen 指令是什么?是否定义了多个 listen 指令?

我猜里面只有一个Listen 127.0.0.1:9000

【讨论】:

【参考方案4】:

我需要将 HTTP2 添加到 apache HTTPD,但由于必须删除 mod_php,它使 phpmyadmin 无法工作。

打开/etc/phpmyadmin/apache.conf

注释掉

<IfModule mod_php7.c>

添加到

<FilesMatch \.php> # Apache 2.4.10+ can proxy to unix socket
    SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/"
</FilesMatch>

【讨论】:

以上是关于apache2.4 + php-fpm + phpmyadmin 在 debian的主要内容,如果未能解决你的问题,请参考以下文章

apache2.4, php-fpm, proxypassmatch "没有协议处理程序对 URL 有效.."

试图让 PHP-FPM 工作 (Apache 2.4.33)

从apache mod_php到php-fpm[转]

CentOS 7系统LAMP配置PHP-FPM的示例

Apache 2.4 和 php-fpm 不会为 php 页面触发 apache http 基本身份验证

Apache 2.4 + php-fpm - AH01071:出现错误“主脚本未知\n”mod_proxy_balancer