Ubuntu VPS中Nginx+PHP7.4+PostgreSQL Unix Socket配置问题咨询
问题解答:Ubuntu下Nginx+PHP7.4+PostgreSQL的Unix Socket配置
1. 各配置文件对应的Unix Socket说明
- Nginx服务器块:必须使用PHP-FPM的Unix Socket(
/run/php/php7.4-fpm.sock),这是Nginx与PHP-FPM之间的通信通道,你的当前配置是正确的。 - PHP-FPM的www.conf:这里的
listen配置是PHP-FPM自身监听的Socket,同样是/run/php/php7.4-fpm.sock,权限设置www-data组和0660模式没问题,能保证Nginx(运行用户为www-data)正常访问。 - PostgreSQL配置(postgresql.conf、pg_hba.conf):使用PostgreSQL自身的Unix Socket,默认路径是
/var/run/postgresql(目录下实际的Socket文件是.s.PGSQL.5432),不需要修改为/run/php/——改路径会导致终端psql无法找到默认Socket,你的当前设置正确。 - PHP代码的pg_connect:需要指定PostgreSQL的Socket目录,你当前的
$host缺少开头的/,正确值应为/var/run/postgresql,这是导致连接失败的关键问题之一。
2. 完整配置教程(匹配你的目标)
前置准备
先安装所需组件:
sudo apt update && sudo apt install nginx php7.4-fpm php7.4-pgsql postgresql-13
步骤1:Nginx站点配置
编辑你的站点配置文件(例如/etc/nginx/sites-available/your-site):
server { listen 80; server_name 你的域名或IP; root /var/www/你的站点目录; index index.php index.html; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 必须添加,补充必要的FastCGI参数 } }
启用站点并验证Nginx配置:
sudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
步骤2:PHP-FPM配置
编辑/etc/php/7.4/fpm/pool.d/www.conf,确认以下配置:
listen = /run/php/php7.4-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660 user = www-data group = www-data
重启PHP-FPM:
sudo systemctl restart php7.4-fpm
步骤3:PostgreSQL配置
3.1 修改postgresql.conf
编辑/etc/postgresql/13/main/postgresql.conf:
listen_addresses = '*' # 若不需要远程TCP连接,可改为'localhost' unix_socket_directories = '/var/run/postgresql' # 保持默认路径
3.2 修改pg_hba.conf
编辑/etc/postgresql/13/main/pg_hba.conf,设置本地认证规则:
# Unix Socket连接认证 local all all trust # 本地TCP连接(可选) host all all 127.0.0.1/32 trust
重启PostgreSQL:
sudo systemctl restart postgresql
步骤4:PHP代码修正
调整pg_connect的参数,确保Socket路径正确:
$host = '/var/run/postgresql'; $dbname = '你的数据库名'; $user = '你的数据库用户'; $password = '你的数据库密码'; // 建立连接 $conn = pg_connect("host=$host dbname=$dbname user=$user password=$password"); // 测试连接 if (!$conn) { die("连接失败: " . pg_last_error()); }
步骤5:权限检查与调整
确保www-data用户能访问PostgreSQL的Socket目录:
sudo chmod 770 /var/run/postgresql sudo usermod -aG postgres www-data
重启所有服务:
sudo systemctl restart nginx php7.4-fpm postgresql
内容的提问来源于stack exchange,提问作者astaga
相关产品推荐
相关产品推荐

