Skip to content

地址与协议

方块在 glac.run 下的默认地址、自定义域名、在互联网上没有地址的方块,以及能到达实例的协议。

更新于

默认地址

每个应用都有 https://<app name>-<project>.glac.run,其中 <project> 是项目 id 中的六个字符。应用从创建起就有这个地址;重命名应用会改变它。glac cube get 和应用的 url 会显示它。

发往它的请求会经过平台前面的一个代理,代理负责处理 TLS,并挡住流量洪水 (DDoS)。代理有自己的限制:请求体最大 100 MB,响应最多停顿 125 秒。需要突破这些限制时,给应用设置 direct: true (glac cube update api --direct true):之后它还会在 direct.glac.run 下的 direct_url 上响应,这个地址绕过代理,前面只有平台自己的限制。地址页面并列给出了代理的限制和每个产品的直连域名。

每个应用和每个沙箱链接在 glac.run 下都有自己的域名。在 glac.run 进入公共后缀列表 (Public Suffix List) 之前,其中任何一个域名下的页面都能为整个 glac.run 设置 Cookie,而其他客户的页面可以读到它。请把你应用的 Cookie 限定在它自己的域名上(不设 Domain 属性),也不要信任作用于整个域的 Cookie。

自定义域名

POST /v1/domains 带上 {"domain": "api.example.com", "app": "api"},把你的域名指向一个应用(或带上 {domain, sandbox, port},指向沙箱的某个端口)。响应会列出证明这个域名属于你的 DNS 记录:

  • 经过代理(默认,proxied: true):一条从你的域名指向 <token>.glac.run 的 CNAME。代理会检查域名并签发证书。
  • 直连 (proxied: false):一条指向 <token>.direct.glac.run 的 CNAME;对于不能设置 CNAME 的根域名,则是在 _sandbox-domain.<your name> 上放一条带令牌的 TXT 记录,并把该域名的 A 和 AAAA 记录指向响应给出的地址。

证书会自动为你签发和续期。域名的每个地址都必须指向平台,直连域名前面不能有其他任何人的代理或 CDN。域名生效后,也要把记录留在你的 DNS 中:没有它,证书就不会续期。

glac domains create api.example.com --app api 做同样的事并打印记录,其余操作用 glac domains ls、get、update 和 rm;SDK(Python 中为 glac.domains)和 MCP 服务器的 domain_* 工具也都可以。

域名的 status 为 pending_verification、pending_certificate、active 或 detached(它的应用或沙箱已被删除)。部署和回滚都不需要修改域名:它跟随应用。一个项目最多有 100 个域名 (403 domain_limit_reached)。注册、修改和删除域名需要有 admin 权限范围的密钥。

在互联网上没有地址的应用

设置了 public: false (--public false) 的应用没有默认地址。项目中的其他服务和沙箱在项目的私有网络上通过 <app name>.internal 访问它,指向它的域名也仍然有效。参见服务与 Compose。

协议

客户端通过 HTTP/1.1、HTTP/2 或 HTTP/3 访问应用。通过 HTTP/2 或 HTTP/3 来的请求,如果你的服务支持不带 TLS 的 HTTP/2 (h2c),就以这种方式到达服务,否则以 HTTP/1.1 到达。无需任何设置:平台会向端口探测一次。通过 HTTP/1.1 来的请求以 HTTP/1.1 到达服务。

  • gRPC 在你的服务支持不带 TLS 的 HTTP/2 时可用,普通端口上的 gRPC 服务器都支持(gRPC-Go、tonic、grpc-js、grpcio):一元调用、单向或双向流、元数据、trailer 和状态码都会原样透传。用 TLS 在应用地址的 443 端口上调用它。
  • 一次调用或一个流算一个请求,无论它保持打开多久、传过多少条消息。在它打开期间,实例保持运行并按运行计量,所以请给长时间的流设置截止时间。
  • 追踪请求头。请求的 traceparent 和 tracestate (W3C Trace Context) 会按客户端发送的原样到达你的服务,HTTP/1.1 和 HTTP/2 都一样,除非应用让平台参与其请求的追踪(它的 traces):这时你的服务收到的是平台自己的 traceparent,它的 span 是你的 span 的父 span;只有当应用接受客户端的追踪时,才会收到客户端的 tracestate。参见追踪。
  • WebSocket 通过 HTTP/1.1 连接。实例休眠时它保持打开,上面来了新数据就会唤醒实例。
  • 到你服务的连接是共享的。响应之后,平台会让它到实例端口的连接再保持片刻(没有键的实例为一秒,键控实例或沙箱为 200 毫秒),并在这个连接上发送下一个请求,这个请求可能来自另一个客户端;在 HTTP/2 上,一个连接本来就承载所有客户端的请求。所以像 NTLM 那样把登录绑定到 TCP 连接上的服务,不能放在这些地址后面。这样保持的连接不会让实例保持运行。
导航

输入以搜索……

↑↓ 切换↵ 选择Esc 关闭