如何在Cro中配置WSS协议?含Docker与Apache部署相关疑问
Cro框架WSS协议支持与部署问题解决方案
已基于Cro和WebSocket搭建服务,本地HTTP环境下WS连接正常,但HTTPS页面无法建立WSS连接,针对你的三个疑问解答如下:
a) 修改Cro代码以支持WSS协议
要让Cro支持WSS,需在HTTP服务器配置中添加TLS监听器,具体操作如下:
- 引入
Cro::TLS模块 - 在
Cro::HTTP::Server初始化时添加tls参数,指定证书与私钥路径
修改后的服务代码示例:
use Cro::HTTP::Log::File; use Cro::HTTP::Server; use Cro::HTTP::Router; use Cro::HTTP::Router::WebSocket; use Cro::TLS; # 新增引入TLS模块 my $host = %*ENV<RAKU_WEB_REPL_HOST> // '0.0.0.0'; my $port = %*ENV<RAKU_WEB_REPL_PORT> // 35145; # 从环境变量读取证书和密钥路径,避免硬编码 my $cert-path = %*ENV<TLS_CERT_PATH> // '/path/to/certificate.crt'; my $key-path = %*ENV<TLS_KEY_PATH> // '/path/to/private.key'; my Cro::Service $http = Cro::HTTP::Server.new( http => <1.1>, :$host, :$port, application => routes(), after => [ Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR) ], # 新增TLS配置 tls => Cro::TLS::Config.new( certificate => $cert-path.IO, private-key => $key-path.IO ) ); $http.start; react { whenever signal(SIGINT) { say "Shutting down..."; $http.stop; done; } } sub routes() { route { get -> 'raku' { web-socket :json, -> $incoming { supply whenever $incoming -> $message { my $json = await $message.body; if $json<code> { my $stdout, $stderr; # process code emit({ :$stdout, :$stderr }) } } } } } }
配置完成后,Cro服务器将同时支持HTTP/WS与HTTPS/WSS协议。若仅需WSS,可将监听端口改为标准443,或保持原端口让客户端通过wss://协议连接。
b) Docker部署时避免将加密密钥放入镜像
无需将证书和密钥打包进Docker镜像,可通过挂载主机目录的方式将敏感文件传入容器:
- 在主机上指定目录存放证书和私钥,例如
/host/certs/ - 修改Docker运行命令,添加卷挂载与环境变量参数:
docker run --rm -t myApp -p 35145:35145 \ -v /host/certs/:/container/certs/ \ -e TLS_CERT_PATH=/container/certs/certificate.crt \ -e TLS_KEY_PATH=/container/certs/private.key
通过环境变量告知Cro证书位置,既避免敏感信息进入镜像,又保证容器能正常读取证书文件。
c) 使用Apache反向代理处理WebSocket加解密
完全可以让Apache负责HTTPS/WSS的加密层,Cro仅处理后端WS连接,需在Apache配置中添加反向代理规则,并确保WebSocket协议升级头正确传递:
Apache配置示例
<VirtualHost *:443> ServerName your-domain.com # HTTPS基础配置 SSLEngine on SSLCertificateFile /path/to/your/cert.crt SSLCertificateKeyFile /path/to/your/private.key # 反向代理WebSocket请求 ProxyPass /raku ws://localhost:35145/raku ProxyPassReverse /raku ws://localhost:35145/raku # 确保WebSocket升级头正确传递 RewriteEngine On RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule /(.*) ws://localhost:35145/$1 [P,L] # 静态HTML文件配置(若Apache同时提供页面服务) DocumentRoot /path/to/your/html/files </VirtualHost>
注意事项
- 确保Apache已启用必要模块:
proxy、proxy_http、proxy_wstunnel、rewrite、ssl - 客户端JS中的WebSocket连接地址改为
wss://your-domain.com/raku,无需指定端口(使用标准443端口) - Cro服务只需监听
localhost:35145,无需配置TLS,加密由Apache完成
内容的提问来源于stack exchange,提问作者Richard Hainsworth
相关产品推荐
相关产品推荐

