昨天突然一个学生的学生找到我,说有个小项目的一些功能需要我帮忙写写,我当时没在意,直接应了下来,我以为是前端项目,结果他说是个PHP项目,我不写php已经有很多年了,但是应下来了就看看呗。项目用的技术不算新,环境用的是PHP7.4,我就在打算在我家的那台测试机器上配个php运行环境。本来想着用docker整一个,但是一想nginx和mysql都已经有了,就差个php,直接装一下算了。
我那个测试机器上用的rocky linux8,自带的是php7.2,所以为了方便直接用了remi的源进行安装,没有用编译安装。
下面是安装PHP的步骤:
安装remi的源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
然后安装php和php的一些扩展:
yum install php74-php php74-php-zip php74-php-pdo php74-php-intl php74-php-mysqlnd php74-php-devel php74-php-xml php74-php-curl php74-php-exif php74-php-gd php74-php-json php74-php-mbstring php74-php-posix -y
php-fpm会被自动依赖安装上,这里没有手动写出来。
接下来启动php-fpm,使用:systemctl start php-fpm 显然是不行的,因为在remi里,我们安装的是 php74-php-fpm,所以我们启动fpm的时候要用:
systemctl start php74-php-fpm
紧接着我们修改nginx的配置文件(vim /etc/nginx/nginx.conf),根据我的印象,我这样写的:
server { listen 6100; server_name _; root /php/phptest.xxxx.cn/; index index.htm index.html index.php; include /etc/nginx/default.d/*.conf; location ~ .php$ { try_files $uri = 404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
记得几年前就是这样写的,应该没啥问题。但是,实际上是有问题的,按照上面的配置,配置完,重启nginx后,访问静态文件没什么问题,但是访问php文件就会出现502现象。微微感觉应该和php-fpm有关,通过查看错误日志(vim /var/log/nginx/error.log),发现了这句:
upstream: "fastcgi://127.0.0.1:9000", host: ""
看样子确实是和php-fpm有关,但是我的php-fpm命名已经启动了,我记得他默认监听的就是9000端口,不应该有错啊。查看谁在用着9000端口(lsof -i :9000),啥都没有。问题就出在这,我们使用的remi的源安装的,php-fpm的配置文件在 /etc/opt/remi/php74/php-fpm.d/www.conf ,打开配置文件找 listen 配置项,果然listen的配置项不是在9000端口上,而是:
listen = /var/opt/remi/php74/run/php-fpm/www.sock
于是重新修改nginx的配置文件,将php访问那部分修改成:
location ~ .php$ { # 这地方就是listen项的配置值 fastcgi_pass unix:/var/opt/remi/php74/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
然后重启nginx,还是502错误!于是又陆续排除了书写错误和selinux的问题,还是502,这时候去错误日志又看了看,发现新的错误:
connect() to unix:/var/opt/remi/php74/run/php-fpm/www.sock failed (13: Permission denied) ……
原来nginx无权访问 /var/opt/remi/php74/run/php-fpm/www.sock ,这就好办了,直接把该文件所有者给改了:
chown nginx:nginx /var/opt/remi/php74/run/php-fpm/www.sock
这种方法是有问题的,虽然当时能解决问题,但是重启php-fpm后就又不行了,因为php-fpm如果没有以指定用户启动,则sock文件会由启动php-fpm的用户创建,其权限是srw-rw----(660),我这里用的是root账号。nginx一般是使用的nginx用户启动的,所以又会无法访问。
我们这里使用的方法是修改启动权限,打开php-fpm的配置,修改启动时的权限,在配置中增加:
listen.mode = 0666
然后重启php-fpm即可。