我遇到了一个网上没有描述的问题。我使用的是 VPS Debian 8Nginx + PHP7.0-FPM。当我配置 Nginx 和 PHP7.0-FPM 以使用时,我的服务器以源代码形式提供 php 文件,但不编译它们unix 套接字(我这样做是因为我读到它比 tcp 连接更快)。
所以我真正做的是,但没有效果:
- 编辑 /etc/nginx/fastcgi_params 以注释 fastcgi_pass 参数以使用 unix 套接字文件:
#fastcgi_pass 127.0.0.1:9000;
我的所有主机都包含此文件,因此我需要在每个主机文件中配置自己的套接字。我这样做:
- 编辑 /etc/nginx/sites-available/example.com 我在那里输入 fastcgi_pass 参数
location ~ '\.php$|^/update.php' { fastcgi_split_path_info ^(.+?\.php)(|/.*)$; fastcgi_pass unix:/var/run/php/example.com.php7.0-fpm.conf; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/example.com/www$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT /var/www/example.com/www; fastcgi_param PHP_ADMIN_VALUE upload_tmp_dir=/var/www/example.com/tmp/upload; fastcgi_param PHP_ADMIN_VALUE session.save_path=/var/www/example.com/tmp/sessions; }
编辑主 php7.0-fpm 池文件 /etc/php/7.0/fpm/pool.d/www.conf 以监听套接字(但现在我不明白为什么我在这里需要它):
监听 = /var/run/php/php7.0-fpm.sock
编辑我的站点的池文件 /etc/php/7.0/fpm/pool.d/example.com.conf 来设置它自己的套接字(所以我认为这里是必要的):
监听 = /var/run/php/example.com.php7.0-fpm.sock
重启服务:
服务 nginx 重启 && 服务 php7.0-fpm 重启
因此当我访问任何网站页面时,我的index.php 都会被下载。
但如果我使用 tcp 套接字,fastcgi_pass 127.0.0.1:9000;
它就能正常工作。
答案1
看起来你的文件名是错误的,fastcgi_pass
它应该是:
fastcgi_pass unix:/var/run/php/example.com.php7.0-fpm.sock;
确保 php-fpm 正在运行,并且套接字文件存在且具有正确的权限,以便 nginx 可以访问该文件。如果您已安装并强制执行 selinux,您可能还需要检查其日志以查看它是否阻止 nginx 访问该文件。
在 php-fpm 方面,每个配置文件pool.d
都是一个单独的 PHP 可执行文件池,每个文件都需要自己的套接字。 www.conf
不是“主”配置文件,它是一个完全独立的进程池,如果您不使用它,则应将其禁用/删除。由于两个池都配置为使用相同的套接字,因此这里肯定会发生冲突。
答案2
太过复杂是怎么回事location
?
location ~ '\.php$|^/update.php' {
我预计您的请求实际上与此不符。
你真正需要的是:
location ~ \.php$ {
答案3
Unix 套接字具有权限
php7.2-fpm服务根据配置创建php与nginx连接socket
sudo nano /etc/php/7.2/fpm/pool.d/www.conf
该文件有
listen = /run/php/php7.2-fpm.sock
listen.owner = www-data
listen.group = www-data
一旦你启动/重新启动该服务
sudo systemctl restart php7.2-fpm.service
它创建一个表示具有指定所有者和组的套接字的文件
ls -la /run/php
但是 Nginx 默认使用另一个用户,你可以在
sudo nano /etc/nginx/nginx.conf
用户 nginx;
现在由您来决定如何调整权限。要么为套接字文件提供更多权限,要么更改侦听用户,要么更改 nginx 用户...您可以选择答案。