因为在MAC下配置Apache的时候出现了挺多莫名的问题,所以做一个记录
MAC下配置相关的文件:
- 安装目录:/etc/apache2
- 域名:IP的对应文件:/etc/hosts
- Apache配置文件:/etc/apache2/httpd.conf
- 虚拟主机节点配置文件:/etc/apache2/extra/httpd-vhosts
- 默认根目录:/Library/WebServer/Documents
配置hosts文件
客户端在浏览器里面输入域名的时候,有先在本机的此文件找对应的ip地址,如果找不到,去DNS找对应的ip地址,找得到的话就访问ip。1
2
3
4127.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
ServerRoot“/etc”:
ServerRoot: The top of the directory tree under which the server’s
configuration, error, and log files are kept.包含服务器配置文件、错误文件、日志文件的目录,不要在后面追加/,比如/etc/
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地址下拼接端口号,如果是其他端口则要拼接端口号,可以上网搜一下处理方式。
遇到问题:- 如果保留上述配置,或者注释掉上述配置,添加Listen 80(默认是80),那么http://localhost 可以正常 访问,http://127.0.0.1/index.html 和 www.zwk.com/index.html 则会触发404 NOT FOUND错误,即使拼接80端口也是如此
- 注释掉上述配置,绑定非80断定,比如Listen 81,三种方式都能正常访问,但是访问的URL地址必须要拼接这个端口号
- 出现过访问交替成功/失败的情况(后来尝试好像是Safari的问题,Chrome 就是一直失败的,不会交替)
LoadModule moduleName path: 加载功能模块,这是我一直搭建虚拟主机失败的最主要问题。
1
2
3
4LoadModule 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的错误ServerAdmin 出现错误的通知邮箱,难道说国内的邮箱不行吗,使用指令apachectl configtest检测到错误,终端描述说查看邮箱,但是邮箱并没有。
- 配置项目根目录6.配置默认页面
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
40DocumentRoot "/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>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:81 和 http://localhost:81 。
现在我们要在同局域网内的其他设备访问到该服务器,首先获取局域网的ip(不是直接百度本机ip的外网ip),终端输入ifconfig,在终端的输出结果找inet(非inet6)对应的ip地址,在我的wifi环境下找到了三个ip,其中一个是localhost的127.0.0.1。把上面的www.zwk.com或者localhost换成另外两个ip的任意一个就是通局域网内的访问路径
很好用的apachectl configtest
该终端指令可以检测出配置文件的语法错误(比如httpd.conf、httpd-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:81 和 http://localhost:82 进入到两个站点。
首先我们在默认的根目录下/Library/WebServer/Documents 新建两个文件夹zwk和zwk2作为两个站点目录。
1 | Listen 81 |
1 | #Virtual hosts |
1 | <VirtualHost *:81> |
这样就完成多站点的配置,实际就是把httpd-vhost单站点的配置信息放到VirtualHost节点中进行多站点配置,除了Listen port的部分不能放到节点中(apachectl configtest提示错误)。
一个PHP文件解析的问题
配置站点结束,尝试访问站点的内容,发现.html文件可以正常渲染,但是.php文件没有解析源代码直接展示在浏览器上,而且httpd.conf中关于PHP模块的注释已经去掉(这也是网上搜索这个问题得到的最多的解决方案),最终在https://blog.csdn.net/beyondlpf/article/details/8075781找到了解决方案,如下:1
2AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
重启Apache ,ok 顺利解析