MAC配置虚拟主机

因为在MAC下配置Apache的时候出现了挺多莫名的问题,所以做一个记录

MAC下配置相关的文件:

  1. 安装目录:/etc/apache2
  2. 域名:IP的对应文件:/etc/hosts
  3. Apache配置文件:/etc/apache2/httpd.conf
  4. 虚拟主机节点配置文件:/etc/apache2/extra/httpd-vhosts
  5. 默认根目录:/Library/WebServer/Documents

配置hosts文件

客户端在浏览器里面输入域名的时候,有先在本机的此文件找对应的ip地址,如果找不到,去DNS找对应的ip地址,找得到的话就访问ip。

1
2
3
4
127.0.0.1	localhost
255.255.255.255 broadcasthost
::1 localhost
0.0.0.0 account.jetbrains.com

127.0.0.1对应的localhost改成www.zwk.com

配置httpd.conf

  1. ServerRoot“/etc”:

    ServerRoot: The top of the directory tree under which the server’s
    configuration, error, and log files are kept.

    包含服务器配置文件、错误文件、日志文件的目录,不要在后面追加/,比如/etc/

  2. Listen:绑定IP、端口,

    Listen: Allows you to bind Apache to specific IP addresses and/or ports, instead of the default. See also the <VirtualHost> directive

    默认绑定
    1
    2
    3
    4
    5
    6
    <IfDefine SERVER_APP_HAS_DEFAULT_PORTS>
    Listen 8080
    </IfDefine>
    <IfDefine !SERVER_APP_HAS_DEFAULT_PORTS>
    Listen 80
    </IfDefine>

    在不做其他处理的情况下,如果绑定80端口,访问的时候不需要在URL地址下拼接端口号,如果是其他端口则要拼接端口号,可以上网搜一下处理方式。
    遇到问题:

    1. 如果保留上述配置,或者注释掉上述配置,添加Listen 80(默认是80),那么http://localhost 可以正常 访问,http://127.0.0.1/index.htmlwww.zwk.com/index.html 则会触发404 NOT FOUND错误,即使拼接80端口也是如此
    2. 注释掉上述配置,绑定非80断定,比如Listen 81,三种方式都能正常访问,但是访问的URL地址必须要拼接这个端口号
    3. 出现过访问交替成功/失败的情况(后来尝试好像是Safari的问题,Chrome 就是一直失败的,不会交替)
  3. LoadModule moduleName path: 加载功能模块,这是我一直搭建虚拟主机失败的最主要问题。

    1
    2
    3
    4
    LoadModule authn_file_module libexec/apache2/mod_authn_file.so
    #LoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so
    #LoadModule authn_anon_module libexec/apache2/mod_authn_anon.so
    ...........

    默认的是一个这样的模块列表,路径都是在libexec/apache2/下,但是实际的完整路径是/usr/libexec/apache2/moduleName,然后就一直报错说这里面的模块找不到。
    遇到问题:
    因为后来该了一些其他配置,导致访问的时候出现404问题,大致描述THE URL … is NOT FOUND ON THIS SERVER,按照网上的建议最终也没有修正,所以我把httpd.conf文件给复原了,这个时候,上面模块的路径恢复默认在libexec/apache2/下,但是这个时候却不报这个在libexec/apache2/module_name上找不到module_name的错误

  4. ServerAdmin 出现错误的通知邮箱,难道说国内的邮箱不行吗,使用指令apachectl configtest检测到错误,终端描述说查看邮箱,但是邮箱并没有。

  5. 配置项目根目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    DocumentRoot "/Library/WebServer/Documents"
    # 该目录的访问权限配置
    <Directory "/Library/WebServer/Documents">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important. Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options FollowSymLinks Multiviews
    MultiviewsMatch Any

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    # AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
    # 替换了 Order allow,deny Allow from all,但是老的依然兼容
    # 可以通过此处限定访问来源


    # ----------网上大都如下配置,但是导致了403You don't have permission to access / on this server.
    #Options All
    #AllowOverride None
    #Order allow,deny
    #Allow from all
    </Directory>

    6.配置默认页面
    1
    2
    3
    <IfModule dir_module>
    DirectoryIndex index.html
    </IfModule>

理论上说,在项目根目录下放一个index.html文件,走完该节的配置,应该能在浏览器访问http://www.zwk.com:81 访问到index.html

局域网内访问

经过上节httpd.conf的配置已经可以本地访问该服务器,通过hosts文件配置本机访问的方式有两种http://www.zwk.com:81http://localhost:81
现在我们要在同局域网内的其他设备访问到该服务器,首先获取局域网的ip(不是直接百度本机ip的外网ip),终端输入ifconfig,在终端的输出结果找inet(非inet6)对应的ip地址,在我的wifi环境下找到了三个ip,其中一个是localhost的127.0.0.1。把上面的www.zwk.com或者localhost换成另外两个ip的任意一个就是通局域网内的访问路径

很好用的apachectl configtest

该终端指令可以检测出配置文件的语法错误(比如httpd.confhttpd-vhosts)。
模块路径错误导致的失败所提示的错误如下(注意:后期这个问题又没了):

httpd: Syntax error on line 67 of /private/etc/apache2/httpd.conf: Cannot load libexec/apache2/mod_authn_file.so into server: dlopen(/etc/libexec/apache2/mod_authn_file.so, 10): image not found


我们在故意制造一个问题,在根目录访问权限配置ServerRoot改成/etc2终端输入该命令,输出错误如下:

httpd: Syntax error on line 31 of /private/etc/apache2/httpd.conf: ServerRoot must be a valid directory

配置httpd-vhosts文件

上面的配置过程都是一台服务器上配置一个站点,通过配置虚拟主机文件httpd-vhosts可以配置多站点,现在我们要通过访问 http://localhost:81http://localhost:82 进入到两个站点。
首先我们在默认的根目录下/Library/WebServer/Documents 新建两个文件夹zwkzwk2作为两个站点目录。

1. 在http.conf中监听81、82端口
1
2
Listen 81
Listen 82
2.打开httpd.conf中关于httpd-vhost的注释
1
2
#Virtual hosts
#Include /private/etc/apache2/extra/httpd-vhosts.conf
3.在httpd-vhost中如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<VirtualHost *:81>
DocumentRoot "/Library/WebServer/Documents/zwk1"
#ServerName servernameA
#ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
#CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common


<Directory "/Library/WebServer/Documents/zwk">
Options FollowSymLinks Multiviews
MultiviewsMatch Any
AllowOverride None
Require all granted
</Directory>
</VirtualHost>



<VirtualHost *:82>
DocumentRoot "/Library/WebServer/Documents/zwk2"
#ServerName servernameB
#ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
#CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common


<Directory "/Library/WebServer/Documents/qubic">
Options FollowSymLinks Multiviews
MultiviewsMatch Any
AllowOverride None
Require all granted
</Directory>
</VirtualHost>

这样就完成多站点的配置,实际就是把httpd-vhost单站点的配置信息放到VirtualHost节点中进行多站点配置,除了Listen port的部分不能放到节点中(apachectl configtest提示错误)。

一个PHP文件解析的问题

配置站点结束,尝试访问站点的内容,发现.html文件可以正常渲染,但是.php文件没有解析源代码直接展示在浏览器上,而且httpd.conf中关于PHP模块的注释已经去掉(这也是网上搜索这个问题得到的最多的解决方案),最终在https://blog.csdn.net/beyondlpf/article/details/8075781找到了解决方案,如下:

在IfModule mime_module节点下添加如下内容
1
2
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

重启Apache ,ok 顺利解析

显示 Gitment 评论