1. Apache 在 Ubuntu 18.04 上到底怎么装才稳
如果你手头正好有一台 Ubuntu 18.04 的服务器,或者跟我一样因为项目兼容性问题不得不继续用这个版本,那装 Apache 这件事我建议一步到位装对。网上搜 Ubuntu 装 Apache 的教程一抓一大把,但很多是 CentOS 的 yum 流程混着讲,或者把配置文件路径写错,照着敲完命令报一堆错,最后连 80 端口都没起来。
这篇文章就解决两件事:第一,在 Ubuntu 18.04 上把 Apache 装到能正常访问;第二,把默认的 80 端口改成你自己想要的端口。这两个操作看着基础,但涉及的系统文件、服务机制和坑点,我实际折腾过之后发现有很多细节值得单独拎出来讲。
先说适用范围。这个操作特别适合以下几类人:第一次接触 Linux 服务器的学生或者转行开发,需要本地起一个 Web 环境做测试;公司内部部署一些管理后台,不想用默认 80 端口暴露;或者你同时跑了 Nginx、Tomcat 等多个服务,80 端口被占用,必须给 Apache 换个端口。无论哪种情况,这篇都能帮上忙,而且我保证每一个步骤都是在 18.04 上实测过的,不是从老教程里复制粘贴的。
开始之前,先交代两个基础知识,省得到时候混淆。Ubuntu 下 Apache 的服务名是 apache2,配置目录是 /etc/apache2/,而 CentOS 里叫 httpd,配置文件在 /etc/httpd/。很多人就是在这一步踩了坑,照着 CentOS 的命令在 Ubuntu 上执行,自然什么都找不到。还有一点,Ubuntu 18.04 官方仓库里带的 Apache 版本是 2.4.x,对绝大多数场景完全够用,不需要去编译源码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的准备工作:先搞清楚你的系统状态
2.1 确认系统版本和网络环境
在正式安装之前,我强烈建议你先花一分钟确认系统信息。这里不是说非要严谨到查所有细节,而是避免下一步操作的时候出现版本不匹配的问题。打开终端依次执行:
bash复制lsb_release -a
uname -m
ping -c 4 mirrors.ubuntu.com
第一行看系统版本是不是 18.04,第二行看架构(一般是 x86_64),第三行确认能不能访问 Ubuntu 的软件源。我自己就遇到过内网机器源配置错误,导致 apt 安装直接超时的情况,所以网络连通性这一步真的别省。
还有一个容易被忽略的点:检查 /etc/apt/sources.list 里的源是否正常。18.04 的代号是 bionic,如果源文件里写的是旧版本代号,apt update 大概率会报 404。如果发现源有问题,先把源修改正确再继续,不然下面所有安装步骤都是白搭。
2.2 更新软件源和系统包
确认没问题后,第一步永远是更新软件源索引。这个操作的意义在于让系统知道你所在的软件仓库里最新有哪些包、什么版本。我见过有人跳过这步直接装,结果装到的是很久以前的旧版本,甚至可能因为依赖关系缺失而失败。
bash复制sudo apt update
apt update 只是刷新索引,不会真的升级软件。如果你系统已经跑了一段时间,建议顺便执行一次 apt upgrade 把现有软件包升级到与源匹配的最新版本,避免安装 Apache 的时候因为某个底层库版本过旧而出现依赖冲突。不过要注意,apt upgrade 会更新系统里已安装的软件包,如果在生产环境操作,建议先确认没有正在跑关键任务。
2.3 确认 80 端口是否被占用
这一步非常关键。Apache 默认监听 80 端口,如果你机器上已经装了 Nginx、Tomcat 或者其他 Web 服务,80 端口可能已经被占用,那 Apache 装完后服务根本起不来。所以装之前先检查端口情况,养成习惯,后面能省下大量排查时间。
bash复制ss -lntp | grep :80
如果输出为空,说明 80 端口空闲,可以放心继续。如果有输出,能看到是哪个进程占用了端口,例如:
code复制LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=12345,fd=6))
那你就得权衡一下,是停掉 Nginx 还是直接换个端口给 Apache。这篇博文的主线就是修改默认端口,所以在安装前先了解端口占用情况,能使你后面的决策更清晰。
3. 正式安装 Apache:apt 安装与基础验证
3.1 执行安装命令
系统准备好了,接下来就是安装本身。Ubuntu 下安装 Apache 非常简单,一条命令搞定:
bash复制sudo apt install apache2 -y
-y 参数表示自动确认,省去交互步骤。这里我多说一句,为什么不推荐源码编译安装?因为 Ubuntu 的 apt 仓库里已经维护好了 Apache 的依赖关系、启动脚本、默认配置和日志轮转,装完之后 service 管理、开机自启全部自动配好,源码编译则需要自己处理一大堆依赖,而且后续升级也麻烦。除非你有特殊模块需求,否则 apt 安装就是最优解。
3.2 检查安装结果和服务状态
安装完成后,先确认 Apache 是否正常运行:
bash复制sudo systemctl status apache2
正常状态会显示 active (running),同时能看到进程信息。如果没起来,先看错误日志:
bash复制sudo tail -f /var/log/apache2/error.log
另外,确认 Apache 版本:
bash复制apache2 -v
我本机装完显示的是 2.4.29,这是 18.04 官方源里的默认版本,稳定性和兼容性都没什么问题。
3.3 验证默认页面能否访问
Apache 安装完成后,默认会在 /var/www/html/ 下放一个 index.html,并且已经配置好了一个默认站点。这时候你在浏览器里访问服务器的 IP,应该能看到 Apache2 Ubuntu Default Page。
如果你是在本地虚拟机测试,直接访问 http://localhost 就行。如果访问不到,先检查防火墙。Ubuntu 18.04 默认带的是 ufw,执行:
bash复制sudo ufw status
如果是 Status: active,需要放行 80 端口:
bash复制sudo ufw allow 80/tcp
这一步做完,浏览器应该就能正常打开 Apache 默认页面了。默认页出现,说明整个 LAMP 环境里的 Web 服务器部分已经正常运转。
4. 核心操作:怎么把默认端口 80 改成自定义端口
4.1 修改端口前先搞清楚两个配置文件的关系
很多人修改 Apache 端口失败,就是因为只知道改一个地方。Apache 在 Ubuntu 下监听端口由两部分控制:主配置文件和虚拟主机配置文件。
主配置文件是 /etc/apache2/ports.conf,里面定义了 Apache 全局监听的端口。站点配置文件在 /etc/apache2/sites-available/ 目录下,默认的 000-default.conf 里定义了虚拟主机监听哪个端口。两个文件必须保持一致才能正常工作。
打个比方,主配置里的 Listen 80 相当于服务器在外面开了一扇门,而虚拟主机配置里的 <VirtualHost *:80> 相当于告诉 Apache 哪扇门对应哪个服务。只改其中一个,要么门开了但没人服务,要么服务等着但门没开,怎么都不对。
4.2 第一个关键步骤:修改 ports.conf
备份是个好习惯,尤其是改系统配置文件。我一般会先把原文件复制一份,出了问题能快速回滚:
bash复制sudo cp /etc/apache2/ports.conf /etc/apache2/ports.conf.bak
然后用编辑器打开:
bash复制sudo vim /etc/apache2/ports.conf
你会看到文件内容大概是这样的:
code复制# If you just change the port or address, you will also need to change the
# VirtualHost statement in /etc/apache2/sites-enabled/000-default.conf
Listen 80
把最后的 Listen 80 改成你想要的端口。比如我想改成 8080:
code复制Listen 8080
保存退出。这里注意,Apache 可以同时监听多个端口,比如:
code复制Listen 80
Listen 8080
这样 Apache 会同时监听 80 和 8080 两个端口。如果你想彻底放弃 80,只保留新端口,就只留一行 Listen 8080 即可。
4.3 第二个关键步骤:修改虚拟主机配置
按 4.2 的提示,接下来必须修改虚拟主机配置。默认站点文件在:
bash复制sudo vim /etc/apache2/sites-available/000-default.conf
核心内容:
code复制<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
把 <VirtualHost *:80> 里的 80 改成新端口:
code复制<VirtualHost *:8080>
保存退出。
这里有一个坑我必须提醒你:sites-available 和 sites-enabled 的关系。Ubuntu 下真正生效的配置是 sites-enabled 里的文件,而它通常是软链接指向 sites-available。你修改 sites-available 里的原始文件是正确做法,但如果你只改了 sites-enabled 里的软链接指向内容(某些编辑器可能会这样操作),重启后可能不生效或者覆盖掉。所以老老实实修改 sites-available 下的源文件。
4.4 检查配置语法,然后重启 Apache
改完两个文件,重启之前一定要检查语法。Apache 自带检查命令,如果语法有错误会直接告诉你哪个文件哪一行有问题,省得重启后服务崩了再去看日志:
bash复制sudo apache2ctl configtest
如果输出 Syntax OK,恭喜,配置没问题。接着重启 Apache:
bash复制sudo systemctl restart apache2
注意这里要用 restart,不要用 reload。因为端口配置属于监听级别的改动,reload 只重载配置,不一定能完整释放旧的端口绑定。实测中我遇到过 reload 之后端口没切换的情况,所以改成 restart 更彻底。
4.5 验证端口是否修改成功
重启后首先看服务状态:
bash复制sudo systemctl status apache2
确保是 active (running)。然后看端口监听情况:
bash复制ss -lntp | grep 8080
输出显示 Apache 进程正在监听 8080,说明修改成功。这时候浏览器访问就不能再用 80 端口了,需要显式加上端口号:
code复制http://服务器IP:8080
如果页面正常显示,整个端口修改工作就大功告成了。
5. 端口修改后的防火墙、日志与反向代理关联配置
5.1 防火墙放行新端口
端口改了,防火墙策略必须同步更新。很多人在这一步栽跟头:Apache 配好了,端口也监听了,但外面就是访问不了,最后发现是防火墙还在拦截。
Ubuntu 18.04 默认的防火墙是 ufw,修改端口后执行以下操作:
bash复制sudo ufw allow 8080/tcp
如果你确认不再需要 80 端口提供服务,也可以顺手禁掉旧的放行规则,避免端口暴露在公网增加被扫描的风险:
bash复制sudo ufw delete allow 80/tcp
既然提到了防火墙,我多说一嘴云服务器的安全组。如果你用的是云厂商的服务器,光改系统防火墙还不够,还得去云控制台的安全组里放行对应的端口。之前有个朋友本地怎么测都通,结果忘了安全组配置,折腾了一个晚上,这个坑非常典型。
5.2 日志文件的位置和排查价值
Apache 的日志目录默认在 /var/log/apache2/,包含两类文件:
access.log:记录所有访问请求,包括 IP、时间、请求路径、状态码error.log:记录 Apache 运行时的错误,包括配置问题、模块加载失败
实际排查问题的时候,日志的价值非常大。比如你改了端口后访问出现 403 或者 404,error.log 里会直接告诉你原因。我在 4.5 中修改完端口后访问出现连接被拒绝,第一时间看的就是 error.log,发现是虚拟主机配置里的端口号没改全,这个信息比盲目试配置高效得多。
查看最新日志的命令:
bash复制sudo tail -f /var/log/apache2/error.log /var/log/apache2/access.log
5.3 Apache 与 Nginx 共存时的反向代理配置
如果你的服务器上同时装了 Nginx 和 Apache,有一种常见架构是:Nginx 监听 80/443 对外提供服务,Apache 监听 8080 处理动态请求,Nginx 把特定路径反向代理给 Apache。这种情况下,端口修改反而成就了这种架构,配置也简单。
Nginx 侧的关键配置示例:
nginx复制server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样外部访问 80 端口的 /api/ 路径时,Nginx 会转发给 Apache 的 8080。这种架构的好处是把静态资源交给 Nginx 处理,动态请求交给 Apache,各取所长。如果你的 Apache 之前跑在 80,改成 8080 后正好可以这样玩。
6. 常见问题排查:为什么改了端口还是不生效
6.1 服务起不来的原因
最常见的问题就是改完配置后 Apache 启动失败。如果遇到这种情况,先执行:
bash复制sudo systemctl status apache2
sudo journalctl -xe
不管理论上讲服务为什么会失败,实践中我遇到过的主要原因集中在端口冲突、配置语法错误、权限问题三方面。
端口冲突很容易理解:新端口被其他进程占用,Apache 绑定失败。排查方法就是我们前面提到的 ss -lntp | grep 端口号。
配置语法错误相对好排查,因为 apache2ctl configtest 会明确提示文件位置和错误类型。
权限问题我单独拎出来说:如果设置了 Listen 8080 这样的非特权端口(大于 1024),Apache 可以正常绑定;但如果设置的是小于 1024 的端口如 81,那必须确认 Apache 进程的启动用户有权限绑定。如果使用 sudo systemctl start 启动失败,查看 /var/log/apache2/error.log,里面可能会出现 Permission denied 类似字样。这种情况可以考虑修改 Apache 的运行用户或组,但这是更进阶的操作,推荐先确认你改的端口大于 1024。
6.2 改了端口但浏览器访问不了
端口已经监听成功,但浏览器就是打不开,这个问题也比较常见。按下面的顺序排查:
- 防火墙状态:
sudo ufw status,确认新端口已放行 - 云安全组:云厂商控制台里确认入方向规则
- 本机测试:在服务器上执行
curl http://localhost:8080,能返回 HTML 说明 Apache 本身正常 - 路由器/NAT:如果是内网机器,确认端口转发配置
这里有个小技巧:如果你访问的是 http://IP:8080 却跳到 80 端口的内容,大概率是浏览器缓存,换个无痕窗口试一下。
6.3 Apache 服务正常但 80 端口还在监听
有时候你明明改了配置,结果 ss -lntp | grep :80 发现 80 还在监听。出现这种情况,几乎一定是还有其他配置文件中写着 Listen 80。
Ubuntu 的 Apache 配置支持 Include 机制,ports.conf 里可能会 Include 其他文件,比如:
code复制Include ports.conf
而且 sites-enabled 下如果有多个虚拟主机配置文件,每个文件里都可能有 <VirtualHost *:80>。所以排查思路是全局搜索:
bash复制grep -r "80" /etc/apache2/
把注意力放在 Listen 80 和 VirtualHost *:80 上,找到所有出现的位置,逐一确认是否需要修改。
6.4 修改端口后 HTTP 状态码异常
端口改完,访问新地址出现 403 或者 404,不要慌。403 通常是目录权限问题,Apache 进程用户(www-data)对 /var/www/html 没有读取权限,执行 sudo chmod -R 755 /var/www/html 一般能解决。404 则可能是 DocumentRoot 路径指向的文件不存在,或者虚拟主机配置里根路径错了。
这两类问题其实跟端口关系不大,只是改完配置顺手暴露出来了。正常排查顺序是:先看错误日志,再确认目录权限和文件是否存在。
7. 实用小技巧:多端口监听、域名绑定和性能基础调优
7.1 多端口同时监听
前面提到过,Apache 支持多端口监听。这在某些场景下很有用,比如同一台服务器上不同端口提供不同服务:
code复制Listen 80
Listen 8080
Listen 9000
然后配置多个虚拟主机:
code复制<VirtualHost *:80>
DocumentRoot /var/www/site1
</VirtualHost>
<VirtualHost *:8080>
DocumentRoot /var/www/site2
</VirtualHost>
这样访问不同端口会进入不同的站点目录。我之前在一台测试机上就是这样,80 端口挂一个简单静态页面,8080 端口挂一个内部分发系统,互不干扰。
7.2 基于域名的虚拟主机配置
如果你的服务器上有多个域名,希望不同域名对应不同站点,可以使用基于域名的虚拟主机,而不用端口区分。配置文件示例:
code复制<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example
</VirtualHost>
<VirtualHost *:80>
ServerName www.test.com
DocumentRoot /var/www/test
</VirtualHost>
这里要注意,新加的配置需要启用站点才能生效:
bash复制sudo a2ensite test.conf
sudo systemctl reload apache2
7.3 Apache 的基础性能调优参数
既然已经装好 Apache 并改了端口,顺手聊聊性能调优也不算跑题。Apache 的并发处理模块在 Ubuntu 下默认是 prefork,每个请求一个进程,内存占用相对较高。如果你的服务器内存不多,可以考虑切换成 event 模式(Apache 2.4 已支持):
bash复制sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
另外,/etc/apache2/apache2.conf 中有两个参数可以调:
code复制KeepAlive On
MaxKeepAliveRequests 100
KeepAlive On 允许多个请求复用同一个 TCP 连接,减少握手开销。MaxKeepAliveRequests 控制一个连接中最大请求次数。这两个参数对高并发静态资源访问有明显效果,但如果你只是本地测试环境,保持默认即可,没必要折腾。
8. 我踩过的坑和给你的一些建议
最后多聊几句实际操作中的体会。最开始我改端口的时候,习惯只改 ports.conf,觉得主配置改了就行,结果服务怎么重启都不生效。后来仔细看文件注释才发现里面写着“需要同时修改虚拟主机配置”。这个注释就在文件顶部的注释块里,只是很多人包括我在内都忽略了。
另一个常见的坑是防火墙问题。我在本地虚拟机测试的时候,ufw 默认是 inactive 的,所以完全不担心。但一到云服务器,安全组和 ufw 双重拦截,新端口就算监听了也进不来。这提醒我以后在任何环境里都要先确认防火墙状态,不要拿本地经验去套生产环境。
还有一次,我把端口改成 443 想顺便当 HTTPS 用,结果服务一直起不来。后来意识到 443 是 TLS/SSL 端口,必须在虚拟主机里配置证书才能正常用,光改 Listen 443 是不够的。所以现在改端口前我都会想清楚:这个端口是不是已经被其他协议约定俗成占用了?改端口这事,别只盯着数字本身。
给新手一个建议:改配置前一定先备份,改完检查语法再重启,遇到问题看日志。这三个习惯养成了,Linux 下很多服务配置都会顺手很多。如果你之前是因为服务器上已经跑了别的服务才给 Apache 换端口,那记得把这次修改的过程记录到你的运维文档里,下次重装系统或者换机器的时候能少走很多弯路。
