You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python通过SSH连接PostgreSQL服务器失败求助

解决Python连接远程PostgreSQL时的"Connection refused"问题

兄弟,我刚踩过几乎一模一样的坑,太懂这种连接被拒的崩溃感了!咱们先理清楚你的场景,再一步步解决:

先明确你的代码运行场景

你提到手动通过SSH登录服务器后,切换到postgres用户能正常访问PG,但Python代码连接时报错。这里分两种常见情况:


情况1:你的Python代码在本地电脑运行,想连接远程服务器上的PG

这种情况的核心问题是:PG默认只监听服务器的本地端口,不会直接暴露到公网。你需要先建立SSH隧道,把本地端口转发到服务器的5432端口:

  1. 先在本地终端运行SSH隧道命令:

    ssh -L 5432:localhost:5432 SSH_USER@你的服务器IP地址
    

    这个命令会把你本地的5432端口,映射到远程服务器的localhost:5432端口。

  2. 然后在Python代码里,连接本地的5432端口就相当于连接远程服务器的PG了(以psycopg2为例):

    import psycopg2
    
    try:
        conn = psycopg2.connect(
            dbname="你的数据库名",
            user="postgres",
            password="postgres用户的密码",  # 注意:手动切用户后psql可能免密,但TCP连接可能需要密码
            host="localhost",
            port=5432
        )
        print("连接成功!")
    except Exception as e:
        print(f"连接失败:{e}")
    

情况2:你的Python代码在远程服务器上运行,但连接localhost失败

这种情况是因为你手动用psql连接时,默认用的是Unix套接字(不需要TCP端口),但Python代码默认尝试TCP连接,而PG可能没开启TCP监听:

步骤1:检查PG是否开启TCP监听

切换到postgres用户后,运行命令查看端口监听状态:

ss -tulpn | grep 5432

如果看不到localhost:5432或者0.0.0.0:5432的输出,说明PG没开启TCP监听,需要修改配置。

步骤2:修改PG配置文件

  1. 找到postgresql.conf文件(通常路径是/etc/postgresql/你的PG版本/main/或者/var/lib/postgresql/你的PG版本/main/),修改listen_addresses参数:

    listen_addresses = 'localhost'  # 只允许本地TCP连接,安全起见推荐这个
    # 如果需要允许外部连接可以改成'*',但一定要配合pg_hba.conf限制访问
    
  2. 找到pg_hba.conf文件,添加一行允许本地TCP连接的规则:

    host    all             all             127.0.0.1/32            scram-sha-256
    

    (如果是旧版本PG,可能用md5代替scram-sha-256

  3. 重启PG服务生效:

    sudo systemctl restart postgresql
    

步骤3:或者直接用Unix套接字连接(无需修改配置)

如果你不想改PG配置,也可以让Python直接用Unix套接字连接(和你手动psql的方式一致),只需要指定套接字路径:

import psycopg2

conn = psycopg2.connect(
    dbname="你的数据库名",
    user="postgres",
    host="/var/run/postgresql/"  # 这个路径是PG默认的套接字目录,不同系统可能略有差异
)

额外排查小技巧

  • 先手动测试TCP连接:在服务器上运行psql -h localhost -p 5432 -U postgres,如果这个命令也报错,那问题和Python无关,先解决PG的TCP监听配置。
  • 确认pg_settings里的port确实是5432,避免端口配置不一致。

内容的提问来源于stack exchange,提问作者st2 tas

火山引擎 最新活动