OpenBSD 7.0系统中PHP无法连接PostgreSQL数据库问题求助
核心原因
OpenBSD 自带的 httpd 与 php-fpm 默认运行在 /var/www 的 chroot 隔离环境中,你遇到的连接失败是两个常见问题导致的:一是 chroot 环境内缺少必要的网络依赖文件,二是 PostgreSQL 访问控制配置未适配你的连接方式。
方案1:保持TCP连接方式修复
步骤1:配置PostgreSQL访问控制
编辑 /var/postgresql/data/pg_hba.conf,新增一行规则允许你的VPS公网IP访问数据库:
host all all 123.45.67.89/32 scram-sha-256
修改完成后重启PostgreSQL服务:
rcctl restart postgresql
步骤2:补全chroot环境的网络配置
php-fpm运行的chroot环境默认没有网络解析相关配置,执行以下命令补全:
mkdir -p /var/www/etc cp /etc/resolv.conf /var/www/etc/ cp /etc/hosts /var/www/etc/ chmod -R 644 /var/www/etc/*
步骤3:验证端口连通性
先在宿主系统执行命令验证PostgreSQL端口可访问:
telnet 123.45.67.89 5432
如果连接失败,检查pf防火墙规则是否放通了本机对5432端口的访问。
方案2:更安全的Unix套接字连接方案(推荐)
该方案无需将PostgreSQL端口暴露到公网,性能和安全性都更高:
步骤1:修改PostgreSQL主配置
编辑 /var/postgresql/data/postgresql.conf:
- 调整监听地址,按需保留公网IP:
listen_addresses = 'localhost, 123.45.67.89'
- 配置Unix套接字同时输出到chroot可访问的目录:
unix_socket_directories = '/run/postgresql, /var/www/run/postgresql'
步骤2:创建套接字目录并配置权限
mkdir -p /var/www/run/postgresql chown _postgresql:_postgresql /var/www/run/postgresql chmod 775 /var/www/run/postgresql
步骤3:确认本地套接字访问规则
检查 /var/postgresql/data/pg_hba.conf 存在以下规则(默认已配置,没有就新增):
local all all scram-sha-256
步骤4:重启服务修改PHP连接代码
重启PostgreSQL服务:
rcctl restart postgresql
修改你的PHP连接代码,指定套接字路径:
<?php echo "Hello world!"; // 注意chroot环境下路径对应宿主的/var/www/run/postgresql $db = pg_connect("host=/run/postgresql port=5432 dbname=test user=tester password=12345"); if ($db) { echo "I'm in."; } else { echo "No luck."; } ?>
通用排查技巧
- 先确认pgsql扩展已启用:新建phpinfo页面,搜索pgsql字段,确认扩展已加载。如果未加载,编辑
/etc/php-8.0.ini去掉extension=pgsql.so、extension=pdo_pgsql.so前的分号,重启php80_fpm服务。 - 打开PHP错误显示:在pg_connect前添加
error_reporting(E_ALL); ini_set('display_errors', 1);,可直接输出连接失败的具体原因。 - 查看PostgreSQL日志:日志默认存放在
/var/postgresql/data/log/目录下,可明确看到是访问控制拒绝、密码错误还是连接超时问题。
内容的提问来源于stack exchange,提问作者Russell
相关产品推荐
相关产品推荐

