You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cro中配置WSS协议?含Docker与Apache部署相关疑问

Cro框架WSS协议支持与部署问题解决方案

已基于Cro和WebSocket搭建服务,本地HTTP环境下WS连接正常,但HTTPS页面无法建立WSS连接,针对你的三个疑问解答如下:

a) 修改Cro代码以支持WSS协议

要让Cro支持WSS,需在HTTP服务器配置中添加TLS监听器,具体操作如下:

  1. 引入Cro::TLS模块
  2. 在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镜像,可通过挂载主机目录的方式将敏感文件传入容器:

  1. 在主机上指定目录存放证书和私钥,例如/host/certs/
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:00:55