AWS Ubuntu 22.04服务器上Scrapy爬虫连接PostgreSQL数据库遇Connection refused问题求助
从你给出的错误日志和配置来看,核心问题是AWS Ubuntu服务器上的PostgreSQL服务无法被本地的Scrapy爬虫连接,错误提示connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused已经点明了方向,下面是一步步的排查和解决方法:
1. 确认PostgreSQL是否已安装并运行在Ubuntu服务器上
你的本地iMac上有PostgreSQL(通过pgAdmin4管理),但AWS服务器是全新实例,默认不会预装PostgreSQL,这是最常见的原因:
- 检查是否已安装PostgreSQL:
sudo apt list --installed | grep postgresql - 如果未安装,执行以下命令安装:
sudo apt update && sudo apt install postgresql postgresql-contrib - 检查服务运行状态:
sudo systemctl status postgresql - 如果服务未启动,启动并设置开机自启:
sudo systemctl start postgresql sudo systemctl enable postgresql
2. 配置PostgreSQL允许TCP/IP连接
PostgreSQL默认可能只允许本地socket连接,不开启TCP监听,需要修改两个关键配置文件:
修改postgresql.conf
找到配置文件(Ubuntu 22.04默认路径为/etc/postgresql/14/main/postgresql.conf,版本号可能不同),修改listen_addresses参数:
# 原配置可能是 listen_addresses = 'localhost' 或者被注释 listen_addresses = '*' # 允许所有IP连接,也可以指定服务器私有IP提升安全性
修改pg_hba.conf
同样在上述路径下,添加或确保存在允许localhost连接的规则:
# 允许127.0.0.1的TCP连接,使用scram-sha-256认证(推荐) host all all 127.0.0.1/32 scram-sha-256
修改完成后重启PostgreSQL服务:
sudo systemctl restart postgresql
3. 验证数据库用户权限与密码配置
你的数据库配置中用户是usr,密码为空,需要确保该用户存在且拥有足够权限:
- 切换到PostgreSQL默认管理员用户:
sudo -u postgres psql - 检查
usr用户是否存在:SELECT usename FROM pg_user; - 如果不存在,创建用户(空密码)并赋予数据库权限:
CREATE USER usr WITH PASSWORD ''; GRANT ALL PRIVILEGES ON DATABASE scrape TO usr;
注意:空密码存在安全风险,如果是生产环境建议设置强密码,并对应修改
pg_hba.conf的认证规则。
4. 检查配置细节
你的数据库配置中port是字符串类型'5432',虽然SQLAlchemy会自动处理,但建议改为整数5432避免潜在问题:
DATABASE = { "user": "usr", "passw": "", "host": "localhost", "port": 5432, # 改为整数 "database": "scrape", 'table':'cdp_env', 'if_exists':'append', 'drivername':'postgresql' }
5. 防火墙与安全组检查
因为你的爬虫是在服务器本地连接localhost,所以AWS安全组不会影响本地连接,但可以检查Ubuntu本地防火墙ufw是否意外拦截了端口:
sudo ufw status
如果显示5432端口被拒绝,执行以下命令允许本地连接:
sudo ufw allow from 127.0.0.1 to any port 5432
按照以上步骤排查后,应该就能解决连接被拒绝的问题了。
内容的提问来源于stack exchange,提问作者Working dollar

