实战分享:如何在一台公网服务器上优雅地规划多个服务的端口
大家好,我是33blog的技术博主。今天想和大家聊聊一个看似简单但实际很容易踩坑的话题——多个服务共用一台公网服务器时的端口规划。这个需求在个人项目和小型企业中特别常见,我自己就经历过好几次”端口打架”的尴尬局面。
为什么需要端口规划?
记得我第一次部署个人网站时,天真地以为只要把Nginx的80端口打开就万事大吉了。直到后来需要同时运行MySQL、Redis和Node.js服务时,才发现端口冲突导致服务频繁崩溃。公网服务器不像本地开发环境,端口一旦被占用,影响的可是真实用户。
合理的端口规划能带来三个好处:
- 避免服务间端口冲突
- 便于后期维护和扩展
- 提升安全性(比如把管理端口放在非标准端口)
我的端口分配方案
经过几次踩坑后,我总结出了一套自己的端口分配规则,分享给大家参考:
# 基础服务
80/443 : Web服务 (Nginx/Apache)
22 : SSH (建议修改为高位端口)
3306 : MySQL (建议内网访问)
# 应用服务
8000-8999 : 主业务服务 (比如Node.js, Python等)
9000-9999 : 辅助服务 (比如Redis, Memcached)
# 管理端口
10000-10999 : 监控/管理 (Prometheus, Grafana等)
这个方案把端口按功能划分成了几个区间,就像给不同的服务分配了不同的”楼层”。实际使用中我会在服务配置里明确注释:
# /etc/nginx/sites-available/my-site
server {
listen 80;
server_name example.com;
# 主Web服务,必须使用80端口
...
}
几个实用技巧
在实践过程中,我总结了几个特别实用的技巧:
1. 使用端口转发
有时候不得不使用标准端口(比如HTTP的80),但内网服务可能运行在其他端口。这时可以用Nginx或HAProxy做转发:
location /api/ {
proxy_pass http://localhost:8001; # 把/api/的请求转到8001端口
}
2. 善用防火墙规则
不是所有服务都需要暴露在公网。我习惯用UFW只开放必要的端口:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp # 修改后的SSH端口
sudo ufw enable
3. 做好文档记录
在项目README或内部文档中维护一个端口分配表,新成员加入时能快速上手。我常用的格式:
| 服务 | 端口 | 用途 | 访问限制 |
|---------|-------|----------------|---------------|
| Nginx | 80 | 主网站 | 公网 |
| MySQL | 3306 | 数据库 | 仅内网 |
| Redis | 6379 | 缓存 | 127.0.0.1 |
常见问题处理
最后分享几个我遇到过的典型问题:
Q: 端口被占用了怎么办?
A: 先用sudo lsof -i :端口号
查占用进程,如果是非关键服务可以考虑换端口,或者调整服务启动顺序。
Q: 怎么快速测试端口是否开放?
A: 本地可以用telnet 服务器IP 端口
,线上推荐用nc -zv 服务器IP 端口
。
Q: 为什么修改了端口还是无法访问?
A: 检查三个地方:1) 服务是否监听0.0.0.0;2) 防火墙是否放行;3) 云服务商的安全组设置。
端口规划看似是个小问题,但好的方案能让服务器维护事半功倍。如果你有更好的经验,欢迎在评论区分享交流!
这个端口分配方案很实用,尤其是把不同服务划分到不同区间,避免冲突。
之前遇到过端口冲突的问题,搞得焦头烂额,早看到这篇文章就好了!
请问nginx转发的时候,负载均衡应该怎么配置比较合理?
收藏了!作为运维新手太需要这种实战经验了。
建议把SSH端口改到高位后,最好再加个fail2ban,双重保险。
MySQL放内网很合理,但如果是小型企业没有内网环境的情况下怎么处理比较好?