我有两个Docker容器。一个是运行在https上的应用,另一个是运行在Ratchet库上的web socket。
当我在Mac上的时候,我没有任何问题,可以从 https
到 ws
我猜想这是因为Docker是运行在 127.0.0.1
所以我想有一些特殊的规则允许它。
切换到Win机器上,问题就出现了,因为Docker是在 192.168.99.100
而今 https
到 ws
不再工作,因为浏览器期待 https
到 wss
连接。只是将端点切换到 wss://
而不是 ws://
很明显,这并不是开箱即用,因为连接握手自然会超时。
我的套接字容器没有运行nginx也没有运行apache,它是一个简单的Ratchet服务器,最终只是把我告诉它的端口暴露在外面。
有没有什么好的资源可以告诉我如何切换到 wss
因为我找不到。
这是我试过的。
$server = IoServer::factory(new HttpServer($wsServer), $config['port'], '0.0.0.0', [
'local_cert' => __DIR__ . '/../config/cert.pem',
'allow_self_signed' => true,
'verify_peer' => false,
'ciphers' => 'TLSv1.2'
]);
这段代码没有出错,但也没有启用。wss
端点,因为同样的事情正在发生。我怎样才能继续进行并使之工作?另外,我在某处看到wss自签名证书是不允许的。我可以在套接字容器上使用签名证书,并让应用程序容器使用自签名证书,或者它们都需要使用同一个证书吗?
EDIT.我想知道的是,我是否可以在socket容器上使用签名的证书,并将应用容器放在自签名的证书上,或者它们都需要使用同一个证书?
由于Ratchet不久前删除了SSL,我把代码加到了以下地方 IoServer::factory()
:
public static function factory(MessageComponentInterface $component, $port = 80, $address = '0.0.0.0', array $sslContext = null) {
$loop = LoopFactory::create();
$socket = new Reactor($address . ':' . $port, $loop);
if (is_array($sslContext)) {
$socket = new SecureReactor($socket, $loop, $sslContext);
}
return new static($component, $socket, $loop);
}
但即使没有它,我也尝试了另一种方式。
$server = new IoServer(new HttpServer($wsServer), new SecureServer($webSock, $loop, array(
'local_cert' => __DIR__ . '/../config/cert.pem',
'allow_self_signed' => true,
'verify_peer' => false,
)
));
我最终启动了Ratchet,就像现在这样(正常的)。ws
),并在应用端做一个nginx代理传递。
location /ws {
resolver 127.0.0.11 valid=30s;
set $backend "http://container_name:port";
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_pass $backend;
}
解析器部分确保nginx不会在你杀死容器时出错。