Предыстория
Решил сегодня обновить свой сервачёк до 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, в первом и втором случае она принципиально отличаются.
Всем рок!
Твой пример уязвимый
https://medium.com/@knownsec404team/php-fpm-remote-code-execution-vulnerability-cve-2019-11043-analysis-35fd605dd2dc
Спасибо, ваша простая инструкция очень помогла понять принцип настройки. Но в моей установке (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;
И все заработало! Еще раз благодарю! Возможно мой коммент также кому-то поможет
Спасибо!