sails.config.sockets
这些配置选项提供对 Socket.IO 的透明访问,Socket.IO 是 Sails 封装的 WebSocket/PubSub 服务器。
属性 | 类型 | 默认值 | 详情 |
---|---|---|---|
adapter |
'memory' |
Socket.IO 用于传递消息的队列。可以设置为 'memory' 或 '@sailshq/socket.io-redis' 。如果指定 '@sailshq/socket.io-redis' ,则应确保 '@sailshq/socket.io-redis' 位于您的应用程序的依赖项中。 |
|
transports |
['websocket'] |
Sails/Socket.IO 在连接客户端时将使用的允许传输策略的数组。这应始终与 套接字客户端(即 sails.io.js )中的配置 相匹配——如果您在此处更改传输方式,则需要在其中配置它们,反之亦然。请注意,如果您选择修改默认传输方式,那么您可能需要在生产环境中进行额外配置。(例如,如果您添加了 polling 传输方式,并且您的应用程序运行在负载均衡器(如 Nginx)后面的多个服务器上,那么您需要配置该负载均衡器以支持 TCP 粘性会话。但是,如果仅启用了 websocket 传输方式,那么开箱即用 _不应该_ 这样做。)请参阅 部署 > 扩展 了解更多提示和最佳实践。 |
|
onlyAllowOrigins |
undefined |
允许套接字连接的主机数组(以 http:// 或 https:// 开头)。默认情况下(即,当此值为 undefined 时),Sails/Socket.IO 将允许来自 _任何_ 来源的套接字连接,这对测试很有用。但在生产模式下,从 Sails v1.0 开始,该框架强制您配置此选项以防止 跨站点 WebSocket 劫持 (CSWSH) 攻击。因此,在 config/env/production.js 或使用环境变量中,有一个传统的配置此设置的位置。例如,如果您计划在生产模式下测试时从本地 Node.js/Sails.js 服务器提供网页,您可能需要将 https://127.0.0.1:1337 添加到此数组中。请注意,顾名思义(与类似的 CORS 设置 相反),_仅_ 列出的来源将被允许连接。还要注意,如果连接的套接字在其升级请求中没有声明 "origin" 标头(例如,非浏览器环境,如原生 iOS 应用程序、命令行脚本或自定义硬件),则此 **设置将被忽略**。如果您使用的是像 Electron、Ionic、React Native 或 Cordova/PhoneGap 这样的伪浏览器开发平台,您需要确定您的工具是否(如果有)将 "origin" 标头附加到初始套接字连接请求。例如,Ionic、Cordova 和 PhoneGap 都将 file:// 作为它们的来源发送。最后,请注意,如果您想用自己的自定义实现完全覆盖此行为,您可以选择使用 beforeConnect 设置。 |
如果您正在为生产环境配置 Sails 应用程序,并计划 扩展到多个服务器,那么您应该将 sails.config.sockets.adapter
设置为 '@sailshq/socket.io-redis'
,设置您的 Redis 实例,然后使用以下配置从您的应用程序指向它
属性 | 类型 | 默认值 | 详情 |
---|---|---|---|
url |
undefined |
要连接到的 Redis 实例的连接 URL。这可能包括以下一个或多个设置,例如 redis://:[email protected]:1234/5 表示 host 为 myredishost.com ,port 为 1234 ,pass 为 mypass ,db 为 5 。一般来说,您应该使用 url _或_ 以下设置的组合,以避免混淆(url 设置将覆盖以下所有设置)。 |
|
db |
undefined |
要在您的 redis 实例中使用的数据库的索引。如果指定,则必须是整数。(在大多数 Redis 设置中,这将是 0 到 15 之间的数字。) | |
host |
'127.0.0.1' |
您的 Redis 实例的主机名。 | |
pass |
undefined |
您的 Redis 实例的密码。 | |
port |
6379 |
您的 Redis 实例的端口。 |
这些配置选项提供对底层 Socket.IO 服务器设置的更低级别访问,以实现完全可定制性。
属性 | 类型 | 默认值 | 详情 |
---|---|---|---|
beforeConnect |
undefined |
每次新的客户端套接字尝试连接到服务器时运行的函数,可用于拒绝或允许传入的连接。对于调整生产环境以防止 DoS 攻击或根据特定于业务的启发式方法拒绝 Socket.IO 连接很有用。请参阅以下 beforeConnect 以获取更多信息。 | |
afterDisconnect |
undefined |
当客户端套接字从服务器断开连接时运行的函数。要定义您自己的自定义逻辑,请指定一个函数,例如 afterDisconnect: function (session, socket, cb) {} 。 |
|
allowUpgrades |
true |
这是从 Engine.io 公开的原始配置选项。它指示是否允许 Socket.io 客户端升级它们正在使用的传输方式(例如,从轮询开始,然后升级到真正的 WebSocket 连接)。 | |
cookie |
false |
这是从 Engine.io 公开的原始配置选项。它指示包含连接的 Socket.IO 客户端套接字 ID 的 HTTP Cookie 的名称。该 Cookie 将在响应初始 Socket.IO "握手" 时设置。或者,可以设置为 false 以完全禁用 Cookie。请注意,sails.io.js 客户端不依赖于此 Cookie,因此默认情况下为了提高安全性,它被禁用(设置为 false )。如果您直接使用 Socket.IO 并需要重新启用此 Cookie,请记住,传统设置是 "io" 。 |
|
grant3rdPartyCookie |
true |
是否公开 GET /__getcookie 路由,该路由设置一个仅 HTTP 会话 Cookie。默认情况下,如果它检测到它即将连接到跨域服务器,Sails 套接字客户端 (sails.io.js ) 会在开始连接之前向此端点发送一个 JSONP 请求。对于支持第三方 Cookie 的用户代理,这允许 sails.io.js 使用用户的现有会话 Cookie 将套接字连接到跨域 Sails 服务器(如果有)(例如,如果他们已登录)。如果没有它,您从套接字发出的虚拟请求将无法访问相同的会话,并且需要使用其他机制重新进行身份验证。 |
|
maxHttpBufferSize |
10E7 |
这是从 Engine.io 公开的原始配置选项。它反映了在轮询时消息中的最大字节数或字符数,在自动关闭套接字之前(以避免 DoS)。 | |
path |
/socket.io |
客户端套接字应连接到服务器上的路径。请参阅 https://socketio.node.org.cn/docs/server-api/#server(opts:object)。 | |
pingInterval |
25000 |
这是从 Engine.io 公开的原始配置选项。它反映了在 "ping 包" 之间等待的毫秒数(这或多或少地成为了 "心跳")。 | |
pingTimeout |
60000 |
这是从 Engine.io 公开的原始配置选项。它反映了在将 Socket.IO 连接视为关闭之前,在没有 pong 包的情况下等待的毫秒数。 | |
sendResponseHeaders |
true |
是否在为每个套接字请求(例如,浏览器中的 io.socket.get() )生成的 JWR(JSON WebSocket 响应)中包含响应标头。这不会影响直接的 Socket.IO 使用,除非您通过请求解释器与 Sails 通信(例如,使用 sails.io.js 浏览器 SDK 进行正常调用)。这对于调整高流量应用程序时压缩更多性能可能很有用,因为它减少了总带宽使用量。但是,从 Sails v0.10 开始,响应标头在尽可能的情况下会被裁剪,因此即使在极高规模的应用程序中,此选项也几乎不需要使用。 |
|
serveClient |
false |
是否在 /socket.io/socket.io.js 中提供默认的 Socket.IO 客户端。偶尔对高级调试很有用。 |
|
onRedisDisconnect |
undefined |
如果 Redis 连接断开,Sails 可以调用的可选函数。对于将您的站点置于临时维护模式或 "恐慌模式" 很有用(请参阅 sails-hook-panic-mode 以获取示例)。 | |
onRedisReconnect |
undefined |
如果之前断开的 Redis 连接恢复,Sails 可以调用的可选函数(请参阅上面的 onDisconnect )。 |
注意:
onRedisDisconnect
和onRedisReconnect
仅在 Sails 为您创建的 Redis 客户端上调用;如果您提供自己的 Redis 客户端(见下文),这些函数在断开连接或重新连接的情况下 _不会_ 自动调用。
beforeConnect
在开发过程中,当套接字尝试连接时,Sails 始终允许它(与任何 HTTP 请求都允许到达您的路由的方式类似)。然后,在生产环境中,onlyAllowOrigins
数组确保仅允许来自白名单上基本 URL 的传入套接字连接才能连接到您的应用程序。
如果您的应用程序需要更多灵活性,作为额外的预防措施,您可以定义您自己的自定义逻辑来允许或拒绝套接字连接。为此,请指定一个 beforeConnect
函数
beforeConnect: function(handshake, proceed) {
// Send back `true` to allow the socket to connect.
// (Or send back `false` to reject the attempt.)
return proceed(undefined, true);
},
请注意,如果使用
beforeConnect
,则onlyAllowOrigins
设置将被忽略。这允许您接受来自非传统客户端(例如,在 Electron 应用程序 中)的套接字连接,这些客户端可能不会设置origin
标头。
当客户端套接字连接到 Sails 应用程序时,它们默认情况下使用会话 Cookie 进行身份验证(在启用了会话钩子时)。这允许 Sails 将从套接字发出的虚拟请求与现有用户会话关联起来,类似于普通 HTTP 请求的工作方式。
浏览器客户端注意事项:用户的会话 Cookie _不_(并且永远不会)从客户端 JavaScript 中访问。使用仅 HTTP Cookie 对应用程序的安全性至关重要。
sails.io.js 客户端通常从通过 HTTP 已经获取的 HTML 页面启动,这意味着从这种浏览器环境连接的套接字通常会自动提供有效的会话 Cookie。因此,一切都会正常运行,req.session
将可用。
但是,在跨域套接字的情况下,有可能接收没有 cookie的连接升级请求(无论如何,对于某些传输来说)。在这种情况下,没有办法在虚拟请求之间跟踪请求用户,因为没有识别信息将它们与会话关联。sails.io.js 客户端通过首先向 CORS+JSONP 端点发送 HTTP 请求来解决此问题,以便获取第三方 cookie。然后在打开套接字连接时使用此 cookie。
类似地,如果套接字没有提供会话 cookie 或提供损坏的 cookie,那么将为其创建一个临时的一次性会话条目。如果提供的会话 cookie 与任何已知的会话条目都不匹配,也会发生同样的情况。
您还可以配置 sails.io.js 以将会话 cookie 的覆盖传递到连接套接字时url 中的?cookie
查询参数形式。Sails 将使用此覆盖而不是实际的会话 cookie,该 cookie 可能已或可能未在初始连接升级请求中发送。例如,如果您正在构建一个独立的 Electron 应用程序,并且您禁用了autoConnect
以支持手动连接套接字,您可能会执行以下操作
var hotSocket = io.sails.connect('https://127.0.0.1:1337?cookie=smokeybear');
默认情况下,Sails 在使用@sailshq/socket.io-redis
适配器时会在后台创建新的 Redis 客户端。在某些情况下,您可能需要创建自己的 Redis 客户端用于 PubSub(通常使用 node-redis 或 ioredis 模块)并将它们提供给 Sails 用于 PubSub。当使用 Redis Sentinel 设置时,这种情况经常出现,该设置要求客户端使用像 ioredis 这样的模块连接。以下高级配置选项允许您将已连接的 Redis 客户端和相关配置信息传递给 Sails。
属性 | 类型 | 默认值 | 详情 |
---|---|---|---|
pubClient |
undefined |
用于在 Socket.IO 使用的通道上发布的自定义 Redis 客户端。如果未指定,Sails 将为您创建一个客户端。 | |
subClient |
undefined |
用于订阅 Socket.IO 使用的通道的自定义 Redis 客户端。如果未指定,Sails 将为您创建一个客户端。 | |
adminPubClient |
undefined |
用于在内部 Sails 管理总线上发布的自定义 Redis 客户端,该总线允许服务器间通信。如果您为pubClient 提供了一个客户端,您可能还需要为此设置提供一个客户端。 |
|
adminSubClient |
undefined |
用于订阅内部 Sails 管理总线的自定义 Redis 客户端,该总线允许服务器间通信。如果您为subClient 提供了一个客户端,您可能还需要为此设置提供一个客户端。 |
|
subEvent |
message |
要订阅的 Redis 客户端事件名称。当使用使用ioredis 创建的客户端时,您可能需要将其设置为messageBuffer 。 |
- 在旧版本的 Sails (<v0.11) 和 Socket.IO (<v1.0) 中,
beforeConnect
设置称为authorization
。
req
)