易君召
易君召
发布于 2026-06-23 / 2 阅读
0
0

Apache Flink + Nginx HTTPS + Basic Auth 一站式部署配置教程

采用 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 仅监听本地 / 内网地址,禁止公网直接访问 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,预期表现:

  1. 自动从 HTTP 跳转到 HTTPS

  2. 弹出登录认证框,输入配置的用户名密码

  3. 正常进入 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 数据即代表配置成功。

五、生产环境优化建议

  1. 证书自动化:使用 Certbot 申请免费 Let's Encrypt 证书并配置自动续期,避免证书过期。

  2. 访问控制:在 Nginx 层增加 IP 白名单,仅允许办公网 / 运维网段访问。

  3. 接口限流:添加 limit_req 模块配置登录接口限流,防范密码暴力破解。

  4. 审计日志:开启 Nginx 访问日志,记录所有登录与操作请求,满足合规审计要求。

  5. 细粒度权限:若需不同用户操作不同作业,可基于 Nginx + Lua 扩展权限控制,或使用企业发行版的 RBAC 体系。

六、常见问题排查

  1. 实时日志不显示、WebSocket 连接失败:检查 map $http_upgrade 映射是否正确,proxy_http_version 是否设为 1.1。

  2. 页面重定向到 HTTP 地址:确认 proxy_set_header X-Forwarded-Proto $scheme; 已配置,确保 Flink 识别前端协议为 HTTPS。

  3. 上传 Jar 包失败:调大 client_max_body_size 参数,匹配实际作业包大小。

  4. 登录后频繁弹出认证框:检查密码文件路径与权限,确认用户名与密码哈希匹配。


评论