首页 > 解决方案 > 来自 Azure 应用服务的 ioredis ETIMEDOUT,但在本地工作正常,IP 已添加到防火墙

问题描述

我有一个正在测试的 Azure Redis 缓存。除了我现在正在尝试做的事情之外,它没有被使用/没有任何东西连接到它。它是最基本的 C0 计划的一部分。

问题是,一旦部署为 Azure 应用服务的一部分,它将不断抛出:

[ioredis] Unhandled error event: Error: connect ETIMEDOUT
     at TLSSocket. (/home/site/wwwroot/node_modules/ioredis/built/redis/index.js:282:31)
     at Object.onceWrapper (events.js:273:13)
     at TLSSocket.emit (events.js:182:13)
     at TLSSocket.Socket._onTimeout (net.js:449:8)
     at ontimeout (timers.js:425:11)
     at tryOnTimeout (timers.js:289:5)
     at listOnTimeout (timers.js:252:5)
     at Timer.processTimers (timers.js:212:10)

如果我在本地运行应用程序,一切都很好并且工作正常。我也将我的本地 IP 和应用程序服务的 IP 添加到了防火墙中。

我的配置是:

 host: this.get('REDIS_HOST'),
      port: 6380,
      password: this.get('REDIS_PRIMARY_KEY'),
      tls: true as any,
      connectTimeout: 1000,

import * as redis from 'ioredis';
redis: redis.Redis;

in constructor: 

this.redis = new redis(this.configService.getRedis());

标签: azureredisazure-web-app-serviceazure-redis-cache

解决方案


我试图在我的环境中重现您的问题,然后我发现它似乎是由于该connectTimeout值太短并且比下面定义10000的默认值短。connectTimeoutexport const DEFAULT_REDIS_OPTIONS: IRedisOptions

export const DEFAULT_REDIS_OPTIONS: IRedisOptions = {
  // Connection
  port: 6379,
  host: "localhost",
  family: 4,
  connectTimeout: 10000,
  //.....
}

如果我使用or设置connectTimeout值,我会在我的环境中遇到与您相同的问题,如下图所示。1000100

在此处输入图像描述

所以请尝试删除该connectTimeout属性并使用默认值,或者只是设置一个比默认值更长的超时值。


推荐阅读