HTTPS 默认跑在 443 端口,但迁移、避免扫描或与现有服务冲突时,需要把监听改到别的端口。改完服务配置、防火墙和内核监听三处都要同步。
改 Nginx 监听端口
nginx.conf 或 sites-enabled 里的 server 块用 listen 指令指定端口 [1]。改之前先用 nginx -t 校验配置,再用 systemctl reload nginx 平滑生效,无需断连。
# 把默认的 443 改成 8443
sed -i 's/listen 443 ssl;/listen 8443 ssl;/g' /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
ss -tulnp | grep nginx
如果你启用了 IPv6,记得把 listen [::]:443 也一起改掉。
改 Apache 监听端口
Apache 2.4 的端口在 ports.conf 的 Listen 指令里声明 [2]。改完后还要同步 sites-enabled 里的 <VirtualHost> 端口,否则服务启动会报地址冲突。
# 改全局监听端口
sed -i 's/Listen 443/Listen 8443/g' /etc/apache2/ports.conf
# 改默认虚拟主机
sed -i 's/<VirtualHost *:443>/<VirtualHost *:8443>/g' /etc/apache2/sites-enabled/000-default.conf
apache2ctl -t && systemctl restart apache2
ss -tulnp | grep apache2
防火墙放行与封堵
新端口必须先放行,再把旧端口封掉。ufw 的规则顺序很重要,先加 allow 再 delete deny,避免把自己锁在外面 [3]。也可以用 iptables 直接操作,但回滚更麻烦。
# 放行新端口
ufw allow 8443/tcp
# 删除旧 443 入站规则
ufw delete deny 443/tcp
# 确认规则列表
ufw status numbered
低编号端口(<1024) Historically 需要 root 才能绑定,但现代内核和 systemd 已经放开;只是 /etc/services 里的名字映射还在 [4],改端口不会影响程序运行。
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
ss 看不到新端口 |
配置文件改了但没 reload | 确认 systemctl reload 成功 |
| 防火墙规则顺序错 | deny 443 在 allow 8443 前面 |
ufw status numbered 看顺序 |
| 启动报 Address already in use | 端口被别的进程占用 | ss -tulnp 找 pid 再处理 |
| 浏览器提示 connection refused | 新端口没放行或服务没监听 | 先查服务再查防火墙 |
回滚与局限性
回滚就是把配置文件改回原来的端口,reload 或 restart 服务,然后把防火墙规则切回去。注意 ufw 没有 “undo” 命令,delete 规则前先 status numbered 确认规则编号。
WSL 和容器里的 systemd 行为可能和物理机有差异;WSL2 的 localhost 转发是内置的,但端口冲突检查逻辑和原生 Linux 一致 [5]。实际公网服务器上改 443 还要同步 CDN、负载均衡和证书路径,这些不在本教程范围内。
参考资料
- [1] Module ngx_http_core_module — nginx.org(nginx)
- [2] Apache HTTP Server Version 2.4 — MPM Common Listen(apache)
- [3] ufw(8) — Debian bookworm(ufw)
- [4] services(5) – Linux manual page(services)
- [5] ss(8) – Linux manual page(ss)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。