痛点:我记不住这么多端口
最近在家里折腾了几台服务器,跑了一些自用服务:
- 一台Debian机器上挂着个人导航页(端口8080)
- 另一台Ubuntu跑着RSS订阅服务(端口3000)
- 还有台旧笔记本改的NAS,Web管理界面在端口9000
问题来了:每次想用某个服务,我都得想半天—这个服务跑在哪台机器?端口是多少?手机收藏夹里塞满了 http://192.168.1.10:8080、http://192.168.1.11:3000 这样的地址,换个设备就得重新输一遍。
更烦的是,有一次重装了内网的一台机器,IP变了,所有收藏的链接全部失效,一个个改到崩溃。
我需要一个统一的入口:所有服务都通过同一个IP访问,用不同的端口区分就行。这样我只需要记住一个地址,后端服务器怎么变都无所谓。
方案:HAProxy做统一接入层
HAProxy是一款轻量级的TCP/HTTP路由工具,正好解决我的问题。它可以在主服务器上监听多个端口,每个端口对应一个后端服务。架构很简单:
客户端 → 主服务器(HAProxy) → 根据端口转发 → 对应的后端服务器
主服务器用一台闲置的低配机器就行,HAProxy资源占用极小(内存<10MB),完全跑得动。
一、安装HAProxy
以Debian/Ubuntu为例:
apt update
apt install haproxy -y
haproxy -v # 验证安装
二、基础配置:单端口转发
先试一个最简单的:把主机的10001端口转发到内网某台机器的8080端口。编辑 /etc/haproxy/haproxy.cfg:
global
log /dev/log local0
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
retries 3
timeout connect 5s
timeout client 30s
timeout server 30s
frontend myapp-in
bind [::]:10001
mode tcp
default_backend myapp-out
backend myapp-out
mode tcp
server app-server 192.168.1.10:8080 check
启动:
haproxy -f /etc/haproxy/haproxy.cfg -c # 检查语法
systemctl restart haproxy
netstat -tlnp | grep 10001 # 确认监听
防火墙放行:
ip6tables -A INPUT -p tcp --dport 10001 -j ACCEPT
现在访问 http://主服务器IP:10001 就能看到实际跑在 192.168.1.10:8080 的服务了。
三、核心配置:多端口对应不同后端
一个端口显然不够,我要的是把所有服务都统一进来。
假设我有三个后端服务:
- 服务 后端IP 后端端口 统一入口端口
- 导航页 192.168.1.10 8080 10001
- RSS订阅 192.168.1.11 3000 10002
- NAS管理 192.168.1.12 9000 10003
配置文件这样写:
global
log /dev/log local0
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
retries 3
timeout connect 5s
timeout client 30s
timeout server 30s
# 导航页:10001 -> 192.168.1.10:8080
frontend nav-in
bind [::]:10001
mode tcp
default_backend nav-out
backend nav-out
mode tcp
server nav-server 192.168.1.10:8080 check
# RSS订阅:10002 -> 192.168.1.11:3000
frontend rss-in
bind [::]:10002
mode tcp
default_backend rss-out
backend rss-out
mode tcp
server rss-server 192.168.1.11:3000 check
# NAS管理:10003 -> 192.168.1.12:9000
frontend nas-in
bind [::]:10003
mode tcp
default_backend nas-out
backend nas-out
mode tcp
server nas-server 192.168.1.12:9000 check
重载配置:
haproxy -f /etc/haproxy/haproxy.cfg -c
systemctl reload haproxy
netstat -tlnp | grep -E "10001|10002|10003"
防火墙批量放行:
for port in 10001 10002 10003; do
ip6tables -A INPUT -p tcp --dport $port -j ACCEPT
done
四、使用体验
现在我的手机收藏夹里只存一个IP:http://主服务器IP,后面跟不同端口就行:
- 导航页::10001
- RSS订阅::10002
- NAS管理::10003
再也不用记一堆IP和端口。前几天我把NAS的IP从 192.168.1.12 改成了 192.168.1.13,只需要在HAProxy配置里改一行,重启服务,收藏的链接照常用,完全不受影响。
五、一些实用的小功能
5.1 健康检查自动摘除
配置里的 check 参数会让HAProxy定时检测后端服务。如果某台机器宕机,自动停止转发;恢复后自动加回来,不用手动干预。
5.2 抓包看请求是否到达
怀疑配置有问题时,抓包确认:
apt install tcpdump -y
tcpdump -i any port 10001 -n
有请求进来会看到类似:
13:45:22.123456 IP 客户端IP.54321 > 主服务器IP.10001: Flags [S]
看到这个说明请求到了,问题可能出在后端。
5.3 监控带宽占用
apt install vnstat -y
vnstat -d # 每日带宽
vnstat -h # 每小时带宽
vnstat -l # 实时带宽
5.4 配置备份
每次改配置前备份一下:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak.$(date +%Y%m%d)
六、遇到的小坑
- 云服务器要放行安全组:除了系统防火墙,云控制台的安全组也要开端口,容易漏。
- IPv4和IPv6:bind [::]:端口 写法同时监听两者,省事。
- 端口冲突:确保用的端口没被其他程序占用。
七、总结
这套方案让我从“记一堆端口”的混乱中解放出来:
- 一个IP入口,所有服务统一管理
- 后端随便换,前端无感知
- HAProxy极轻量,旧机器都能跑
