apache通过显式声明listen端口并为每个端口配置独立块实现多端口虚拟主机,需检查端口占用、防火墙放行、directory权限、selinux/apparmor策略及语法验证后重启服务。

Apache 本身不支持“多个服务共用同一个端口”的内核级端口复用(比如像 Nginx 的 reuseport),但在 Linux 下实现基于端口的虚拟主机,本质是让 Apache 同时监听多个端口(如 80、8000、8080),并为每个端口单独配置一个 <virtualhost></virtualhost> 块——请求打到哪个端口,就由对应块处理。这不是“复用”,而是“多端口监听+路由”。
下面分四步讲清楚,实操性强、避坑关键点都标出来了:
一、声明要监听的端口
Apache 不会自动监听你没明说的端口。必须在主端口配置文件里加 `Listen` 指令。- Debian/Ubuntu:编辑
/etc/apache2/ports.conf - RHEL/CentOS:编辑
/etc/httpd/conf/httpd.conf
添加你要用的端口,例如:
Listen 80 Listen 8000 Listen 8080
注意:
- 确保这些端口没被其他进程占用,运行
sudo ss -tuln | grep ':8000'查看; - 如果启用了防火墙(如 firewalld 或 ufw),记得放行对应端口,比如
sudo firewall-cmd --add-port=8000/tcp --permanent && sudo firewall-cmd --reload。
二、为每个端口写独立的 VirtualHost 配置
每个 `比如为 8000 端口建站点,创建 /etc/apache2/sites-available/site-admin.conf:
<virtualhost>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/app-admin
<directory>
Require all granted
Options Indexes FollowSymLinks
AllowOverride None
</directory>
ErrorLog ${APACHE_LOG_DIR}/admin-error.log
CustomLog ${APACHE_LOG_DIR}/admin-access.log combined
</virtualhost>
同理,再建 site-test.conf 对应 *:8080,路径、日志、权限都分开写。
关键细节:
-
<directory></directory>路径必须和DocumentRoot完全一致(包括结尾不加斜杠); -
Require all granted是 Apache 2.4+ 的硬性要求,漏掉直接 403; - 不要用
ServerName localhost多次——Apache 按顺序匹配,第一个命中就返回,后面的会被忽略。
三、启用配置并检查语法
- Debian/Ubuntu:启用站点 `sudo a2ensite site-admin.conf site-test.conf` - RHEL/CentOS:软链接到 `conf.d/` 目录,如 `sudo ln -s /etc/httpd/conf.d/site-admin.conf /etc/httpd/conf.d/`然后检查配置是否合法:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
sudo apache2ctl -t # Ubuntu/Debian # 或 sudo httpd -t # CentOS/RHEL
输出 Syntax OK 才能继续。
别跳过这步:语法错会导致重启失败,但错误提示常藏在 journalctl -u apache2 里,提前验证省时间。
四、处理 SELinux 或 AppArmor 权限(RHEL/CentOS/Ubuntu 必做)
非标准端口(8000、8080 等)默认不被安全模块允许绑定 HTTP 服务,否则 `systemctl start httpd` 会静默失败或报 `Permission denied`。-
RHEL/CentOS(SELinux):
sudo semanage port -a -t http_port_t -p tcp 8000 sudo semanage port -a -t http_port_t -p tcp 8080
验证:
sudo semanage port -l | grep http_port_t应看到新增端口。 -
Ubuntu(AppArmor):
编辑/etc/apparmor.d/usr.sbin.apache2,在network inet stream,下添加:network inet6 stream, bind 127.0.0.1:8000, bind 127.0.0.1:8080,
然后
sudo systemctl reload apparmor。
最后重启服务:
sudo systemctl restart apache2 # Debian/Ubuntu # 或 sudo systemctl restart httpd # RHEL/CentOS
测试访问:curl http://localhost:8000 或浏览器打开 http://你的IP:8000,看到对应页面即成功。










