采用 Nginx 统一做 TLS 终止 + HTTP Basic 认证 的架构,这样Apache Flink 本身无需开启内部 SSL,仅监听本地 / 内网地址,所有外部访问均通过 Nginx HTTPS 入口,兼顾安全性与易用性,完全承接上一节 Simple 认证的需求。
一、前置准备
1. 环境说明
Flink 2.2.1 Standalone 集群,JobManager 默认端口 8081
Nginx 版本 1.20+(支持 TLS 1.3 建议 1.25+)
Linux 通用环境(CentOS / Ubuntu 均适用)
2. 准备 SSL 证书
方式 A:测试环境 - 生成自签证书
# 创建证书存放目录
mkdir -p /etc/nginx/ssl
# 生成自签证书(有效期10年,按需修改)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/flink.key \
-out /etc/nginx/ssl/flink.crt \
-subj "/C=CN/ST=Jiangsu/L=Nanjing/O=DevOps/CN=flink.example.com"
说明:
CN填写你的访问域名,无域名可填服务器 IP。自签证书浏览器会提示不安全,仅用于内部测试。
方式 B:生产环境 - 使用正规 CA 证书
将申请到的证书文件上传到服务器,建议统一存放路径:
证书文件(含完整链):
/etc/nginx/ssl/flink.crt私钥文件:
/etc/nginx/ssl/flink.key
3. 准备 Basic Auth 密码文件
承接 Simple 认证需求,使用 htpasswd 生成标准密码文件:
# 创建密码文件并添加 admin 用户
htpasswd -bc /etc/nginx/.flink-htpasswd admin 你的密码
# 追加其他用户(无需 -c 参数)
htpasswd -b /etc/nginx/.flink-htpasswd viewer 查看者密码
设置严格文件权限,避免泄露:
chmod 600 /etc/nginx/.flink-htpasswd
chmod 600 /etc/nginx/ssl/flink.key
二、完整 Nginx 配置
编辑 /etc/nginx/conf.d/flink-https.conf,以下配置包含 HTTP 强制跳转 HTTPS、生产级 TLS 安全策略、Simple 身份认证、Flink 反向代理、WebSocket 原生支持 全能力。
# WebSocket 协议升级映射(必须放在 server 块外、http 块内)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# HTTP 80端口:强制永久跳转 HTTPS
server {
listen 80;
server_name flink.example.com 你的服务器公网IP;
return 301 https://$host$request_uri;
}
# HTTPS 443端口:核心服务入口
server {
listen 443 ssl http2;
server_name flink.example.com 你的服务器公网IP;
# ========== SSL 证书配置 ==========
ssl_certificate /etc/nginx/ssl/flink.crt;
ssl_certificate_key /etc/nginx/ssl/flink.key;
# ========== SSL 安全配置(生产级标准) ==========
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# SSL 会话缓存,降低重复握手开销
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# 可选:开启 HSTS 强制HTTPS(确认服务稳定后再启用)
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# ========== Simple 认证(HTTP Basic) ==========
auth_basic "Flink Web UI Authentication";
auth_basic_user_file /etc/nginx/.flink-htpasswd;
# 上传文件大小限制(适配 Flink Jar 包提交)
client_max_body_size 200M;
# ========== Flink 反向代理核心配置 ==========
location / {
# 转发到 Flink JobManager REST 服务
proxy_pass http://127.0.0.1:8081;
# 基础代理头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
# WebSocket 支持(Flink 实时日志、监控指标依赖)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 超时配置(适配大作业提交、长连接日志)
proxy_connect_timeout 30s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# 禁用缓冲,保证实时日志流畅输出
proxy_buffering off;
}
}
高可用(HA)集群适配
若 Flink 为多 JobManager 的 HA 模式,新增 upstream 负载均衡配置,替换 proxy_pass 目标即可:
# 放在 server 块外
upstream flink_ha_cluster {
server jm1内网IP:8081;
server jm2内网IP:8081 backup; # 设为备用节点
}
# location 中修改转发目标:
proxy_pass http://flink_ha_cluster;
三、Flink 侧配套配置
为保障安全,建议 Flink 仅监听本地 / 内网地址,禁止公网直接访问 8081 端口,所有流量统一走 Nginx 入口。
修改 conf/flink-conf.yaml:
# REST 服务绑定地址(Nginx 同机填 127.0.0.1,跨机部署填内网IP)
rest.bind-address: 127.0.0.1
rest.address: 127.0.0.1
# REST 服务端口(默认 8081,与 Nginx 代理目标保持一致)
rest.port: 8081
配置修改后重启 Flink 集群生效:
./bin/stop-cluster.sh
./bin/start-cluster.sh
四、防火墙配置与生效验证
1. 开放端口
开放 80、443 端口,关闭 8081 的公网访问权限:
# firewalld 示例
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
2. 重载 Nginx 配置
# 检查配置语法正确性
nginx -t
# 平滑重载配置,不中断业务
nginx -s reload
3. 功能验证
浏览器访问验证
打开 https://你的域名或IP,预期表现:
自动从 HTTP 跳转到 HTTPS
弹出登录认证框,输入配置的用户名密码
正常进入 Flink Web UI,TaskManager 实时日志、监控指标可正常加载(WebSocket 生效)
REST API 验证
# 正式证书环境
curl -u admin:你的密码 https://flink.example.com/v1/overview
# 自签证书环境(加 -k 跳过证书校验)
curl -k -u admin:你的密码 https://服务器IP/v1/overview
正常返回集群概览 JSON 数据即代表配置成功。
五、生产环境优化建议
证书自动化:使用 Certbot 申请免费 Let's Encrypt 证书并配置自动续期,避免证书过期。
访问控制:在 Nginx 层增加 IP 白名单,仅允许办公网 / 运维网段访问。
接口限流:添加
limit_req模块配置登录接口限流,防范密码暴力破解。审计日志:开启 Nginx 访问日志,记录所有登录与操作请求,满足合规审计要求。
细粒度权限:若需不同用户操作不同作业,可基于 Nginx + Lua 扩展权限控制,或使用企业发行版的 RBAC 体系。
六、常见问题排查
实时日志不显示、WebSocket 连接失败:检查
map $http_upgrade映射是否正确,proxy_http_version是否设为 1.1。页面重定向到 HTTP 地址:确认
proxy_set_header X-Forwarded-Proto $scheme;已配置,确保 Flink 识别前端协议为 HTTPS。上传 Jar 包失败:调大
client_max_body_size参数,匹配实际作业包大小。登录后频繁弹出认证框:检查密码文件路径与权限,确认用户名与密码哈希匹配。