Настраиваем работу php-fpm на порт или на сокет

Предыстория

Решил сегодня обновить свой сервачёк до php7.3, у меня была 7.2. А как говорится — лучшее враг хорошего и положил всё на пару часов. Казалось бы простая команда

# apt install php7.3
# apt purge php7.2*

Не забываем, что тут всё начинается с решетки, т.е. от суперпользователя. Но что-то пошло не так, и я на выходе получил 502 Bad Gateway. Всё очевидно. Что-то с моими воротами не так, а вот что, не очень понятно. Да, у меня настроена связка php + nginx — я взрослый и с Апачами не вожусь.

Чиним

Потратил относительно много времени, чтобы починиться. Гуглил и саму проблему, что по идее не проблема, а просто nginx почему-то ходит не туда куда надо. Хотя ещё минуту назад с php7.2 он ходил туда же, но ничего не находил. Опуская детали, у меня nginx был настроен вот так

location / {
    ...

    location ~ [^/]\.php(/|$) {
        ...

        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        include         /etc/nginx/fastcgi_params;
    }
}

Что как бы намекает, что nginx лезет на 9000 порт, но вот

# netstat -tulpn | grep 9000

как бы намекает, что на этом порту у меня нет никого от слова совсем-вообще. А чтобы постичь следующую мудрость мне потребовалось 2 часа моего личного времени.

Как видно из заголовка поста FPM умеет быть в двух разных ипостасях: жить на tcp порту и на сокете (Я не силён в теории сетей, поэтому примем этот факт как аксиому). Для nginx’а нужно было чтобы приемник жил на порту с номером 9000. Технически ему по барабану кто на том конце сидит, он свое дело делает как умеет, пересылает туда куда написано. А вот приемник в лице php-fpm отчего-то не захотел подниматься, хотя когда в прошлый раз настраивал оно как-то само всё заработало без моей помощи… кажется…

Итого. Всякими страшными заклинаниями я постиг истину.

Чтобы php-fpm жил на порту

Нужно в /etc/php/7.3/fpm/pool.d/www.conf  писать так

... много строк...

listen = 127.0.0.1:9000

... много строк...

Остальные директивы listen либо закомментировать (точка с запятой в начале строки), либо удалить. Тогда верхний конфиг будет работать нормально.

А  чтобы php-fpm жил на сокете

Нужно в /etc/php/7.3/fpm/pool.d/www.conf  писать так

...много строк...

listen = /var/run/fastcgi.sock

...много строк...

Скорее всего оно так написано по умолчанию. Ещё рекомендуют раскомментировать

listen.allowed_clients = 127.0.0.1

Типа, чтобы запросы только от локлхоста обрабатывались. При этом в конфигах nginx надо перенаправлять запросы на этот самый сокет

location / {
    ...

    location ~ [^/]\.php(/|$) {
        ....

        fastcgi_pass    unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_index   index.php;
        include         /etc/nginx/fastcgi_params;
    }
}

Обрати внимание на директиву fastcgi_pass, в первом и втором случае она принципиально отличаются.

Всем рок!

Понравилась статья? Поделиться с друзьями:
Комментарии: 3
  1. Аноним
  2. Влад

    Спасибо, ваша простая инструкция очень помогла понять принцип настройки. Но в моей установке (Ubuntu 16.04.6) путь к сокету оказался какой-то нестандартный, я его вычислил так:

    $ sudo aux | grep php-fpm

    посмотрел в выводе pid root процесса php-fpm (первый в листинге, например, 1980) а потом

    $ sudo lsof -p 1980 | grep sock

    И вывод показал путь: /usr/lib/php/20180731/sockets.so

    Его я прописал в /etc/php/7.3/fpm/pool.d/www.conf

    listen = /usr/lib/php/20180731/sockets.so

    И в /etc/nginx/sites-available/default

    fastcgi_pass unix:/usr/lib/php/20180731/sockets.so;

    И все заработало! Еще раз благодарю! Возможно мой коммент также кому-то поможет ;-)

  3. Михаил

    Спасибо!

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.