带有 php5-fpm 和 proxy_fcgi 的 Apache 2.4 virtualhost_alias

带有 php5-fpm 和 proxy_fcgi 的 Apache 2.4 virtualhost_alias

将我的服务器从 mod_php 移至 mod_fastcgi 和 php5-fpm 后,我发现一切正常,除了我的通配符虚拟主机。

我的通配符虚拟主机的工作方式如下:*.dev.myserver.com 转换为 /var/www/clients/$1

我之前严格使用 mod_rewrite 来执行此操作,但为了使此设置正常工作,我切换到了 mod_virtualhost_alias。

最初的问题是,这个通配符虚拟主机上的任何“子站点”都没有被发送到 PHP 解释器——代码将返回到浏览器。

我已设法让它适用于“/”(index.php)以及任何包含 php 文件的 URL。但是,它不适用于“漂亮”的 URL(例如带有 mod_rewrite 的 WordPress 公共端)。

我已经尝试了很多方法..这是我的虚拟主机 conf 文件当前的样子:

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerAlias *.dev.mysite.com
        VirtualDocumentRoot /var/www/clients/%1


        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory "/var/www/clients/%1">
                Options FollowSymLinks
                AllowOverride All

                RewriteEngine On
                RewriteCond %{HTTP_HOST}        [^.]+\.dev\.mysite\.com$
                RewriteRule ^(.+)               %{HTTP_HOST}$1  [C]
                RewriteRule ^([^.]+)\.dev\.mysite\.com(.*) proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost//var/www/clients/$1$2  [E=ENV_CUST:$1]
                RewriteRule ^([^.]+)\.([^.]+)\.dev\.mysite\.com(.*) proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost//var/www/clients/$2/$1$3    [E=ENV_CUST:$2,E=ENV_PROJ:$3]

                RewriteCond %{REQUEST_FILENAME} ^/((.*)(/.*)?)$
                RewriteCond %{DOCUMENT_ROOT}/%2.php -f
                RewriteRule !.*\.php$   proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost/%{DOCUMENT_ROOT}/%1.php   [P]

                RewriteRule ^index\.php$ - [L]
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule . index.php [QSA]

                <FilesMatch \.php$>
                        SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
                </FilesMatch>
        </Directory>

</VirtualHost>

conf-启用/php5-fpm.conf:

<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

<Directory /usr/lib/cgi-bin>
    Require all granted
</Directory>

</IfModule>

mods-enabled/fastcgi.conf:

<IfModule mod_fastcgi.c>
  AddHandler fastcgi-script .fcgi
  #FastCgiWrapper /usr/lib/apache2/suexec
  FastCgiIpcDir /var/lib/apache2/fastcgi
</IfModule>

编辑:更多信息

我确实尝试过设置 php5-fpm 来监听端口 9000,而不是使用 unix 套接字,但 unix 套接字似乎更可取。如果没有明显的缺点,我愿意改变它(一些生产站点也在此服务器上运行)

我尝试了这些页面上提供的解决方案以及各种组合,试图让其发挥作用。我尝试了太多方法,无法在这里全部列出,甚至无法全部记住,但如果您查看这些页面,您就会有一个相当不错的想法:

apache 2.4 + php-fpm + mod_proxy_fcgi + 别名

(完整列表见评论,声誉不足以在此处发布所有内容)

服务器运行的是 Ubuntu 14.04,Apache 2.4.7

非常感谢您的帮助。我找到了一个临时解决方法,即更改 WordPress 永久链接设置以不使用干净的 URL,但我真的很想让干净的 URL 正常工作。

答案1

其中一篇博客文章的作者在这里:)

我会尝试从您的虚拟主机配置中删除重写规则,并尝试在 .htaccess 文件中使用 WordPress 提供的默认重写规则(规则中不包含额外的代理内容)。

我有一个客户的设置类似于 WordPress 网站,他们没有这个问题,该设置与我的博客文章中概述的设置非常相似。

相关内容