Назад | Перейти на главную страницу

PHP7.0-FPM и Nginx не работают с сокетами unix

У меня проблема, не описанная в сети. Я использую VPS Debian 8 Nginx + PHP7.0-FPM. Мой сервер предоставляет php-файлы в исходном коде и не компилирует их, когда я настраиваю Nginx и PHP7.0-FPM для использования сокеты unix (Я делаю это, потому что читал, что он работает быстрее, чем TCP-соединения).

Так что я на самом деле делаю, а это не работает:

  1. отредактируйте / etc / nginx / fastcgi_params, чтобы прокомментировать параметр fastcgi_pass для использования файла сокета unix:
#fastcgi_pass    127.0.0.1:9000;

все мои хосты включают этот файл, поэтому мне нужно настроить собственный сокет в каждом файле хоста. Я так делаю:

  1. отредактируйте /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;
    }
  1. отредактируйте основной файл пула php7.0-fpm /etc/php/7.0/fpm/pool.d/www.conf для прослушивания сокета (но теперь я не могу понять, зачем мне это здесь):

    слушайте = /var/run/php/php7.0-fpm.sock

  2. отредактируйте файл пула моего сайта /etc/php/7.0/fpm/pool.d/example.com.conf, чтобы настроить его собственный сокет (так что здесь это необходимо, я думаю):

    слушайте = /var/run/php/example.com.php7.0-fpm.sock

  3. перезапустить службы:

    перезапуск службы nginx && перезапуск службы php7.0-fpm

так что мой index.php загружается, как когда я захожу на любую страницу сайта.

Но если я использую TCP-сокет fastcgi_pass 127.0.0.1:9000; работает нормально.

Что происходит с чрезмерно сложным location?

location ~ '\.php$|^/update.php' {

Я ожидаю, что ваши запросы действительно не соответствуют этому.

Все, что вам действительно нужно, это:

location ~ \.php$ {

Похоже, у вас неправильное имя файла для 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 не является «основным» файлом конфигурации, это полностью отдельный пул процессов, и его следует отключить / удалить, если вы его не используете. Поскольку оба пула настроены на использование одного и того же сокета, здесь определенно возникает конфликт.

У сокетов Unix есть разрешения

Сокет, соединяющий php и nginx, создается сервисом php7.2-fpm в соответствии с конфигом

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 ... вы выбираете свой ответ.