本笔记在 debian 12.7 环境下测试。

一、安装 apache2

$ sudo apt install apache2    #安装
$ apache2 -v                  #查看版本
Server version: Apache/2.4.62 (Debian)
Server built:   2024-10-04T15:21:08

配置文件介绍

安装完 apache2 后,其配置文件主要放在 /etc/apache2/ 目录中。

$ tree /etc/apache2/
├── apache2.conf                      # 全局配置文件,它合并处理自身配置和其他文件配置。
├── conf-available                    # 其他配置目录(待激活),通过创建符号链接到 conf-enabled 目录来激活
│   ├── *.conf
├── conf-enabled                      # 激活的全局配置目录,通过对 conf-available 目录中的文件进行符号链接来实现激活
│   ├── *.conf -> ../conf-available/*.conf
├── envvars
├── magic                             # 针对mod_mime_magic的配置,也就是针对不同文件类型的配置 envvars(environment variables) 环境变量。
├── mods-available                    # 模块配置目录(待激活),通过创建符号链接到 mods-enabled 目录来激活
│   ├── *.load
│   ├── *.conf
├── mods-enabled                      # 激活的模块配置目录,通过对 mods-available 目录中的文件进行符号链接来实现激活
│   ├── *.load -> ../mods-available/*.load
│   ├── *.conf -> ../mods-available/*.conf
├── ports.conf                        # 端口监听配置文件
├── sites-available                   # 虚拟主机配置目录(待激活),通过创建符号链接到 sites-enabled 目录来激活
│   ├── 000-default.conf
│   └── default-ssl.conf
└── sites-enabled                     # 激活的虚拟主机配置目录,通过对sites-available目录文件进行符号链接来实现激活
    └── 000-default.conf -> ../sites-available/000-default.conf

二、配置虚拟主机

这里,我设置网站的根目录为 /home/hy/www/,域名为 hollowman.cc,需要配置虚拟主机来实现。

每一个虚拟主机都可对应一个配置文件,并存放在 /etc/apache2/sites-available 目录下。

$ ls -l /etc/apache2/sites-available/
总计 12
-rw-r--r-- 1 root root 1276 10月19日 17:43 000-default.conf
-rw-r--r-- 1 root root 6195 10月 4日 23:16 default-ssl.conf

这里,000-default.conf 是默认的虚拟主机配置文件,default-ssl.conf 是 ssl 证书的配置文件,并不是一个虚拟主机配置文件。我们可以直接配置 000-default.conf 文件,也可以新建一个虚拟主机配置文件的方式来实现。在此,我们通过新建的方式来实现。

1.新建并配置虚拟主机配置文件

$ sudo vim /etc/apache2/sites-available/hollowman.cc.conf

 <VirtualHost *:80> 
	ServerAdmin ymz316@126.com   #定义站长邮箱
	ServerName hollowman.cc      #定义网站域名
	
	DocumentRoot /home/hy/www    #定义网站根目录,应当为绝对路径
	
	<Directory /home/hy/www/>     #配置一些只针对该目录有效的指令,此配置信息在也可以在全局配置文件/etc/apache2/apache2.conf中进行配置。
	        Options Indexes FollowSymLinks  
	        AllowOverride None 
	        Require all granted	        
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log                   #定义错误日志存放位置,${APACHE_LOG_DIR}在envvars配置文件中有设置
	CustomLog ${APACHE_LOG_DIR}/access.log combined        #定义访问日志的路径以及格式
</VirtualHost>

注意:如果我们需要使用域名 hollowman.cc 来访问网站,则还需修改 /etc/hosts 文件,添加一行代码:127.0.0.1 hollowman.cc

$ echo '127.0.0.1  hollowman.cc' | sudo tee -a /etc/hosts

关于< Directory ></ Directory > 配置说明

Options: 配置在特定目录使用哪些特性,多个特性之间用空格隔开。

ExecCGI 表示在该目录下允许执行 CGI 脚本;
FollowSymLinks 表示在该目录下允许文件系统使用符号连接;
Indexes 表示当用户访问该目录时,如果用户找不到 DirectoryIndex 指定的主页文件(例如 index.html),则返回该目录下的文件列表给用户;
SymLinksIfOwnerMatch 表示当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问

AllowOverride: 搜索和允许使用 .htaccess 文件中的指令类型(.htaccess 文件名是可以改变的,其文件名由 AccessFileName 指令决定)。

None,表示不搜索该目录下的 .htaccess 文件;
All,表示在 .htaccess 文件中可以使用所有的指令。

Require: apache2.4 版本对于目录的访问控制指令,以下为常见写法

Require all granted                        #允许所有来源访问
Require all denied                         #拒绝所有来源访问
Require expr expression                    #只有表达式为 true 时允许访问
Require ip 10.1 192.168.10 12.12.0.0/16    #允许指定的 IP 地址
Require host hollowman.cc                  #只允许来自域名 hollowman.cc 的主机访问 

注意:老版本 apache2.2 对于目录的访问控制是使用的是 Order 指令,而不是 Require 指令

Order: 控制在访问时Allow和Deny两个访问规则哪个优先:Allow表示允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16);Deny表示拒绝访问的主机列表。常见写法:

Order deny,allow       #先拒绝后允许
Deny from all          #拒绝所有
Order allow,deny       #先允许后拒绝
Allow from all         #允许所有
Order deny,allow        #先拒绝后允许
Deny from all           #拒绝所有
Allow from hollowman.cc #允许hollowman.cc

三、激活虚拟主机配置文件

1. 激活改变了什么文件?

首先我们查看一下 /etc/apache2/ 目录,发现该目录下有3组比较特殊的目录:

conf-available  和  conf-enabled 
sites-available 和  sites-enable
mods-available  和  mods-enable 

这三组目录分别对应的是网站其他配置目录网站虚拟主机配置目录以及模块配置目录。前者目录下面存放的是实际的配置文件,而后者目录下面则是一些指向前者目录下面对应配置文件的软链接;通常,创建了这些软链接后,配置文件才变为激活状态,配置信息才能生效。

再看一下网站虚拟主机配置目录 /etc/apache2/sites-available//etc/apache2/sites-enabled/ 下面分别有什么文件:

$ ls -l /etc/apache2/sites-available/
总计 16
-rw-r--r-- 1 root root 1286  9月30日 02:51 000-default.conf
-rw-r--r-- 1 root root 6195 10月 4日 23:16 default-ssl.conf
-rw-r--r-- 1 root root  372 10月20日 00:50 hollowman.cc.conf

$ $ ls -l /etc/apache2/sites-enabled/
总计 0
lrwxrwxrwx 1 root root 35 10月19日 17:34 000-default.conf -> ../sites-available/000-default.conf

上面有 3 个配置文件,只有 000-default.conf 具有软链接,因此他是激活的,而我们刚才创建的 hollowman.cc.conf 配置文件没有软链接,也就是还没有激活。

2.激活虚拟主机配置文件

sudo ln -s /etc/apache2/sites-available/hollowman.cc.conf /etc/apache2/sites-enabled/hollowman.cc.conf 

激活配置文件,除了通过创建软符号连接来实现,还可以通过 a2enmod/a2dismoda2ensite/a2dissitea2enconf/a2disconf 等系统自带的助手命令来自动创建软连接。

因此,上面 hollowman.cc.conf 软链接创建,还可以通过这条命令来实现:

$ sudo a2ensite hollowman.cc.conf  # a2ensite 可以自动识别 /etc/apache2/sites-available 目录

同样,如果需要激活模块配置文件:

$ sudo a2enmod ssl

等效于:

$ ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
$ ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load

部分模块功能的配置文件会包括 .conf.load 两种类型的文件
a2enmod 命令可以直接列出没有被启用的模块,根据需要输入需要启用的模块则可启用
a2dismod 命令则可直接列出已经被启用的模块,根据情况输入需要禁用的模块则可禁用

3. 取消激活默认虚拟主机配置文件

因为默认虚拟主机配置文件也是用的80端口,因此这里取消激活默认的虚拟主机配置文件来避免冲突。

$ sudo a2dissite 000-default.conf 

四、重启 apache2 服务并测试网页

1.创建网站目录及网页文件

$ sudo mkdir /home/hy/www
$ sudo echo 'hello' > /home/hy/www/index.html

2.重启服务

$ systemctl restart apache2

打开浏览器输入 hollowman.cc,将发现网页信息为:hello

注意:因为我们配置的网站根目录不是默认的,会有一些访问权限问题,导致无法正常打开网页,比如上面的浏览可能会报错:

Forbidden

You don't have permission to access this resource.
--------------------------------------------------
Apache/2.4.62 (Debian) Server at hollowman.cc Port 80

分析可能有 2 个原因:

一是 apache2 运行用户 www-data 不在网站根目录所属的用户组(我的网站根目录 /home/hy/www 所属用户组为 hy)
二是网站根目录的所有父目录权限均必须为 755 权限才行

对应的解决方法如下:

$ sudo usermod -aG hy www-data     # 将 www-data 用户添加到 hy 用户组中
$ sudo chmod 755 -R /home/hy	   # 将 根目录的父目录权限设置为 755,/home 目录本身就是具有755权限的