将我的服务器从 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 网站,他们没有这个问题,该设置与我的博客文章中概述的设置非常相似。