我正在服务器 A 上构建一个网站(已注册域名),用于人们创建和运行他们的“应用程序”。
这些“应用程序”实际上是运行在服务器B上的docker容器,在容器中,有一个可以直接访问的小型Web应用程序,如下所示:
http://IP_ADDR_OF_SERVER_B:PORT
PORT 是一个随机的大数字,映射到 docker 容器。
现在我可以使 SSL 证书在服务器 A 上工作,这样它就可以通过访问正常工作:
https://DOMAIN_NAME_OF_SERVER_A
问题是,我通过像上面一样访问“http”将“apps”包含在 iframe 中,因此我的浏览器(Chrome)拒绝打开它并报告错误:
Mixed Content: The page at 'https://DOMAIN_NAME_OF_SERVER_A/xxx' was loaded over HTTPS, but requested an insecure resource 'http://IP_ADDR_OF_SERVER_B:PORT/xxx'. This request has been blocked; the content must be served over HTTPS.
那么,我该如何处理这样的问题呢?
我是一个全栈菜鸟,如果您能分享一些关于如何构建一个健康的 https 网站同时以正确的方式解决此类问题的知识,我将不胜感激。
补充说明
好吧,我想我只是抛出了问题的概要,这里有更多细节。
我发现它是完整且直接的,可以使 iframe 请求通过 https 提供服务,这样我就不会再感到困惑了。
然而问题是,由于所有“应用程序”都是动态创建/删除的,因此我似乎需要为每个应用程序准备许多证书。
自签名证书是否可以正常工作而不会被浏览器阻止或投诉?或者我是否有一种方法可以使用一个 SSL 证书为所有“应用程序”提供服务?
软件环境
Server A:运行 node.js 网站,监听端口 5000 并使用 Nginx proxy_pass 提供服务。
server {
listen 80;
server_name DOMAIN_NAME_OF_SERVER_A;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5000;
}
}
server {
listen 443;
server_name DOMAIN_NAME_OF_SERVER_A;
ssl on;
ssl_certificate /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_A.cer;
ssl_certificate_key /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_A.key;
ssl_session_timeout 5m;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5000;
}
}
Server B:运行node.js应用程序监听不同的随机大端口号,例如50055,在创建“应用程序”时动态分配。 (事实上,这些应用程序在 docker 容器中运行,而我认为这并不重要)如果需要可以运行 Nginx。
Server A and Server B在公共交通中互相交谈。
Solution
正如所有答案一样,尤其是来自 @eawenden 的答案,我需要一个反向代理来实现我的目标。
除此之外,我还做了几件事:
1. 分配域名Server B用于使用 LetsEncrypt 证书。
2. 将预定义的 url 代理到特定端口。
因此我使用 nginx 设置了一个反向代理服务器Server B,代理所有请求,例如:
https://DOMAIN_NAME_OF_SERVER_B/PORT/xxx
to
https://127.0.0.1:PORT/xxx
PS:nginx反向代理配置开启Server B
server {
listen 443;
server_name DOMAIN_NAME_OF_SERVER_B;
ssl on;
ssl_certificate /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_B.cer;
ssl_certificate_key /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_B.key;
ssl_session_timeout 5m;
rewrite_log off;
error_log /var/log/nginx/rewrite.error.log info;
location ~ ^/(?<port>\d+)/ {
rewrite ^/\d+?(/.*) $1 break;
proxy_pass http://127.0.0.1:$port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
因此一切似乎都按预期进行!
再次感谢所有回答者。