记一次安装PHP7.4和Nginx配置后访问php文件一直报502错误的问题

昨天突然一个学生的学生找到我,说有个小项目的一些功能需要我帮忙写写,我当时没在意,直接应了下来,我以为是前端项目,结果他说是个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即可。


标签: nginx php 502
微信 遇到疑问可加微信进行反映