明朗北街七万号·数研工坊|扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地
适用场景#
如果你属于以下任一种情况,这篇对你有用:
- 内网平台多个服务想统一从 80 端口访问,而不是一堆随机端口
- 需要反向代理、负载均衡、静态资源服务
- 内网想启用 HTTPS(自签证书),避免明文传输
- 想搞清楚 Nginx 的配置体系(server/location/upstream)
应用范围: 平台架构的统一入口。第 7 篇解决了「数据怎么存住」,本篇解决「请求怎么进来」。在整体架构里,Nginx 是所有 HTTP 请求的第一站,下面挂着应用服务、监控面板、数据平台各组件。
架构定位#
┌─────────────┐
用户请求 ──────► │ Nginx │ ← 本篇主角:唯一入口
└──────┬──────┘
┌──────┴──────┐
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 应用服务:8080 │ │ 监控面板:3000│ ← 下游各服务
└──────────────┘ └──────────────┘
│
▼
┌──────────────┐
│ 存储底座 │ ← 第 7 篇:MySQL/PG/Redis
└──────────────┘plaintext| Nginx 角色 | 说明 | 典型配置 |
|---|---|---|
| 反向代理 | 统一入口,转发到下游服务 | proxy_pass |
| 负载均衡 | 多个后端实例分担请求 | upstream |
| 静态服务 | 前端页面、静态资源 | root + index |
| SSL 终结 | HTTPS 证书卸载 | ssl_certificate |
一、问题#
平台跑起来了:应用服务 8080、监控面板 3000、接口服务 9090……用户要记一堆端口,还不安全。
而且内网环境没有现成的负载均衡器(没有云 SLB),所有请求需要一个统一入口。
二、约束#
- 无公网,Nginx 需编译安装或离线安装
- 需要自签证书做 HTTPS(没有正规 CA 证书)
- 下游服务数量多、端口各异
- ARM 机器也需要对应版本
三、安装 Nginx#
3.1 方案 A:离线编译(推荐,可定制)#
依赖第 4 篇编译好的 GCC,以及几个基础依赖包:
# 外网下载
wget http://nginx.org/download/nginx-1.24.0.tar.gz
# 内网编译
tar xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module
make -j$(nproc) && make installplaintext如果 configure 报缺依赖(pcre/zlib),用第 3 篇的 yum 源装:
yum install -y pcre-devel zlib-devel openssl-devel。
3.2 方案 B:yum 安装(省事,版本旧)#
yum install -y nginx # 前提:第 3 篇的本地源已配置plaintext3.3 启动#
# 编译安装的
/usr/local/nginx/sbin/nginx
# yum 安装的
systemctl start nginxplaintext验证:curl -I http://127.0.0.1 返回 200 即成功。
四、核心配置体系#
Nginx 配置的核心是三个块,层层嵌套:
http { # 全局:worker、日志、gzip
upstream backend { # 上游组:负载均衡的后端列表
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 weight=1;
}
server { # 虚拟主机:监听端口+域名
listen 80;
server_name example.com;
location / { # 路径规则:路由到哪
proxy_pass http://backend;
}
location /static/ { # 静态资源直接返回文件
root /data/www;
}
}
}plaintext理解优先级:http > server > location。
五、反向代理配置#
5.1 最简反向代理#
把所有请求转发到一个后端:
server {
listen 80;
server_name _;
location / {
proxy_pass http://192.168.1.11:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}plaintext5.2 按路径分发到不同服务(平台场景)#
一套平台多个服务,用路径区分:
server {
listen 80;
server_name _;
# 应用 API
location /api/ {
proxy_pass http://192.168.1.11:8080;
}
# 监控面板
location /grafana/ {
proxy_pass http://192.168.1.12:3000;
}
# 前端静态页面
location / {
root /data/frontend;
index index.html;
}
}plaintext这样用户只需要记一个地址
http://平台IP/,后面跟路径就能访问不同服务。
5.3 负载均衡#
upstream app_backend {
server 192.168.1.11:8080;
server 192.168.1.12:8080;
server 192.168.1.13:8080;
}
server {
listen 80;
location / {
proxy_pass http://app_backend;
}
}plaintext默认轮询。其他策略:
| 策略 | 配置 | 场景 |
|---|---|---|
| 轮询 | 默认 | 无状态服务 |
| 权重 | server x weight=3; | 机器性能不均 |
| IP 哈希 | ip_hash; | 需要会话保持 |
六、HTTPS 与自签证书#
6.1 生成自签证书#
内网没有 CA,用 openssl 生成自签证书:
# 生成私钥
openssl genrsa -out server.key 2048
# 生成自签证书(有效期 10 年)
openssl req -new -x509 -key server.key -out server.crt -days 3650 \
-subj "/C=CN/ST=Hebei/L=Xiong'an/O=Internal/CN=192.168.1.100"plaintext
CN可以填 IP 或域名。填 IP 的话,浏览器访问时用 IP 就不会报「域名不匹配」(还是会报「不受信任」,因为自签)。
6.2 配置 HTTPS#
server {
listen 443 ssl;
server_name _;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://192.168.1.11:8080;
}
}plaintext6.3 HTTP 跳转 HTTPS(可选)#
server {
listen 80;
return 301 https://$host$request_uri;
}plaintext七、常见坑#
| 坑 | 症状 | 解决 |
|---|---|---|
| 端口被占 | bind() to 0.0.0.0:80 failed | ss -tlnp 找占用进程 |
| 配置不生效 | 改了没反应 | nginx -s reload(不是 restart) |
| 静态资源 404 | location 路径不对 | 确认 root + URI 拼接后的真实路径 |
| 后端 502 | 后端没起来 | curl 直接测后端端口 |
| 日志没输出 | 排障无头绪 | error_log logs/error.log debug; |
| 上传大文件超时 | 413 / 504 | client_max_body_size 100m; + proxy_read_timeout 300s; |
八、总结#
Nginx 在内网平台里的角色一句话:一个入口,转发一切。
| 环节 | 核心配置 | 一句话 |
|---|---|---|
| 安装 | 编译加 --with-http_ssl_module | 记得带 SSL 模块 |
| 反向代理 | proxy_pass | 记住加 X-Forwarded 头 |
| 多服务 | 按 location 路径分发 | 一个端口访问整个平台 |
| 负载均衡 | upstream + ip_hash | 无状态轮询,有状态哈希 |
| HTTPS | 自签证书 + 443 server | 内网也建议上 TLS |
到这里,「请求入口 + 存储底座」 两层已经就位。下一批文章开始往上走——监控体系(Categraf → VictoriaMetrics → Grafana),然后是数据引擎(Flink → Spark → SeaTunnel → Calcite → DuckDB)。
本文首发于掘金 · 作者:七万号 扎根雄安新区中关村科技园,专注受限环境下软件搭建与数据平台落地