Apache 2.4 使用默认 DocumentRoot 而不是 VirtualHost DocumentRoot

Apache 2.4 使用默认 DocumentRoot 而不是 VirtualHost DocumentRoot

长期听众,第一次打电话……

我已经运行 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 文件是否能正确提供仍有待确定,但至少现在我走在了正确的道路上。

相关内容