我有两个运行 Scrapy 的 Ubuntu EC2 实例,都使用 scrapy-redis 来控制重复项。我尝试使用 ElastiCache Redis 作为 scrapy-redis 存储。我在另一个 AWS 账户中设置了完全相同的设置,并且运行正常。我尝试在新账户中复制该设置,但不起作用。这两个 EC2 实例和 ElastiCache 实例都在同一个 VPC 中,我遵循本文用于允许安全组从 Scrapy 实例访问 ElastiCache。您可以看到以下设置:
ElastiCache 实例位于选定的安全组中;另外两个组是两个 Scrapy EC2 实例。
问题只限于 scrapy-redis,因为我可以通过 ssh 进入两个 Scrapy 框,并使用 redis-cli 连接到 ElastiCache 实例,没有任何问题。我在 settings.py 文件中对 scrapy-redis 进行了正确的设置,如下所示:
REDIS_HOST = 'redis.xxxx.ng.0001.use2.cache.amazonaws.com'
REDIS_PORT = 6379
我从 scrapy-redis 得到的错误是
File "/usr/local/lib/python3.5/dist-packages/redis/connection.py", line 486, in connect
raise TimeoutError("Timeout connecting to server")
redis.exceptions.TimeoutError: Timeout connecting to server
我在这里绞尽脑汁,但我从原始帐户中创建的 AMI 创建了 Scrapy 实例,其中设置工作正常,所以也许这就是问题所在?任何帮助都将不胜感激。
答案1
我对 Python 的了解不够深入,无法准确理解原因,但我们意识到问题与启动 ScrapyD 时所在的目录有关。显然,启动 ScrapyD 时,您需要与 settings.py 位于同一目录中,而不是位于其上方或下方,否则无法识别 Redis 连接。这解决了问题,但如果有人知道原因,请随时补充。