长期听众,第一次打电话……
我已经运行 Apache 多年,并设置了多个服务器。这个服务器让我很为难,我就是找不到问题所在。我在这里和其他地方看到过很多有关 VirtualHost 问题和提供错误 DocumentRoot 的帖子,但这些帖子都没有帮助我。
服务器运行的是 Centos 7.5,启用了 SELinux,Apache 2.4.33。
我想运行两个 VirtualHost。出于某种原因,辅助 VH 无法提供正确的文件。更改 VH 的顺序并不重要。我尝试的最后一件事是硬编码默认的 DocumentRoot (/var/www/html),然后将每个 VH 放在其自己的单独目录中 (/var/www/VirtualHost)。
这是我当前的 virtualhost.conf 文件:
#Set a default DocumentRoot
DocumentRoot /var/www/html
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/example2.com
ServerName example2.com
ServerAlias www.example2.com
</VirtualHost>
<Directory /var/www/example2.com>
Options -Indexes +FollowSymLinks +MultiViews
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/example1.com
ServerName example1.com
ServerAlias www.example1.com
</VirtualHost>
<Directory /var/www/example1.com>
Options -Indexes +FollowSymLinks +MultiViews
Order allow,deny
Allow from all
</Directory>
我在日志中看到,所有请求都尝试从 /var/www/html(默认)进行服务。
我临时更改了使用的日志格式,以便我可以看到使用的 ServerName 以及用于验证路径的确切文件名。
LogFormat "%v %f %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
在本地服务器上,我发出以下两个命令进行测试:
wget http://example1.com/index.html
wget http://example2.com/images/logo.jpg
我的访问日志显示:
example1.com /var/www/html/index.html 192.168.1.2 - - [18/Jul/2018:11:48:08 -0500] "GET /index.html HTTP/1.1" 404 208 "-" "Wget/1.14 (linux-gnu)"
example2.com /var/www/html/images 192.168.1.2 - - [18/Jul/2018:11:48:12 -0500] "GET /images/logo.jpg HTTP/1.1" 404 213 "-" "Wget/1.14 (linux-gnu)"
从日志中,我可以看到显示了正确的域,但是文件路径显然是错误的,Apache 试图从默认的 DocumentRoot 中提取请求的文件,而不是从为 VirtualHosts 定义的 DocumentRoot(即 /var/www/example(x).com)中提取。
httpd -S 命令的输出如下:
[wright@web2 conf.d]$ httpd -S
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using web2.local. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
*:80 is a NameVirtualHost
default server example2.com (/etc/httpd/conf.d/vhosts.conf:4)
port 80 namevhost example2.com (/etc/httpd/conf.d/vhosts.conf:4)
alias www.example2.com
port 80 namevhost example1.com (/etc/httpd/conf.d/vhosts.conf:17)
alias www.example1.com
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/etc/httpd/logs/error_log"
Mutex authdigest-opaque: using_defaults
Mutex watchdog-callback: using_defaults
Mutex proxy-balancer-shm: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
Mutex authdigest-client: using_defaults
Mutex lua-ivm-shm: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex authn-socache: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/run/httpd/" mechanism=default
Mutex mpm-accept: using_defaults
Mutex cache-socache: using_defaults
PidFile: "/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=48 not_used
Group: name="apache" id=48 not_used
[wright@web2 conf.d]$
任何帮助都将不胜感激!
答案1
我设法解决了我的问题,当然这与我上面发布的内容无关。希望这能帮助其他人。
问题的根本原因在于我安装了 PHP 7,特别是 php-fpm 的设置。我遵循的指南建议创建一个 fpm.conf 文件,内容如下:
# PHP scripts setup
ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/var/www/html
Alias / /var/www/html/
由于这个配置,我的所有 VirtualHosts 的 DocumentRoot 都被重写到上述路径。直到我转储了所有配置文件并搜索“/var/www”时才找到这个文件。
进一步在 Google 上搜索如何将 PHP-FPM 与 VirtualHosts 结合起来,我找到了一个页面,其中每个 VirtualHost 块中都有以下代码块:
<FilesMatch \.php$>
# 2.4.10+ can proxy to unix socket
# SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost/"
# Else we can just use a tcp socket:
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
将此块添加到我的两个 VirtualHosts,删除旧的 fpm.conf 文件并重新启动 Apache 解决了我的问题,现在每个 VHost 都使用了正确的 DocumentRoot。我的 PHP 文件是否能正确提供仍有待确定,但至少现在我走在了正确的道路上。