实战笔记:如何让多个服务在一台公网服务器上和平共处?我的端口规划方案
大家好,今天想和大家分享一个我最近折腾的真实案例。事情是这样的:我手头只有一台2核4G的云服务器,但需要同时运行Web服务、数据库、Git服务等多个应用。经过一周的折腾和踩坑,终于搞定了这个”一机多用”的方案,下面就把我的经验分享给大家。
1. 为什么需要端口规划?
刚开始我觉得这很简单:每个服务用不同端口不就好了?但实际操作时发现没那么简单。首先,80/443这种常用端口只能给一个服务用;其次,有些服务会默认占用相同端口(比如MySQL和Redis默认都是3306);最重要的是,胡乱分配会导致后期维护极其痛苦。
记得有一次半夜排查问题,因为端口记混了,把生产环境的数据库当测试环境操作了…(别学我)
2. 我的端口分配方案
经过多次调整,我最终采用了这套分类方案:
# Web相关
80/443 → 主网站(Nginx反代)
8080 → 测试环境
8443 → 管理后台
# 数据库
3306 → MySQL主库
3307 → MySQL从库
6379 → Redis
5432 → PostgreSQL
# 开发工具
2222 → SSH备用端口
3000 → Git服务
8081 → CI/CD面板
这个方案有几个优点:
- 按功能分组,容易记忆
- 保留了标准端口用于主要服务
- 为同类服务预留了连续端口
3. 实际部署中的坑
你以为这就完了?Too young!实际部署时我还遇到了这些问题:
防火墙配置: 阿里云/腾讯云的防火墙规则要单独设置,光改服务器iptables没用(别问我怎么知道的)
服务冲突: 有些服务会偷偷占用端口,比如Jenkins默认用8080,正好和我的测试环境冲突。解决方法:
# 查看端口占用
sudo netstat -tulnp | grep 8080
# 修改Jenkins配置
vi /etc/default/jenkins
HTTP_PORT=9090
4. 给新手的建议
如果你也要做类似配置,我的建议是:
- 先用Excel做个规划表,标注每个端口的用途
- 测试环境先用非标准端口,稳定后再切到80/443
- 一定要写文档!三个月后你绝对记不清3307是干嘛的
- 考虑用Nginx反代,这样外部只需要暴露80/443
最后分享一个我整理的端口占用检查脚本,保存为check_ports.sh
就能用:
#!/bin/bash
echo "正在检查常用端口..."
PORTS=(80 443 3306 6379 8080)
for port in "${PORTS[@]}"; do
result=$(netstat -tuln | grep ":${port} ")
[[ -n "$result" ]] && echo "⚠️ 端口 ${port} 被占用: $result"
done
echo "检查完成"
希望这篇实战经验对你有帮助。如果你有更好的方案,欢迎在评论区交流~
这个端口规划写得太实用了,正好最近也要配置服务器,可以直接抄作业了😂
建议加上docker服务的端口管理,现在用容器部署也很常见
半夜操作数据库这个太真实了,我上次也是把测试环境当生产环境清了,差点被开除