You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置SSL代理时阻塞Java ServerSocket通信问题

故障原因

三个配置问题叠加导致该现象:

  • 端口映射规则和Nginx监听逻辑冲突。当前配置的公网8083到本地8085的端口映射,会让公网流量要么直接绕过Nginx的SSL处理逻辑,要么和Nginx本地监听的8083端口产生流量抢占,SSL配置无法正常介入连接流程。
  • Nginx代理模式选择错误。现有配置使用http模块下的server块做转发,该模块仅支持处理HTTP/HTTPS协议流量,而你的服务是原生TCP Socket,不属于HTTP协议,即使流量到达Nginx,也会因为报文不符合HTTP格式被Nginx直接断开,不会转发到后端8085端口。
  • 客户端连接逻辑和SSL配置不匹配。客户端使用普通明文Socket连接配置了SSL的8083端口,而普通Socket只要完成TCP三次握手就会返回成功,也就是你看到的客户端打印Connected to server——这一步仅代表传输层连通,不代表SSL握手、应用层代理流程正常。后续客户端发送的明文报文会被等待TLS握手的Nginx判定为无效流量直接丢弃,连接不会被转发到后端Java服务,因此服务端的New Client Connected日志永远不会触发。

直连8085端口时流量完全绕过Nginx,客户端和Java服务端直接通过明文Socket通信,没有额外的协议校验和代理逻辑,因此可以正常运行。

解决方案

按以下步骤调整配置即可:

  1. 修正端口映射规则
    将公网端口映射规则修改为my.host.name:8083 -> localhost:8083,确保公网访问8083的流量先到达Nginx监听端口,由Nginx统一处理SSL终止,不要直接映射到后端Java服务的8085端口。
  2. 替换Nginx代理为四层TCP代理
    删除原有配置中写在http块内、和8083 TCP代理相关的server配置(包括重复监听443的冗余server块,避免端口冲突),在Nginx配置的最外层(与http块同级,不要写入http块内部)添加stream块做TCP层代理,配置示例:
stream {
    server {
        listen 8083 ssl;
        listen [::]:8083 ssl;
        ssl_certificate /location/to/fullchain.pem;
        ssl_certificate_key /location/to/privkey.pem;
        proxy_pass localhost:8085;
        proxy_timeout 300s;
        proxy_connect_timeout 10s;
    }
}

注:该配置依赖Nginx的ngx_stream_core_module模块,绝大多数官方源、系统源安装的Nginx默认已编译加载该模块,可通过nginx -V命令检查输出中是否包含该模块名。
3. 调整客户端连接逻辑
由于Nginx在8083端口做SSL终止,客户端到Nginx的链路需要走TLS加密,将客户端的普通Socket替换为SSLSocket即可,后端Java服务代码无需任何修改(Nginx到后端8085仍为明文TCP通信,和原有直连逻辑一致),客户端修改示例:

try (SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(InetAddress.getByName("my.host.name"), 8083)) {
    System.out.println("Connected to server");
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
    printWriter.println("Hello from client");
    printWriter.flush();
} catch (UnknownHostException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
}

如果使用自签名证书,需要额外在客户端配置信任库;使用正规CA签发的公网证书可直接运行上述代码。
4. 配置验证
执行nginx -t检查配置语法无误后,重启Nginx加载配置,确认8083、8085端口监听正常,启动Java服务后运行客户端即可正常通信。

内容的提问来源于stack exchange,提问作者Mahdiyar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:21:24