7

我正在尝试在 CentOS 7 上的 Apache 2.4.6 中设置一些 VH,但没有成功,因为它不起作用。这是我到目前为止所尝试的:

  • 因为 in/etc/httpd/conf/httpd.conf是这一行Include conf.modules.d/*.conf,所以我在下面创建一个文件/etc/httpd/conf.d/vhost.conf并将其放入其中:

    NameVirtualHost *:80
    
    <VirtualHost *:80>
         ServerName webserver
         ServerAlias localhost devserver development
         DocumentRoot /var/www/html
    </VirtualHost>
    
  • 重新加载/重新启动 Apache 服务(都尝试过):

    service httpd reload|restart
    
  • 在 Windows 端编辑文件C:\Windows\system32\drivers\etc\hosts并添加以下行:

    192.168.3.131  webserver localhost devserver development # this is the IP of Apache Server
    
  • 打开浏览器并尝试:http://webserverhttp://devserver两者都进入默认的 Apache 页面,因此 VH 无法正常工作。

  • 在下面放置一个文件,以了解 Apache 正在加载哪些模块,结果如下/var/www/html/index.php<?php phpinfo(); ?>

    core mod_so http_core mod_access_compat mod_actions mod_alias mod_allowmethods mod_auth_basic mod_auth_digest 
    mod_authn_anon mod_authn_core mod_authn_dbd mod_authn_dbm mod_authn_file mod_authn_socache mod_authz_core 
    mod_authz_dbd mod_authz_dbm mod_authz_groupfile mod_authz_host mod_authz_owner mod_authz_user mod_autoindex 
    mod_cache mod_cache_disk mod_data mod_dbd mod_deflate mod_dir mod_dumpio mod_echo mod_env mod_expires mod_ext_filter 
    mod_filter mod_headers mod_include mod_info mod_log_config mod_logio mod_mime_magic mod_mime mod_negotiation 
    mod_remoteip mod_reqtimeout mod_rewrite mod_setenvif mod_slotmem_plain mod_slotmem_shm mod_socache_dbm 
    mod_socache_memcache mod_socache_shmcb mod_status mod_substitute mod_suexec mod_unique_id mod_unixd mod_userdir 
    mod_version mod_vhost_alias mod_dav mod_dav_fs mod_dav_lock mod_lua prefork mod_proxy mod_lbmethod_bybusyness 
    mod_lbmethod_byrequests mod_lbmethod_bytraffic mod_lbmethod_heartbeat mod_proxy_ajp mod_proxy_balancer mod_proxy_connect 
    mod_proxy_express mod_proxy_fcgi mod_proxy_fdpass mod_proxy_ftp mod_proxy_http mod_proxy_scgi mod_systemd mod_cgi mod_php5 
    

显然 mod_vhost 已加载但无法正常工作,我错过了什么吗?有什么帮助或建议吗?也许我忘记了一些东西,但我阅读了 Apache 文档并没有找到有用的东西

更新:测试1

我对 VH 定义进行了一些更改,现在这就是我所拥有的:

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName webserver
    #ServerAlias localhost devserver development

    <Directory "/var/www/html">
        Options FollowSymLinks Includes ExecCGI
        AllowOverride All
        Allow from all

        #Require local
        #Require 192.168.3.0/16
        #Require 192.168.1.0/16
    </Directory>
</VirtualHost>

但是我收到了403 Forbidden

禁止的

您无权访问此服务器上的 /index.php。

这里有什么失败?

4

3 回答 3

7

为了详细说明jap1968的帖子,CentOS 7附带了SELinux的痛苦,将对接级别设置为enforcing. 当完全正常的服务配置静默失败( Apache)时,这会导致各种混乱。

要禁用SELinux,您需要:

0) [可选]破解打开一个 shell 并成为 root ......或者享受一个闪亮的新的、超级有趣的、配置sudo让你做“root stuffs”项目。大概。

su -l

1) 获取SELinux的当前状态。运行sestatus

sestatus

2) 如果SELinux导致脱发和过早衰老,您将得到如下结果:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

3) 编辑/etc/selinux/config文件。更改SELINUX=enforcingSELINUX=permissive。这样做会让您在下次重新启动时获得无尽的快乐。你最终会得到这样的东西:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
# SELINUX=enforcing
# ===> VOODOO HERE <===
SELINUX=permissive
# ===> END VOODOO  <===
#
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

4) 禁用SELinux此时您可以重新启动,但告诉SELinux停止折磨您更容易。运行setenforce以重置 SELinux 的强制级别以匹配/etc/selinux/config文件:

setenforce 0

5)sestatus再次检查:

sestatus

如果一切按预期进行,sestatus将返回如下内容:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

6)重启阿帕奇。如果您的虚拟主机域名解析到您正在使用的服务器,您将看到闪亮的新虚拟主机:

# Restart apache:
systemctl restart httpd.service

# Be lazy by checking your virtual host from the command line:
curl www.example.com/new-file-that-only-exists-in-your-new-vhost.txt

6.5) 停止阅读这里。或者不要。我是留言板帖子,不是你妈妈。

以下所有内容都超出了原始问题的范围,仅包含在内,因为您确实应该在启用SELinux的情况下运行。

7) 努力重新启用 selinux。从查看 selinux 日志开始,看看一些很棒的字母汤:

tail -f /var/log/audit/audit.log

8) 惊叹于SELinux的功能深度、大量名称不佳的实用程序以及丑陋的 UX 混乱。在你潜入水中之前,你可能应该穿上你的大男孩裤子,喝一整壶咖啡。这里有一些信息:

于 2016-01-29T18:11:26.940 回答
3

还要小心 SELinux。默认配置将阻止 httpd 访问您的虚拟主机目录。您将需要设置适当的上下文:

# chcon -R -u system_u -r object_r -t httpd_sys_content_t <DocumentRoot>

另一种选择是禁用 SELinux。

于 2014-10-14T19:53:07.883 回答
3

有几件事可能会导致您出现问题:-

NameVirtualHost *:80

不再是 Apache 2.4.x 的有效语法,您应该完全删除它。

在 Windows 端,一旦您更改了 HOSTS 文件,您需要重新加载DNS Client service,因此要么重新启动,要么更好的是,使用“以管理员身份运行”启动命令窗口并执行以下操作:-

net stop dnscache
net start dnscache

最后,在您的虚拟主机定义中,这将有助于告诉 apache 从何处接受与此虚拟主机的连接,如下所示:-

<VirtualHost *:80>
     ServerName webserver
     ServerAlias localhost devserver development
     DocumentRoot /var/www/html
    <Directory  "/var/www/html">
        AllowOverride All

        Require local
        Require ip 192.168.3

    </Directory>
</VirtualHost>

这将允许从运行 apache 的机器Require local和本地网络上的任何 IP 地址进行访问Require ip 192.168.3

此外,我不确定 Apache 在 unix 上将其默认文档根放在哪里,但是将您的 3 个域名区分为不同的目录可能是一个想法,就像这样

<VirtualHost *:80>
     ServerName localhost
     ServerAlias localhost
     DocumentRoot /var/www/html
    <Directory  "/var/www/html">
        AllowOverride All

        Require local
        Require ip 192.168.3

    </Directory>
</VirtualHost>


<VirtualHost *:80>
     ServerName webserver
     ServerAlias webserver
     DocumentRoot /var/www/html/webserver
    <Directory  "/var/www/html/webserver">
        AllowOverride All

        Require local
        Require ip 192.168.3

    </Directory>
</VirtualHost>

<VirtualHost *:80>
     ServerName development
     ServerAlias development
     DocumentRoot /var/www/html/development
    <Directory  "/var/www/html/development">
        AllowOverride All

        Require local
        Require ip 192.168.3

    </Directory>
</VirtualHost>


<VirtualHost *:80>
     ServerName devserver
     ServerAlias devserver
     DocumentRoot /var/www/html/devserver
    <Directory  "/var/www/html/devserver">
        AllowOverride All

        Require local
        Require ip 192.168.3

    </Directory>
</VirtualHost>

然后在每个目录中放置一个简单的 html 文件,上面写着“Hello from Servername”,并更改每个文件中的服务器名,这样你就知道你已经到了正确的服务器。

回复:更新 test1.php

Allow from all

也不是有效的 Apache 2.4 语法,除非您已加载LoadModule access_compat_module modules/mod_access_compat.so

即使这样也应该

Order Allow,Deny
Allow from all

所以使用 Apache 2.4语法

Require all granted

如果您想采取惰性路线并允许从宇宙访问。

于 2014-09-01T15:21:03.193 回答