Php fpm не создает сокет
I've set up my php5-fpm to bind to a unix domain socket within /var/run/php5-fpm .
The problem is that it will not automatically create the php5-fpm directory. When I reboot the machine, the directory is gone.
How can I have it automatically created on boot? Or is there an other solution to this problem?
@quanta so am I expected to create it by hand (or through an init script) every time I boot? seems ridiculous to me. I don't see why it needs to be that hard.
If the directory is not being created, then you could always add a "mkdir" command to the init.d script that starts PHP-FPM. For my setup, I use /tmp to store them just because it's always there.
Not the answer you're looking for? Browse other questions tagged php centos php-7 or ask your own question.
Linked
Related
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.12.42104
Здравствуй, уважаемый пользователь Хабрахабра. Мое повествование будет о том, как подготовить почву для локальной веб-разработки проектов в операционной системе Ubuntu 16.04.1 LTS.
В данной статье хочется развеять и разъяснить возможные трудности связанные с установкой и настройкой ПО, которое требуется для современной веб-разработки, с которыми возможно сталкиваются начинающие разработчики и не только.
Технологии которые будут использованы в статье: nginx, php-fpm.
Перед началом повествования, хочу отметить, что я проделывал все эти действия на «голой» системе.
Я буду работать с пакетным менеджером aptitude. Так же рекомендую обновить индекс пакетов и сами пакеты перед установкой ПО. В статье мы проделаем эти действия вместе.
2 Answers 2
As you probably already discovered, /var/run is ephemeral by design. Check the FHS for more information on it and other directories.
The /var/run/php5-fpm directory must exist prior to php-fpm trying to use. Neither php-fpm nor the init script seem to be creating it so you'll have to step in.
The easiest option is to tweak your init script to create the directory in a way that is very specific to your environment. The downside is that this adds baggage that you'll have to carry on in your "sysadmin toolkit".
There are two other options that are more involved but would be permanent solutions for you and others:
Submit a patch to php-fpm source code so that it checks for the existence of the directory defined in the .conf files. This will require knowledge of C and PHP's processes for patch submission.
Submit a patch to your Linux distribution's init system so it does the same. This could be easier (compared to first option) and will probably require knowledge of shell script and again, your distro's processes for patch submission.
You can do the quick fix (change your init scripts) and move on, but a nice exercise would be to follow one of the permanent options so others can benefit. It's simple enough and might get you hooked on contributing to open source projects (if you don't already do it, pardon my ignorance).
I would like to use nginx instead of Apache, so I've also installed the php70w-fpm and nginx packages. However, when I service start php-fpm , it does not create a php-fpm.sock file anywhere on my server. I have checked in /var/run and have also ran find / -name "*.sock" which only returns /var/run/rpcbind.sock .
1 Answer 1
On further investigation, it turns out I was missing a RuntimeDirectoryPreserve directive in my unit file. When the service was stopped, the RuntimeDirectory was deleted…along with the sockets.
RuntimeDirectoryPreserve= Takes a boolean argument or restart. If set to no (the default), the directories specified in RuntimeDirectory= are always removed when the service stops. If set to restart the directories are preserved when the service is both automatically and manually restarted. Here, the automatic restart means the operation specified in Restart=, and manual restart means the one triggered by systemctl restart foo.service. If set to yes, then the directories are not removed when the service is stopped. Note that since the runtime directory /run is a mount point of "tmpfs", then for system services the directories specified in RuntimeDirectory= are removed when the system is rebooted.
PHP 7.1 после начальной загрузки
PHP 7.3 after boot
If I make a change to the respective php.ini file, this warrants a restart of the service in order for changes to be processed. In my case, when I restart the service using systemctl restart (e.g sudo systemctl restart php7.1-fpm ), the service appears to restart gracefully but all the PHP sockets are deleted -- regardless of the version I restart.
There's no console output after the systemctl restart , and when I check systemctl status on the restarted service (e.g PHP 7.1 in previous paragraph), the service is running:
Contents of /var/run/php after boot
Each service appears to be running without issue. Here's the systemctl status output for each:
Instead of using something like
This is not really an answer, just an alternative solution. The question at hand is specifically regarding socket files, not TCP/IP
works for php7 + centos7 + nginx^^ no .sock file gets created on service start (permissions? not sure), either way this one works^
Make sure you have the following folder and that it's writable. /var/run/php-fpm
then run: sudo service php-fpm restart
What do you need fastcgi_param to be if you are hosting multple sites? Can you reuse a single socket?
I had the same problem - no socket created - and the same solution that Phil had.
I had just copy-pasted a pool-file, and only changed the socket-name in the listen-section. No socket.
This was because the pool name was already in use. When you already have pool with the same name, then there is not created a new socket.
So it is important to have a unique pool name for each socket.
So when copy/paste a pool configuration: Change both pool-name and socket-name!
I had the error, because I copy-pasted a pool.d/xx.conf and the new one had the same pool name [whatever], so the second was not loaded. No error, no socket.
Hope that helps someone :)
I know its too late, but may be this can help. You can create a new lock file from the scratch using Python.
If your php-fpm is controlled by systemd you have to check PrivateTmp option in your php-fpm service unit file (you can this file this way find /etc/systemd -name "php-fpm*" ! -type d )
Hope this helps!
In my case, I missed in /etc/php/7.0/fpm/pool.d/wordpress.conf the correct section
The *.sock file is not created from filename but from section name.
Hallelujah! :D I also just forgot to change the "pool name" (did you mean this by "section") after copy and pasting from another config file.
In my case when changing PHP version example to PHP7.4 for a specific website in Ispconfig 3.2.2 the webxx.conf file should have been created in /etc/php/7.4/fpm/pool.d/ but instead, it was created at root / .
So for now I just mv the webxx.conf file to /etc/php/7.4/fpm/pool.d/ and restart PHP7.4-fpm sudo systemctl restart php7.4-fpm and it works correctly.
PHP 7.3 после начальной загрузки
Если я вношу изменение в соответствующее php.ini файл, это гарантирует перезапуск сервиса для изменений, которые будут обработаны. В моем случае, когда я перезапускаю сервисное использование systemctl restart (например, sudo systemctl restart php7.1-fpm ), сервис, кажется, перезапускает корректно, но все сокеты PHP удалены - независимо от версии, которую я перезапускаю.
Нет никакого консольного вывода после systemctl restart , и когда я проверяю systemctl status на перезапущенном сервисе (например, PHP 7.1 в предыдущем абзаце), работает услуга:
Файл hosts
Этот файл находится по пути /etc/hosts. Наличие в нем записей, позволяет запускать nginx с использованием в качестве домена localhost. В этом файле можно присваивать альтернативные псевдонимы, например для нашего проекта project.local, мы присвоим домен project.local.
Открываем файл в редакторе nano.
У вас в этом файле будет и другая информация, просто игнорируйте ее. Вам всего лишь нужно добавить строку как на моем скриншоте.
Не забываем сохранить файл. На этом настройка файла hosts закончена.
PHP 7.1 after systemctl restart
Note the timestamp difference on Active . If I query the other services in the same fashion (note: they have not been restarted by me), the timestamps are from the initial start at boot:
PHP 7.2 после systemctl restart на PHP 7.1
PHP 7.2 after systemctl restart on PHP 7.1
Overview
I'm compiling multiple PHP-FPM instances from source on a single server (no containers) for use with web apps of various ages. I have successfully set up PHP 7.1, PHP 7.2 and PHP 7.3 alongside one another. They all start correctly at boot, they all have a socket in /var/run/php/ , they all respond as expected from a browser.
PHP 7.3 после systemctl restart на PHP 7.1
… и все же все сокеты отсутствуют:
PHP 7.3 after systemctl restart on PHP 7.1
…and yet all the sockets are missing:
Contents of /var/run/php after systemctl restart on PHP 7.1
My gut feeling is that I've mangled something in the .service file without realising. While I've been troubleshooting, I've noticed I'm using different directories for the PID and socket. The PID is not created at boot time as /run/php-fpm/ does not exist. I have a vague memory of being advised to not keep sockets and PIDs in the same directory, but I can't recall the exact details.
Установка пакетного менеджера aptitude, обновление индекса и пакетов
Обновляем пакеты (команда обновит все пакеты, для которых есть новые версии, если потребуется удаление пакетов, то оно будет выполнено).
PHP 7.2 после начальной загрузки
Содержание /var/run/php после systemctl restart на PHP 7.1
Мое инстинктивное чувство состоит в том, что я исказил что-то в .service файл без понимания. В то время как я диагностировал, я заметил, что использую различные каталоги для PID и сокета. PID не создается во время начальной загрузки как /run/php-fpm/ не существует. У меня есть неопределенная память того, чтобы быть сообщенным не сохранить сокеты и PIDs в том же каталоге, но я не могу вспомнить точные детали.
PHP 7.1 .service файл
Заранее спасибо за любые указатели или дополнительные материалы для чтения.
PHP 7.2 after boot
8 Answers 8
The answer was to not use a .sock file at all.
1 ответ
На дальнейшем расследовании оказывается, что я пропускал a RuntimeDirectoryPreserve директива в моем файле единицы. Когда сервис был остановлен, RuntimeDirectory был удален … наряду с сокетами.
RuntimeDirectoryPreserve = Берет булев аргумент или перезапуск. Если установлено на не (значение по умолчанию), каталоги, указанные в RuntimeDirectory =, всегда удаляются, когда сервис останавливается. Если установлено для перезапуска каталогов сохраняются, когда сервис и автоматически и вручную перезапущен. Здесь, автоматический перезапуск означает операцию, указанную в Перезапуске =, и ручной перезапуск означает, что тот, инициированный systemctl, перезапускает foo.service. Если установлено на да, то каталоги не удалены, когда сервис останавливается. Обратите внимание, что, так как каталог во время выполнения,/run, является точкой монтирования "tmpfs", затем для системных служб, каталоги, указанные в RuntimeDirectory =, удалены, когда система перезагружается.
Using systemctl restart on PHP-FPM doesn't create the required socket in /var/run/php/ , but a reboot does.
How can I tweak my setup to allow a service restart without a reboot?
Установка и настройка nginx (версия >= 1.10.0)
Проверяем версию, чтобы убедиться что не установили старую, то есть ниже 1.10.0.
Установку и запуск произвели, теперь пойдем в каталог туда куда установлен наш nginx и посмотрим на его структуру. Каталог nginx находится по такому пути:
Посмотреть содержимое директории можно командой ls, с флагами -la будет удобнее просматривать содержимое каталога (в действительности эту команду с конкретными флагами можно описать детальнее и вернее, но у нас сегодня другая тема).
Наc интересуют в данный момент два каталога, которые вы видите на скриншоте. Это каталоги sites-available и sites-enabled.
Давайте перейдем в каталог sites-available и начнем конфигурировать наш виртуальный хост (сайт).
Перед началом создания конфигурационного файла, проверим что лежит у нас в данном каталоге. В моей случае каталог не пустой, в нем уже есть конфигурационные файлы, я их затер, чтобы не вводить вас в заблуждение.
В случае установки nginx «с нуля», именно «с нуля», так как при удалении nginx командой
или конфигурационные файлы остаются и если вы вдруг будете не понимать, почему nginx не работает и захотите его переустановить (обычно к такому прибегают начинающие пользователи Linux), то и после переустановки он не будет корректно работать, из-за того что в старых конфигурационных файлах (они не удаляются после удаления командой remove) прописаны неверные настройки, их придется удалить, либо настроить верно, только тогда nginx заработает.
Рекомендую удалять командой sudo apt-get purge nginx или sudo apt purge nginx . Если вы используете пакетный менеджер aptitude, то команда sudo aptitude purge nginx удаляет пакет полностью со всеми зависимостями и конфигурационными файлами.
В этом каталоге будет по умолчанию один файл, с названием default. В нем будет конфигурационный файл с примером, с комментариями, его вы можете изучить на досуге, а можете и вовсе удалить (всегда можно обратиться к официальной документации).
Создадим свой конфигурационный файл, который будет соответствовать названию домена нашего локального сайта (или реального, если уже знаете его название). Это удобно, в будущем, когда будет много конфигурационных файлов, то это избавит вас от путаницы в них. У меня этот файл будет называться project.local.
Посмотрим что получилось.
Теперь откроем его в редакторе, я открою его в nano.
Видим что он у нас пустой. Теперь перейдем к формированию нашего файла. Нужно привести конфигурацию к такому виду, как написано ниже. Я опишу только жизненно важные директивы этого файла, описывать остальное не буду, так как это не является на данный момент важным, все-таки у нас тема базовой настройки. Этих настроек с «горкой» хватит для разработки проектов локально, не только мелких, но и довольно крупных. В следующих статьях опишу отдельно каждые использованные директивы (именно так называются строки, например server_name) этого файла.
Смотрите комментарии прям в конфигурационном файле.
Сохраняем файл. Теперь нам надо проверить, нет ли в нем ошибок. Сделать мы это можем командой.
Если видим такую информацию как на скриншоте, значит у нас все верно, может продолжать настройку. Если вы получаете какие-либо ошибки, стоит перепроверить конфигурационный файл.
Теперь нам надо активировать конфигурационный файл, в каталоге /etc/nginx/sites-enabled/ необходимо создать симлинк (символическая ссылка). Если у вас nginx был установлен «с нуля», то в этом каталоге есть симлинк на файл default, про который рассказывалось выше, его можно удалить, если он вам не требуется. Переходим в нужный каталог.
Теперь мы в нужном каталоге. Давайте создадим наш симлинк. Для создания используется команда ln с флагом -s, далее мы укажем путь до нашего конфига project.local.
Посмотрим на наш созданный симлинк.
Чтобы убедиться что мы делаем еще все верно опять запустим команду.
Если все ок, едем дальше.
So in my nginx config I put
Содержание /var/run/php после начальной загрузки
Каждая услуга, кажется, работает без проблемы. Вот systemctl status вывод для каждого:
Установка php-fpm (>=7.0)
Проверяем установленную версию, на всякий случай, хотя в Ubuntu 16.04.1 в репозиториях лежит именно 7.0 версия.
Убеждаемся что все ок. Стартуем php-fpm.
На этом установка и настройка php-fpm закончена. Правда, это все. Это не магия, путь до сокета php-fpm у нас уже был прописан в конфигурационном файле. Конечно, вам могут понадобиться какие-либо расширения php для разработки личных проектов, но их вы можете поставить по мере того как они будут требоваться.
Теперь пойдем для в каталог с нашим проектом, у меня он лежит по такому пути.
Поднимемся на каталог выше и сделаем права 777 (то есть мы будем делать полные права каталогу с нашим проектом project.local). В будущем это избавим нас от лишних проблем.
На этом настройка ПО завершена, давайте создадим тестовый файл в нашем рабочем каталоге project.local и убедимся что все работает. Я создам файл index.php с таким содержанием.
Идем в браузер и видим что у нас все прекрасно работает! Интерпретатор php в том числе.
Используя systemctl restart на PHP-FPM не создает необходимый сокет в /var/run/php/ , но перезагрузка делает.
Как я могу настроить свою установку для разрешения сервисного перезапуска без перезагрузки?
PHP 7.1 after boot
Обзор
Я компилирую несколько экземпляров PHP-FPM из источника на единственном сервере (никакие контейнеры) для использования с веб-приложениями различных возрастов. Я успешно настроил PHP 7.1, PHP 7.2 и PHP 7.3 друг вместе с другом. Они все запускают правильно при начальной загрузке, у них всех есть сокет в /var/run/php/ , они все отвечают как ожидалось от браузера.
PHP 7.1 .service file
Thank you in advance for any pointers or further reading.
PHP 7.1 после systemctl restart
Отметьте различие в метке времени на Active . Если я запрашиваю другие сервисы тем же способом (примечание: они не были перезапущены мной), метки времени от начального запуска при начальной загрузке:
Читайте также: