☰
Ubuntu 18.04上Apache安装配置与虚拟主机实战指南
2026/10/17 12:20:34 网站建设 项目流程

这个系列走到第五篇,终于要聊到把Web服务真正拉起来这件事了。虽然前面铺垫了不少Linux基础,但到了Apache安装这一步,很多人依然会卡在各种细节上:装是装上了,服务起不来;默认页打不开;防火墙一通乱配,最后SSH都断了。这篇就以Ubuntu 18.04(标题里的Ubuntu 18基本都指这个LTS版本)为例,把Apache从安装、核心配置、虚拟主机到常见故障排查完整过一遍。无论你是刚入门的运维新人,还是想自己捣鼓一台网站服务器的技术爱好者,这篇文章能当一份直接照着操作的手册来用。

1. 为什么还在用Apache?——安装前的选型思考

1.1 Apache与Nginx:先想明白为什么选它

很多新手一搜“Web服务器”,满屏都是Nginx高并发、轻量级。没错,Nginx在静态资源和反向代理场景下确实有优势,这也让不少人对Apache产生误解,觉得它是不是已经被淘汰了。我实际接触到的项目里,Apache不仅没过时,存量市场还非常大。尤其是那些跑了很多年的PHP项目、虚拟主机商的客户站点、企业OA系统,后面对接的几乎都是Apache。原因也很简单:.htaccess目录级配置这种机制,对传统PHP应用的伪静态、目录访问控制、防盗链来说实在太方便了。你不需要改主配置,扔一个.htaccess到目录里就能生效。

这里放一张对比表,大家根据场景去权衡:

对比项ApacheNginx
并发模型进程/线程模型,稳定但内存开销相对大事件驱动模型,高并发下资源占用更低
模块管理支持动态加载,a2enmod即可启用多数模块需编译时选定,后期调整麻烦
目录级配置支持.htaccess,目录独立规则灵活不支持目录级动态配置,所有规则在server/location里定义
新手友好度默认配置就能跑,资料和踩坑记录极多配置层级较多,对新手有一定门槛

两者并不是二选一的关系,生产环境里Apache和Nginx并存也很常见:Nginx在前面处理静态文件和负载均衡,Apache在背后跑动态业务。但既然本系列的主题是Apache,我们就先把这一条链路走通走扎实。

1.2 Ubuntu 18环境准备与安装规划

很多人安装失败,根本不是命令敲错,而是环境压根没想好。Ubuntu 18.04在2018年发布,属于非常经典的LTS版本,虽说现在看稍微有点年头,但在很多企业内部服务器上依然大量存在。它的软件管理走的是apt体系,跟Debian同源,日常操作习惯和20.04、22.04并没有本质区别。

装上Apache之前,我建议先做三件小事:

  1. 确认系统版本。执行cat /etc/os-release,看清楚到底是Ubuntu还是Debian,版本号是多少。不同版本包名和默认配置可能有细微差别,比如CentOS用的是httpd,Ubuntu则叫apache2,这里就体现得很明显。
  2. 刷新软件源缓存。sudo apt update这步不能省。新机器或者长时间没维护过的系统,本地软件包列表可能很旧,直接install可能拿到过时版本甚至找不到包。更新一下,让系统知道从哪里下载最新版本。
  3. 确认网络连通性。apt要访问Ubuntu官方软件源,如果服务器在内网,或者公司有专门的apt内网源,提前把/etc/apt/sources.list配置好,可以省掉大量外网延迟。

这三步做完,再执行sudo apt upgrade把系统基础包升一遍。当然,如果是生产环境,升级系统包要格外谨慎,防止升级完内核或关键库导致服务异常。新装的实验环境就没这么多顾虑,升一下更稳妥。

另外建议在动手之前先想好目录规划。Apache默认会把站点文件放到/var/www/html,但实践里我更推荐在/var/www下为每个站点单独建目录,比如/var/www/mysite,然后在虚拟主机配置里单独指向。为什么这么干?因为默认目录如果直接被业务占用,后面加站点、做隔离、改权限都会很别扭,尤其是多站点共享一台服务器的时候,目录混乱几乎必然引来权限问题。

2. 核心实操:在Ubuntu 18上安装Apache

2.1 安装命令与版本确认

安装这条路其实很简单,核心就两条命令:

sudo apt update sudo apt install apache2 -y

-y参数表示遇到询问自动确认,免去手动交互。如果你是在自己电脑的虚拟机上实验,不加也没问题,就是中途需要按一次回车。

装完后不要急着去做别的事,先验证它到底装没装上。我最常用的命令是apache2 -v,它能输出版本信息。Ubuntu 18.04自带的Apache版本一般是2.4.29左右,这是非常经典且稳定的一个发行版版本。如果提示command not found,说明安装没成功或者PATH有问题,这时候回过头去检查apt安装过程有没有报错。

再看服务状态:

systemctl status apache2

正常情况下输出里会有一行active (running),代表systemd已经接管了Apache进程。Ubuntu的Apache包默认就写好了自启动规则,开机自动拉起来,不需要你额外配置rc.local。这一点对于从源码编译安装过Apache的人来说,会直观感受到差距:发行版包管理真的香。

最后顺手看一下端口监听:

ss -tulpn | grep :80

看到LISTEN并且地址是0.0.0.0:80或:::80,说明Apache已经正常绑定在80端口上了。这里插一句,很多人习惯用老的netstat命令,但Ubuntu 18上ss才是御用工具,参数类似,输出更清晰,建议直接改用它。

2.2 服务管理与启动验证流程

安装完不是终点,还得确认它确实能对外服务。我习惯分两步验证:

第一步,本机自测:

curl -I http://127.0.0.1

能看到HTTP/1.1 200 OK,说明Apache进程本身没有问题,监听和默认站点都正常。

第二步,查看本机IP,然后浏览器访问:

hostname -I

浏览器输入http://服务器IP,如果看到“Apache2 Ubuntu Default Page”或者类似说“It works!”的默认页面,说明对外访问链路是通的。

这里有个小彩蛋,Ubuntu默认页面里藏着很多实用提示,不仅有安装路径说明、常用配置指引,还告诉你静态文件目录在哪。我当年第一次见到这个页面的时候,还以为是某个教程写的,后来才发现就是Apache包自带的欢迎页,完全可以当成本地文档用。不过生产环境里这个默认页建议尽早换掉,换成自己的维护页面,省得暴露过多环境信息。

顺利走到这里,说明服务状态、端口监听、本机访问、外部访问全部正常。接下来才是真正开始“用”Apache的时候。

2.3 核心目录结构:装完后先看懂“地图”

Apache装好之后会生成一整套目录结构。很多人在网上搜索教程,照着改某一个文件,出了问题就不知道去哪里查。这里先把目录地图摊开:

目录/文件作用
/etc/apache2/apache2.conf全局主配置文件,进程属主、全局权限、日志格式等都在这里
/etc/apache2/ports.conf端口监听配置文件,默认监听80端口
/etc/apache2/sites-available/所有可用站点的配置模板存放处
/etc/apache2/sites-enabled/真正生效的站点软链目录
/etc/apache2/mods-available/可安装的模块列表
/etc/apache2/mods-enabled/当前生效的模块软链
/var/www/html/默认站点根目录
/var/log/apache2/access.log访问日志
/var/log/apache2/error.log错误日志

sites-enabled和mods-enabled这两个目录的精髓在于,里面的文件都是软链,指向../sites-available/xxx.conf这种。这种设计的好处是:你只管在available里放配置,用a2ensite或a2enmod来“启停”,不用手动去改太多东西。我之前见过有人直接编辑sites-enabled下的软链文件,一保存整个配置文件就变成普通文本了,逻辑瞬间失效,这是个很低级但很容易犯的错。记住:改配置永远去available目录改,然后用命令去启停。

2.4 为什么选apt安装而不是源码编译

不少教程会教你从官网下载源码,手动./configure、make、make install。这种装法不是不行,而是对新手来说坑太深。编译过程中需要自行解决一堆依赖库,装完还得自己写systemd服务单元、设置日志轮转、配置用户权限,稍有不慎就留一身烂摊子。

用apt install apache2的优势在于:

  • 依赖自动解决,apt会把需要的库一并装上。
  • 目录结构和配置体系统一,符合Debian系的运维习惯。
  • 自带systemd服务文件,启停、开机自启都帮你配好了。
  • 安全补丁能通过apt upgrade直接升级,源码安装反而要手工维护版本。
  • 自带logrotate日志轮转配置,不会出现日志把磁盘撑爆这种低级事故。

老运维常挂在嘴边的一句话是:能用包管理器软件包解决的问题,尽量不要自己编译。这个原则放到Apache这个场景上依然适用。除非你确实需要某个官方包没有的特殊模块或者定制编译参数,那时候才建议源码安装,但那是进阶话题,这里不展开。

3. 深入配置:让Apache真正开始工作

3.1 防火墙规则:别让80端口被堵住

安装成功但外部访问不了,多数情况和Linux自身防火墙或者云平台安全组有关。Ubuntu 18自带UFW防火墙,但默认是未启用状态。问题来了,有些人直接从网上抄命令,先sudo ufw enable再添加规则,结果把自己SSH连接掐断了。

正确的顺序一定是先把必要端口放行,最后再启用防火墙。常用的放行命令:

sudo ufw allow OpenSSH sudo ufw allow 'Apache Full' sudo ufw enable

Apache Full是UFW里现成的应用规则,会一次放行80和443两个端口。如果你暂时不打算上HTTPS,也可以只放行80:

sudo ufw allow 80/tcp

sudo ufw enable之后,再用sudo ufw status确认规则生效。这里提醒一句:云服务器厂商在控制台还有一套安全组规则,服务器内部防火墙放行了,云平台安全组没放行,外面照样进不来。这种双层防火墙模型经常让新手原地发懵,排查时一定要两头都看。

另外,如果你只是想在虚拟机里做测试,UFW完全可以用但不强制开,很多人也选择不开系统防火墙,直接靠云安全组做访问控制,这也是常见做法。

3.2 虚拟主机配置:一个服务器跑多个站点

安装完成后默认站点指向/var/www/html,但真实业务里很少会直接往里塞东西。更规范的做法是建虚拟主机。我这里给出一套可以直接抄的流程:

第一步,创建站点目录并放一个测试文件:

sudo mkdir -p /var/www/mysite echo "<h1>My Site</h1>" | sudo tee /var/www/mysite/index.html

第二步,复制默认配置作为模板:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/mysite.conf

复制一份再改,比手写整个VirtualHost靠谱,因为默认配置里的语法结构、缩进风格都是现成的,不容易出错。

第三步,编辑mysite.conf,重点确认这几个参数:

<VirtualHost *:80> ServerName mysite.example.com ServerAdmin webmaster@example.com DocumentRoot /var/www/mysite ErrorLog ${APACHE_LOG_DIR}/mysite_error.log CustomLog ${APACHE_LOG_DIR}/mysite_access.log combined </VirtualHost>

ServerName填你解析好的域名,如果只是测试环境,直接用服务器IP填进去也行。DocumentRoot必须指向你刚才建的站点目录,这是整个配置的灵魂。日志建议单独设置文件,这样不同站点的日志能分开排查,比混着看全局日志舒服太多。

第四步,启用站点并重载配置:

sudo a2ensite mysite.conf sudo systemctl reload apache2

注意这里我用的是reload而不是restart。两者区别很值得记住:reload是平滑重载配置,不会中断正在处理的请求;restart是全部杀掉再启动,生产环境会造成瞬时断连。绝大部分配置变更场景,用reload就足够。

第五步,验证:

curl -H "Host: mysite.example.com" http://127.0.0.1

如果配置正确,你会看到自己写的<h1>My Site</h1>内容。浏览器访问时,只要域名解析到服务器IP,也能看到同样页面。

这里必须单独提醒一个高频错误:目录权限。如果站点目录放在/var/www下面,默认的继承权限通常没问题,因为apache2.conf里已经对/var/www授予了Require all granted。但如果你把站点目录放在其他位置,比如某个用户的/home/user/site下,就必须在配置里手动加一段:

<Directory /home/user/site> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>

不加这段的典型后果是访问时返回403 Forbidden。这也是虚拟主机配置新手的头号拦路虎。

3.3 启用常用模块:rewrite、ssl、headers

Apache的模块化机制用好了能解决大量实际需求。日常我至少会开这几个模块:

sudo a2enmod rewrite sudo a2enmod ssl sudo a2enmod headers sudo a2enmod expires
  • rewrite:URL重写,很多框架的路由规则、伪静态都依赖它。
  • ssl:启用HTTPS的基础,后面配证书时会用到。
  • headers:可以自定义HTTP响应头,比如跨域、缓存策略。
  • expires:给静态资源设置过期时间,对页面性能优化作用明显。

开完模块之后同样执行sudo systemctl reload apache2生效。a2enmod会在mods-enabled下自动生成软链,所以你可以随时用ls /etc/apache2/mods-enabled确认当前开了哪些模块。

关于模块还有一个常见问题:是不是把所有模块都开上更省事?我的建议是不要。模块开多了,内存占用和处理开销都会变大,某些调试模块还可能暴露内部信息。更糟糕的是,模块之间可能存在依赖关系,出现冲突时排查难度直线上升。我的习惯是“需要什么开什么”,保持最小化,这样以后排查问题时,范围能控制在很小。

4. 常见问题排查与避坑指南

4.1 80端口被占用:Apache起不来的头号原因

Apache装的没问题,但systemctl status apache2一看是failed,十有八九是80端口被抢了。我在实际环境里见过抢端口的选手不少,有Nginx、有Java后端服务、有Squid代理、还有别的web容器。

定位命令:

sudo ss -tulpn | grep :80

加上sudo才能看到PID和进程名称,否则输出会缺少关键信息。确认占用进程后,二选一:要么停掉对方,要么让Apache改用其他端口。如果决定让Apache监听8080,记住改两处:/etc/apache2/ports.conf里的Listen 80改成Listen 8080,同时站点配置里<VirtualHost *:80>也要改成<VirtualHost *:8080>。漏改任何一处,都会出现“服务起来了但监听的不是你以为的端口”这种怪象。

4.2 默认页面打不开:三层排查法

外网访问不了Apache默认页,本机却正常,这时候我一般按三层顺序来查:

  1. 本机自测:curl -I http://127.0.0.1先行。本机都不通,说明问题出在服务本身,往下查日志;本机通,继续看防火墙。
  2. 防火墙排查:sudo ufw status看服务器内部防火墙,再登录云平台控制台检查安全组是否放行80端口。这个双层防火墙模型我前面已经强调过,很多网页打不开的问题都卡在这里。
  3. 监听地址检查:sudo ss -tulpn | grep :80,看Apache是监听0.0.0.0:80还是127.0.0.1:80。如果只监听在回环地址上,外部自然永远无法访问。默认配置是监听所有地址,但如果你自己改过ports.conf,这一步不能漏。

这套排查流程在实践中大约能解决八成以上的“打不开”问题,而且每一步耗时都在十几秒内,非常值得养成习惯。

4.3 403权限问题与目录配置要点

配置虚拟主机后访问返回403 Forbidden的场景太常见了。原因基本可以归为两类:

第一类,目录权限不足。Apache进程以www-data用户运行,它需要能读取站点文件。文件至少是644权限,目录至少是755权限。很多人把站点文件放在用户家目录下,权限还是700,那Apache自然什么都读不到。解决办法是:

chmod 755 /var/www/mysite chmod 644 /var/www/mysite/index.html

如果目录确实在用户家目录这种权限敏感区,更省事的方案是直接把站点目录建到/var/www下,从根源上规避权限问题。

第二类,Directory指令没配置好。如果你的站点目录不在/var/www下,又没有给对应目录写Require all granted,Apache默认会拒绝访问。这块容易和第一种情况混淆,排查时可以先看error.log,权限问题通常会有Permission denied或client denied by server configuration这样的关键字。

还有一个隐蔽场景:目录下有Options Indexes时,如果存在index.html,正常显示页面;一旦没有索引文件,Apache会把整个目录结构列出来,这在生产环境既不好看也不安全。建议把Options Indexes FollowSymLinks里的Indexes去掉,或者改成Options -Indexes。

4.4 日志、备份与安全加固建议

Apache的日志是排查问题的第一手资料。/var/log/apache2/error.log记录后端错误,access.log则能看到所有访问请求。我习惯在改动配置或站点上线时用tail -f实时观察日志,这个习惯帮忙定位过不少奇怪问题,比如某个静态资源配置路径不对、某个目录权限被篡改、甚至还能看到被扫描工具探测的痕迹。

安全方面,有几件事装完Apache就顺手做了,成本很低但收益很大:

  • 隐藏版本号:在/etc/apache2/apache2.conf里加上ServerTokens Prod,避免响应头直接暴露完整版本信息。
  • 关闭目录列表:确认站点配置里没有启用Indexes,避免目录索引直接裸露给外部。
  • 确认日志轮转生效:/etc/logrotate.d/apache2是系统自带的,确认它存在,日志就不会无限膨胀挤爆磁盘。
  • 定期备份配置:sudo cp -r /etc/apache2 /etc/apache2.bak_$(date +%F),改动任何配置前先备份。看似麻烦,关键时刻能救命,我确实见过有人把配置改坏又没备份,最后只能凭记忆一点点恢复的场景。

最后再分享一个经验技巧:改完任何Apache配置,先别急着reload,跑一遍sudo apache2ctl configtest。它会帮你做语法检查,输出Syntax OK才代表没有低级拼写错误。我每次配置站点、启停虚拟主机前后都会执行一下,配合reload而不是restart,这套组合拳用了很久,基本没有因为配置语法错误把线上服务搞挂过。装完Apache只是第一步,能把它配置成一台可以稳定服务业务的Web服务器,才算是真正把这篇内容吃透了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询