1. IP 端口复用概述
各位同学好,我是老赵。今天咱们开始聊 IP 端口复用 这个话题。说实话,这玩意儿在运维圈子里不算新鲜,但真正能把它玩明白的人,我见过的不多。
先问个问题:你手头有台服务器,就一个公网 IP,但你想同时跑 Nginx、Tomcat、还有个内部监控面板。怎么办?
有人会说:「换端口啊,Nginx 用 80,Tomcat 用 8080,监控用 9090。」
没错,这是最直接的办法。但问题来了——用户访问你的 Web 服务,难道要让他们记住 8080 端口?还有,HTTPS 默认走 443,你总不能跟客户说「请访问 https://example.com:8443」吧?
嗯,这就是端口复用要解决的核心问题。
什么是端口复用
端口复用,说白了就是 让多个服务共享同一个 IP 和端口。比如你的服务器只有一个 80 端口,但通过端口复用技术,可以同时承载多个网站、多个应用。
我习惯把它比作「前台接待」。公司前台就一个人(端口),但不同部门的访客(请求)来了,前台会根据访客要找谁(域名、路径、协议头),把请求分给对应的部门(后端服务)。
实现端口复用的技术栈,常见的有这么几种:
| 技术 | 原理 | 典型工具 |
|---|---|---|
| 反向代理 | 统一入口,按规则转发 | Nginx、HAProxy |
| 透明代理 | 劫持流量,透明分发 | iptables、Envoy |
| SO_REUSEPORT | 内核级多进程绑定 | Linux 3.9+ 内核 |
| 虚拟主机 | HTTP Host 头区分 | Apache、Nginx |
这里面,反向代理和虚拟主机是生产环境最常用的。我后面会重点讲。
为什么需要端口复用
你可能会想:「我多开几个端口不就行了?又不费钱。」
嗯,这话在开发环境没毛病。但到了生产环境,情况就变了。
第一,公网 IP 是稀缺资源。 尤其是 IPv4,现在一个公网 IP 的年费可不便宜。你公司可能就两三个公网 IP,不可能给每个服务都配一个独立 IP。
第二,防火墙策略。 我记得有一次帮客户做安全审计,他们开了 20 多个端口,结果安全团队直接打回:「只开放 80 和 443,其他端口一律封掉。」你想想看,如果不用端口复用,你的服务根本没法上线。
第三,用户体验。 用户访问网站,默认就是 80(HTTP)和 443(HTTPS)。你让用户输端口号,十个人里有八个会忘。我见过一个电商项目,因为用了非标端口,转化率直接掉了 15%。
第四,证书管理。 HTTPS 证书绑定的是域名+端口。如果你每个服务都用不同端口,就得给每个端口配证书。证书到期续签、轮换,那工作量……我经历过一次,之后再也不想碰了。
端口复用的应用场景
聊完了概念和必要性,咱们看看实际中怎么用。我挑三个最常见的场景来讲。
场景一:反向代理
这是最经典的用法。Nginx 监听 80/443 端口,然后根据请求的路径、域名、甚至 Cookie,把请求转发给不同的后端服务。
举个例子:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_api:3000;
}
}
server {
listen 80;
server_name web.example.com;
location / {
proxy_pass http://backend_web:8080;
}
}
你看,同一个 80 端口,同时代理了 API 服务和 Web 服务。用户访问 api.example.com 和 web.example.com,走的都是 80 端口,但实际落到了不同的后端。
我在项目中遇到过一个问题:后端服务升级时,Nginx 还在转发旧请求,导致 502。后来我加了健康检查和优雅停机,才算彻底解决。这个后面会细讲。
场景二:负载均衡
端口复用也是负载均衡的基础。你想想看,如果每个后端实例都要独占一个端口,那负载均衡器还怎么分发流量?
负载均衡器(比如 HAProxy、Nginx)监听一个端口,后端多个实例共享这个端口。负载均衡器根据算法(轮询、最少连接、IP Hash)把请求分给不同的实例。
我曾经帮一个电商平台做过压测,他们用了 4 台后端实例,全部监听 8080 端口。结果发现请求经常超时。排查了半天,发现是 SO_REUSEPORT 没开,导致多个进程抢同一个端口,内核分配不均。开了之后,吞吐量直接翻倍。
场景三:虚拟主机
虚拟主机(Virtual Host)是端口复用的「老前辈」了。早年间 Apache 时代,大家就用虚拟主机在一个 IP 上跑几十个网站。
虚拟主机的原理很简单:HTTP 请求头里有个 Host 字段,告诉服务器「我要访问哪个域名」。服务器根据这个字段,把请求路由到对应的站点目录。
比如:
# Nginx 虚拟主机配置
server {
listen 80;
server_name site1.com;
root /var/www/site1;
}
server {
listen 80;
server_name site2.com;
root /var/www/site2;
}
两个域名,同一个 IP,同一个 80 端口。用户访问 site1.com 看到的是 site1 的内容,访问 site2.com 看到的是 site2 的内容。互不干扰。
嗯,这里要注意:虚拟主机依赖 HTTP 协议,如果用的是 HTTPS,还得考虑 SNI(Server Name Indication)。SNI 允许客户端在 TLS 握手时告诉服务器它要访问哪个域名,这样服务器才能返回正确的证书。这个后面讲 HTTPS 端口复用时我会专门说。
知识体系总览
为了让你对本章内容有个整体印象,我画了张图:
这张图把端口复用的三大应用场景串起来了。你可以看到,反向代理、负载均衡、虚拟主机,它们虽然实现方式不同,但核心目标一致——让一个端口承载更多服务。
好了,第一章就到这里。概念和场景都讲清楚了,后面咱们会深入每个技术细节,包括配置、调优、排坑。你先把这些基础打牢,后面实操才不会懵。