Apache端口映射靠Listen指令和<VirtualHost *:端口>绑定实现,ServerName仅标识域名、不参与端口路由;需先在httpd.conf中添加Listen端口、启用httpd-vhosts.conf,再在其中按端口定义VirtualHost并指定DocumentRoot。

Apache 的 ServerName 本身不直接参与端口映射,它只用于标识虚拟主机的域名(或主机名),真正决定“哪个端口对应哪个站点”的是 <VirtualHost *:端口号> 的监听配置。端口映射靠的是 Listen 指令 + <VirtualHost> 绑定,ServerName 只在基于域名的虚拟主机中起匹配作用;若用端口区分站点,ServerName 可写可不写,但建议设为有意义的值(如 localhost:8001 或实际域名),便于日志和调试。
1. 先启用目标端口监听
编辑 httpd.conf(或 apache2.conf),在 Listen 80 后添加你要用的额外端口:
Listen 80Listen 8001Listen 8002
确保这些端口未被其他程序占用(可用 netstat -an | grep :8001 或任务管理器检查)。
2. 启用虚拟主机配置文件
在 httpd.conf 中找到这一行并取消注释:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
Include conf/extra/httpd-vhosts.conf
这是 Apache 加载多站点配置的标准入口,不启用它,<VirtualHost> 块不会生效。
3. 在 httpd-vhosts.conf 中按端口定义虚拟主机
打开 conf/extra/httpd-vhosts.conf,写法示例如下:
<VirtualHost *:8001>
DocumentRoot "/var/www/site-a"
ServerName localhost:8001
<Directory "/var/www/site-a">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8002>
DocumentRoot "/var/www/site-b"
ServerName example.local:8002
<Directory "/var/www/site-b">
Require all granted
</Directory>
</VirtualHost>
注意:
– ServerName 这里写 localhost:8001 或 example.local:8002 是合法且推荐的,它不会影响路由,但能让错误日志、重定向响应更清晰;
– 不要写成 ServerName example.local 并期望它自动绑定到 8002 端口——必须配合 <VirtualHost *:8002> 才有效;
– 如果同时启用多个端口且都监听 *(即所有 IP),需确保每个 <VirtualHost> 的端口号唯一。
4. 补充说明:ServerName 和端口转发的区别
如果你实际想实现的是「用域名访问,但背后转发到不同端口的服务」(比如访问 api.example.com 实际走本地 127.0.0.1:3000),那就不是端口映射,而是反向代理。此时要用 mod_proxy,ServerName 写域名,再配 ProxyPass:
<VirtualHost *:80>
ServerName api.example.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
这种情况下,ServerName 是关键匹配字段,端口仍是 80(对外),而真实服务跑在其他端口(对内)。

















