Ubuntu 16.04与Apache虚拟主机配置的步骤详解
前言
众所周知在 window 下,Apache 的配置文件是 httpd.conf,但在 Linux 下安装了 Apache 后发现其配置并不像 window 下那么简单。Linux 下 Apache 将各个设置项分在了不同的配置文件中,想想也是有很大的理由的,这样子可以使用户在开发过程中自由的搭配其不同的功能模块,更好地提高效率。不过,如果不事先了解 Apache,可能在配置时蒙圈。
Ubuntu 中 Apache 的配置文件是 /etc/apache2/apache2.conf。Apache 在启动时会找到这个文件并自动读取该文件中的配置信息,而其他配置文件则是通过 include 指令包含进来的,在 apache2.conf 中可以看到这些引入行。当然,也可以将所有的配置全放在 apache2.conf 或者 httpd.conf 或者其他文件中,Apache 这样划分是一种比较好的习惯。
说明:原始内容中未出现 img 图片标签,因此本文保留原有代码、链接和结构;如果你的原文中有截图,请按原位置保留即可。下面会从 Ubuntu 下 Apache 的目录结构、默认站点、虚拟主机、模块管理、端口配置、启用配置和常见问题等方面进行扩展说明。
一、Ubuntu 下 Apache 的配置文件结构
在 Ubuntu 中,Apache 的主配置文件是 /etc/apache2/apache2.conf。这个文件相当于整个 Apache 配置体系的入口。Apache 启动时,会先读取这个文件,然后根据其中的 Include 指令,把其他配置文件加载进来。
常见的配置文件包括:
/etc/apache2/apache2.conf:Apache 主配置文件;/etc/apache2/ports.conf:监听端口配置;/etc/apache2/sites-available/:可用虚拟主机配置;/etc/apache2/sites-enabled/:已启用的虚拟主机配置链接;/etc/apache2/mods-available/:可用模块配置;/etc/apache2/mods-enabled/:已启用的模块配置链接;/etc/apache2/conf-available/:可用全局配置片段;/etc/apache2/conf-enabled/:已启用的全局配置片段。
这种拆分方式的好处是:不同功能模块互不干扰,启用和停用某个站点或模块时,只需要建立或删除链接,不必反复修改主配置文件。对于开发和调试来说,这种方式非常方便。
二、Web 文档根目录与默认站点
在 Ubuntu 中 Web 文档的根目录是在 /var/www 中,怎么知道的呢?在 /etc/apache2/sites-enabled/000-default 中有这样一段内容:
NameVirtualHost * ServerAdmin webmaster@localhost DocumentRoot /var/www/
这是设置虚拟主机的,当然,如果觉得没有用的,也可以将 apache2.conf 里的 Include /etc/apache2/sites-enabled/ 一行注释掉,并在 httpd.conf 中的 DocumentRoot 设置成某个项目的目录,这样可以方便开发。
不过,直接注释掉默认站点包含行并不是推荐做法。更规范的方式是保留默认结构,通过新建虚拟主机配置文件来指定项目目录。这样既不影响系统默认站点,也方便以后切换和维护。
三、sites-available 与 sites-enabled 的作用
在 /etc/apache2 目录下,发现了 sites-enabled 目录,然而还有一个 sites-available 目录,那么这两个目录到底有什么作用呢?其实,sites-available 这个目录包含 Apache 虚拟主机的配置文件。虚拟主机允许 Apache 配置多个站点并为每个站点配置不同的参数。而 sites-enabled 目录的作用是持有 /etc/apache2/sites-available 目录下文件的链接。当 Apache 重启后,该目录中包含的站点将会被激活。
如果 apache 上配置了多个虚拟机,每个虚拟机的配置文件都放在 sites-available 下,那么对于虚拟主机的停用、启动就是非常方便了,操作某个虚拟主机就不用动配置文件了。
举个例子:
- 你在
sites-available中创建了example.com.conf; - 此时它只是“可用”,并不会真正生效;
- 当你执行
a2ensite example.com或手动创建软链接到sites-enabled后; - Apache 重新加载配置,这个站点才会被启用。
这种 available 和 enabled 分离的设计,是 Debian/Ubuntu 系 Apache 的一大特点。它让站点的启用、停用、备份和迁移都变得非常清晰。
------- 我是美丽的分割线 -------
四、mods-available 与 mods-enabled 的作用
在 /etc/apache2 下还有类似于 sites-enabled 和 sites-available 两个目录的 mods-available 和 mods-enabled 两个目录,那么这两个目录有何作用呢?其实类似于 sites-enabled 和 sites-available,mods-available 这个目录包含模块和模块配置文件,不是所有的模块都有配置文件。比如当 apt-get install php5 安装了 php 模块,在这两个目录中就有了 php5.load、php5.conf 和指向这两个文件的链接。这对于 apache 开启停用某个模块是非常方便的。
常用的模块管理命令包括:
sudo a2enmod rewrite sudo a2enmod ssl sudo a2dismod autoindex sudo systemctl restart apache2
a2enmod 用于启用模块,a2dismod 用于停用模块。启用后,Apache 会从 mods-enabled 中读取对应模块配置。停用后,链接被移除,模块不再加载。相比手动编辑配置文件,这种方式更安全,也更符合 Ubuntu 的管理习惯。
五、ports.conf 与端口监听
在 /etc/apache2 目录下,还有一个文件 ports.conf,这个文件配置 Apache 监听的端口。如果觉得嫌弃它多余,可以先把 apache2.conf 中的 Include /etc/apache2/ports.conf 一行去掉,在 httpd.conf 里设置 Apache 端口。
默认情况下,ports.conf 中通常会有:
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>如果你修改了 Apache 端口,比如改成 8080,就需要同时确认:
ports.conf中监听的是 8080;- 虚拟主机配置中的
<VirtualHost *:8080>也对应 8080; - 防火墙或安全组放行了 8080 端口;
- 浏览器访问时带上端口号,例如
http://你的IP:8080。
在 Ubuntu 缺省安装的目录有与其他相比有一点不同。在 ubuntu 中 module 和 virtual host 的配置都有两个目录,一个是 available,一个是 enabled。available 目录是存放有效的内容,但不起作用,只有用 ln 连到 enabled 过去才可以起作用。这样子对于开发以及调试都很方便。
------- 我是美丽的分割线 -------
六、什么是虚拟主机(Virtual Hosting)
所谓虚拟主机,就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的 Internet 服务器功能,支持 WWW、FTP、E-mail 等。再简单的说,就是同一台服务器可以同时处理超过一个域名。假设 www.example1.com 和 www.example2.com 两个域名都指向同一个服务器,而 web 服务器又支持虚拟主机,那么 www.example1.com 和 www.example2.com 可以访问到同一服务器上不同的 web 空间。
虚拟主机常见的实现方式有三种:
- 基于域名:多个域名解析到同一 IP,通过
ServerName和ServerAlias区分; - 基于 IP:服务器有多个 IP,每个 IP 对应不同站点;
- 基于端口:同一 IP 的不同端口对应不同站点。
在实际使用中,基于域名的虚拟主机最常见。你只需要把多个域名解析到同一台服务器,然后在 Apache 中为每个域名写一个 <VirtualHost> 配置即可。
七、添加一个虚拟主机配置
在 Apache2 中,有效的站点信息都存放在 /etc/apache2/sites-available/用户名(文件) 里面。我们可以添加格式如下的信息来增加一个有效的虚拟空间,将 /etc/apache2/sites-available/000-default.conf 里的大部分东西拷贝过来就行了,比较老的 ubuntu 版本可能叫做 default。命名成自己想命的名字,记得改 DocumentRoot 作为默认目录,在 Directory 中设置路径,注意端口号不要与其他的虚拟主机重复:
<VirtualHost *:80>
# 在 ServerName 后加上你的网站名称
ServerName www.linyupark.com
# 如果你想多个网站名称都取得相同的网站,可以加在 ServerAlias 后加上其他网站别名。
# 别名间以空格隔开。
ServerAlias ftp.linyupark.com mail.linyupark.com
# 在 ServerAdmin 后加上网站管理员的电邮地址,方便别人有问题时可以联络网站管理员。
ServerAdmin webmaster@linyupark.com
# 在 DocumentRoot 后加上存放网站内容的目录路径(用户的个人目录)
DocumentRoot /home/linyupark/public_html
<Directory /home/linyupark/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Allow from all
</Directory>
ErrorLog /home/linyupark/public_html/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /home/linyupark/public_html/access.log combined
ServerSignature On
</VirtualHost>注意:上面的 Order allow,deny、Allow from all 是 Apache 2.2 的写法。在 Apache 2.4 中,推荐改成:
<Directory /home/linyupark/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
</Directory>另外,NameVirtualHost * 在 Apache 2.2 中常用,但在 Apache 2.4 中已经不再需要。现在直接写 <VirtualHost *:80> 即可。配置时最好根据自己的 Apache 版本选择对应写法,避免出现语法警告或站点无法访问。
八、基于多个 IP 的虚拟主机
如果你的服务器有多个 IP,而不同的 IP 又有着不一样的虚拟用户的话,可以修改成:
<VirtualHost 192.168.1.10:80>
ServerName www.example1.com
DocumentRoot /var/www/example1
</VirtualHost>
<VirtualHost 192.168.1.11:80>
ServerName www.example2.com
DocumentRoot /var/www/example2
</VirtualHost>这样,访问不同 IP 时,就会进入不同的站点目录。不过大多数个人开发者和小型项目并不需要多个 IP,使用基于域名的虚拟主机已经足够。
一般情况下,我们只需要做两步操作:1、添加 ServerName www.example.com;2、修改 DocumentRoot /var/www 为自己定义的目录。
九、启用虚拟主机配置
1、现在我们配置的内容只是有效虚拟主机,要是真正发挥作用得放在 /etc/apache2/sites-enabled 文件夹下面,需要通过 ln 建立关联:
sudo ln -s /etc/apache2/sites-available/example.conf /etc/apache2/sites-enabled/example.conf
更推荐使用 Ubuntu 提供的命令:
sudo a2ensite example.conf sudo systemctl reload apache2
如果要停用某个站点,可以使用:
sudo a2dissite example.conf sudo systemctl reload apache2
使用 a2ensite 和 a2dissite 的好处是,它们会自动处理软链接,减少手动操作出错的可能。
十、修改 hosts 文件进行本地测试
2、修改 /etc/hosts 文件,加入当前主机的 IP 地址和需要设置的虚拟主机名,如:127.0.0.1 www.jiaoxue.com:
127.0.0.1 localhost 127.0.1.1 shanlei-Lenovo-ideapad-110-15ISK 127.0.0.1 www.jiaoxue.com # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
修改 hosts 文件的作用是:在本地测试时,让 www.jiaoxue.com 直接指向本机,而不需要真的去修改 DNS 解析。测试完成后,如果不需要,可以把这一行删除或注释掉。
十一、检查语法并重启 Apache
检查语法没有错误,如果没有错误,重启 Apache:
sudo /etc/init.d/apache2 restart // 或 service apache2 restart // 或 sudo systemctl restart apache2
在重启之前,建议先执行配置检查:
sudo apache2ctl configtest # 或者 sudo apachectl configtest
如果输出 Syntax OK,说明配置文件语法正确。然后可以重启或重新加载:
sudo systemctl reload apache2 # 或者 sudo systemctl restart apache2
一般来说,修改站点配置后使用 reload 更平滑;如果是修改端口、模块等,使用 restart 更稳妥。
十二、常见问题与排查
Apache 虚拟主机配置过程中,常见问题主要有以下几类:
1、访问域名仍然进入默认站点
可能是 sites-enabled 中没有建立链接,或者 ServerName 与访问域名不一致。检查 a2ensite 是否执行,检查 apache2ctl -S 输出,确认虚拟主机是否被正确识别。
2、403 Forbidden
通常是目录权限问题,或者 Directory 配置中没有允许访问。Apache 2.4 下确认有 Require all granted,并检查目录权限:
sudo chown -R www-data:www-data /var/www/example sudo chmod -R 755 /var/www/example
3、404 Not Found
检查 DocumentRoot 是否写对,目录中是否有 index.php 或 index.html,以及 DirectoryIndex 是否配置正确。
4、端口被占用
如果 Apache 启动失败,提示端口被占用,可以查看:
sudo ss -lntp | grep :80 sudo systemctl status apache2
常见占用 80 端口的程序有 Nginx、其他 Apache 实例或某些代理服务。确认后停用冲突服务,或修改 Apache 监听端口。
5、修改配置后不生效
可能是没有重启或重新加载 Apache,也可能是浏览器缓存、CDN 缓存、hosts 未生效。依次检查配置语法、服务状态、缓存和解析。
十三、安全与维护建议
Apache 配置完成后,还需要注意安全和维护:
- 生产环境不要长期使用
Options Indexes,避免目录被直接列出; AllowOverride根据项目需要设置,不要随意全部开启;- 及时更新 Apache 和 PHP 版本,避免旧版本漏洞;
- 为不同站点设置独立目录和日志,便于排查问题;
- 定期检查
error.log和access.log; - 使用
apache2ctl configtest检查语法后再重启; - 重要配置修改前先备份
/etc/apache2目录。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。本文从 Ubuntu 下 Apache 的配置文件结构讲起,说明了 apache2.conf、ports.conf、sites-available、sites-enabled、mods-available、mods-enabled 等目录和文件的作用,并给出了虚拟主机配置示例、启用方法、hosts 测试方法和重启命令。理解 available 与 enabled 的分离设计后,再配置 Apache 虚拟主机就不会容易蒙圈了。
本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/ubuntu/3976.html
