- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
简短背景:如果我们回到 2006 年左右:我们(即:我的公司)使用了一个嵌入在浏览器中的 Java 客户端应用程序,该应用程序通过端口 443 连接到 C 程序后端在内部服务器上的端口 8068 上运行。在首次开发 java 应用程序时,端口 443 是我们知道不会被使用该软件的客户阻止的唯一端口(易于安装,并且可能客户内部工作人员没有权力或控制内部防火墙的知识)。
快进到 2016 年,我受雇帮助开发该 Java 应用程序的 NodeJS/Javascript 版本。 Java 应用程序在其替代品的开发过程中继续使用,但糟糕的是 - 我们了解到浏览器将在不久的将来放弃对嵌入式 Java 的支持。因此,我们切换到 Java Web Start,以便客户可以继续下载应用程序,并且它仍然通过端口 443->8068 路由连接到内部服务器。
2017 年即将到来,您知道吗,我们无法同时使用即将推出的带有 HTTPS/SSL 的 JS Web 应用程序和 Java 应用程序,因为它们使用相同的端口。 “好吧,让我们使用 NGINX 来解决这个问题。”但由于内部政治、客户需求以及网络开发人员的更替,我们从未抽出时间真正实现这一目标。
到了 2020 年,我们已经准备好部署新的 Web 版本的客户端软件,而整个 443 困惑局面又再次浮出水面。
本质上,我希望(暂时)允许 Java 应用程序继续使用 443,但现在也需要让 Web 应用程序使用 HTTPS。早在 2017/2018 年,我们就在 Google 上搜索过让它们通过 NGINX 共存的方法,但我们从未真正让它们正常工作,或者示例和教程不完整或令人困惑。看来我们需要按照 https://www.nginx.com/blog/running-non-ssl-protocols-over-ssl-port-nginx-1-15-2/ 的方式使用流式传输,或者查看传入的 HTTPS header 并执行 'if (https) { 路由到 nodeJS 服务器 } else { 假设它必须是 java 应用程序并路由到端口 8068 }
' - 内部的安排NGINX 配置文件。
过去的 Google 链接似乎不再存在,因此,如果有人知道 NGINX 配置允许 HTTPS 网站移交给仍需要使用 443 的非 SSL 应用程序,我将不胜感激。任何为我们指明正确方向的文档和/或教程也会有所帮助。提前致谢!
最佳答案
您可以使用ssl_preread选项来执行此操作。基本上,此选项将允许访问变量 $ssl_preread_protocol,其中包含在 SSL 端口协商的协议(protocol)。如果未检测到有效协议(protocol),则该变量将为空。
使用此参数,您可以在您的环境中使用以下配置:
stream {
upstream java {
server __your_java_server_ip__:8068;
}
upstream nodejs {
server __your_node_js_server_ip__:443;
}
map $ssl_preread_protocol $upstream {
default java;
"TLSv1.2" nodejs;
}
server {
listen 443;
proxy_pass $upstream;
ssl_preread on;
}
}
在您的情况下,此配置将直接将连接传递到您的nodejs和java后端服务器,因此,nodejs将需要协商SSL。您可以使用另一个服务器上下文将此工作传递给 NGiNX,例如:
stream {
upstream java {
server __your_java_server_ip__:8068;
}
upstream nodejs {
server 127.0.0.1:444;
}
map $ssl_preread_protocol $upstream {
default java;
"TLSv1.2" nodejs;
}
server {
listen 443;
proxy_pass $upstream;
ssl_preread on;
}
}
http {
server {
listen 444 ssl;
__your_ssl_cert_configurations_here__
location / {
proxy_pass http://__your_nodejs_server_ip__:80;
}
}
}
您需要 NGiNX 版本至少为 1.15.2 才能使用此配置,并使用 ngx_stream_ssl_preread_module 模块进行编译(需要使用 --with-stream_ssl_preread_module 配置进行编译参数,因为该模块不是默认构建的)。
来源:https://www.nginx.com/blog/running-non-ssl-protocols-over-ssl-port-nginx-1-15-2/
关于node.js - 如何让 SSL 很好地处理非 SSL 协议(protocol)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60492132/
我是一名优秀的程序员,十分优秀!