我想知道 nginx 是否能够在同一个端口上处理 http 和 https 请求。[*]
这就是我想要做的。我正在运行处理 http 请求的 Web 服务器 (lighttpd),以及通过 https 为文档树的特定部分提供服务的 C 程序。这两个进程运行在同一台服务器上。
在防火墙级别,我只能有一个端口将流量转发到此服务器。所以我想做的是在这台服务器上设置 nginx 以便它侦听单个端口上的请求,然后:
A) 重定向所有http://myhost.com/*请求,以便它们转到 localhost:8080(lighttpd 正在侦听的位置)
B) 如果用户请求以 https://myhost.com/app 开头的 URL,它会将该请求发送到 localhost:8008(C 程序)。请注意,在这种情况下,远程浏览器和 nginx 之间的流量必须加密。
你认为这可能吗?如果是,怎么做?
我知道如何使用两个不同的端口来做到这一点。我面临的挑战是仅使用一个端口来完成此操作(不幸的是,我无法控制此特定环境中的防火墙配置,因此这是我无法避免的限制)。使用诸如通过 ssh 进行反向端口转发来绕过防火墙的技术也不起作用,因为这应该适用于只有 Web 浏览器和 Internet 链接的远程用户。
如果这超出了 nginx 的能力,您知道还有其他产品可以满足此要求吗?(到目前为止,我在使用 lighttpd 和 pound 进行设置时没有成功)。我也更喜欢避免使用 Apache(尽管如果这是唯一可能的选择,我愿意使用它)。
提前致谢,亚历克斯
[*] 为了清楚起见,我说的是通过同一端口处理加密和未加密的 HTTP 连接。加密是通过 SSL 还是 TLS 完成都没有关系。
因此,为了后代的缘故,我正在尝试配置我的服务器,以便即使有人尝试访问 http://domain.com:443,他们也会被正确重定向到该站点的 https 版本(https://域名.com)。
在测试诸如 http://domain.com:443 之类的内容时,它没有正确重定向到 https://domain.com,而是被一个包含以下内容的 400 Bad Request 页面击中:
错误的请求
您的浏览器发送了此服务器无法理解的请求。原因:您对启用 SSL 的服务器端口使用纯 HTTP。请改用 HTTPS 方案访问此 URL。
Apache/2.4.18 (Ubuntu) 服务器在 sub.domain.com 端口 443
我尝试在我的000-default.conf
in 中包含以下几行<VirtualHost *:80>
:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
但它没有用。
此问题发生在所有域、子域和服务器 IP 本身上。
可能相关,尝试对 letencrypt 进行试运行会返回以下信息:
Domain: domain.com
Type: connection
Detail: Failed to connect to 123.123.123.123:443 for TLS-SNI-01
challenge
Run Code Online (Sandbox Code Playgroud)
对于启用站点的文件夹中列出的每个域。