Я нахожусь на Ubuntu 18.10, работающей под VMware и не могущий запустить nginx сервис - я получаю ошибку "nginx.service: не Может открыть файл PID/run/nginx".
Я скомпилировал nginx из источника с помощью пассажира. Это пошло хорошо на одной машине, но попытка его в моем vm я не могу запустить nginx сервис. Это дает вышеупомянутую ошибку, поскольку это не может открыть файл PID (или создать его?). Я сделал systemctl, включают и запускаются, и он зависает.
Я использовал/etc/sytemd/system/nginx.service сценарий следующим образом:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Я попытался заменить/var/run выполненный/, и он дает ту же ошибку.
Нет никакой ссылки на PID в nginx.conf (и я не думаю там потребности быть?).
Кто-либо мог дать мне какие-либо подсказки по тому, как диагностировать или зафиксировать это?
У меня есть ответ в смысле того, как зафиксировать это, но я оставлю его открытым некоторое время, таким образом, кто-то сможет прокомментировать, ПОЧЕМУ это так.
Я изменил строку PID, таким образом, файл PID был записан в папку журнала установленной nginx папки (/opt/nginx/logs). Anwhere еще и это ОТКАЗАЛОСЬ бы писать файл PID!!!
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Я понятия не имею, что причина этого поведения, и было бы замечательно, если бы некоторая Ubuntu, которую эксперт Linux мог бы сказать мне, почему это не записало бы PID больше нигде, включая нормальное местоположение выполнения / выполненный и/var/run (или даже tmp), например, как нормально во всех заключенных в кавычки сценариях запуска для программы. Я думаю, что это только происходит, когда это создается из источника.
/ выполняется доступный? Можете Вы CD в выполненный / и касаться файла?
cd /run && touch hello.txt && ls -lash
Если не, который, вероятно, означает, что Вы хотите, чтобы nginx поместил файл PID в местоположение, которое не доступно. Можно сделать 2 вещи;
Только что наткнулся на ваш вопрос и решил оставить краткий ответ:
Systemd НЕ создает файлы PID самостоятельно. Он ожидает, что исполняемые файлы создадут его (обычно внутри /run
,или специально для Ubuntu в папке /var/run
). Systemd только проверяет, был ли он создан после запуска службы. Он также удаляет файл PID при завершении службы. Ссылка
Сервер Nginx в качестве процесса разветвления поддерживает создание файла PID. Чтобы изменить его местоположение, вы можете использовать директиву pid
в его файле nginx.conf
, который вы можете найти в папке /etc/nginx
для стандартного упаковка. Эта директива pid
по умолчанию имеет значение logs/nginx.pid
. Ссылка
При ручном создании службы Nginx необходимо убедиться, что оба местоположения находятся в файле Systemd nginx.service
и в конфигурации Nginx nginx.conf
. файл совпадает.