Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Зашел на сервер я такой, думаю — обновлю его ( давно не ставил обновы на него). Выполнил апдейт. Захотел кое-что поменят в конфиге с nginx ( менял то, что не должно было поломать веб-сервер). Но после рестарта службы — веб-сервер лег вообще… Обидненько!

PS: Если спросить — чего я автоматом не обновляю пакеты или ОС — та не знаю. Чтобы не лягло все! Это ответ на вопрос ( если у кого-то появится).

Ошибка выглядет так:

sh
16 lines

(captainnotes)()(10:08 PM Wed Apr 29)
└─(/home)(5 files, 28Kb)> systemctl status nginx.service
nginx.service nginx high performance web server

: disabled)

Active: activating (start) since Wed 20200429 22:06:39 EEST; 1min 54s ago
Docs: http://nginx.org/en/docs/
CGroup: /system.slice/nginx.service
├─2197 nginx: master process /usr/sbin/nginx c /etc/nginx/nginx.conf
├─2198 nginx: worker process
├─2199 nginx: worker process
├─2200 nginx: worker process
├─2201 nginx: worker process
└─2202 nginx: cache manager process
Apr 29 22:06:39 captainnotes systemd[1]: Starting nginx high performance web server
Apr 29 22:06:39 captainnotes systemd[1]: Cant open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Приступим к решению!

Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links

Приведу пару солюшенов, которые нашел в инете. Перепробовал несколько из них — пофиксил ишью.

Решение №1

Папка /var/run не имеет символической ссылки (symbolic link) для /run директории. Можно проверить это так:

sh
2 lines

ls ld /var/run
drwxrxrx 12 root root 4096 Apr 29 22:10 /var/run

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Так же, папка /run имеется на сервере, проверим:

sh
2 lines

# ls -ld /run
drwxrxrx 32 root root 980 Apr 29 22:12 /run

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Так же, можно грепнуть конфиг nginx:

sh
3 lines

# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf.default:#pid /var/run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

А собственно, решение вот:

sh
1 lines

# mv /var/run /var/run_orig && ln -s ../run /var/run && ls -ld /var/run

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Перезапускаем сервер с nginx и это должно пофиксить проблему.

У меня не решилось… Пробуем другой солюшен….

Решение №2

Смотрим что у нас в конфигах nginx:

sh
4 lines

# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf:pid /run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Находим строку:

sh
1 lines

pid /var/run/nginx.pid;

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

И меняем ее на:

sh
1 lines

pid /run/nginx.pid;

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

PS: Можно использовать SED и сделать замену:

sh
1 lines

# sed -i ‘s/pid /var/run/nginx.pid/pid /run/nginx.pid/’ /etc/nginx/nginx.conf

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Далее, открываем:

sh
1 lines

# vim /lib/systemd/system/nginx.service

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

И меняем строку:

sh
1 lines

PIDFile=/var/run/nginx.pid

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

На:

sh
1 lines

PIDFile=/run/nginx.pid

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Чтобы изменения применились, выполняем:

sh
1 lines

# systemctl daemon-reload

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Затем, перезагружаем веб-сервер:

sh
1 lines

# service nginx restart

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

В итоге, получаем:

sh
20 lines

(captainnotes)()(10:12 PM Wed Apr 29)
└─(/home)(5 files, 28Kb)> systemctl status nginx.service
nginx.service nginx high performance web server

: disabled)

Active: active (running) since Wed 20200429 22:12:24 EEST; 10s ago
Docs: http://nginx.org/en/docs/
Process: 2996 ExecStart=/usr/sbin/nginx c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 2997 (nginx)
CGroup: /system.slice/nginx.service
├─2997 nginx: master process /usr/sbin/nginx c /etc/nginx/nginx.conf
├─2998 nginx: worker process
├─2999 nginx: worker process
├─3000 nginx: worker process
├─3001 nginx: worker process
├─3002 nginx: cache manager process
└─3003 nginx: cache loader process
Apr 29 22:12:24 captainnotes systemd[1]: Starting nginx high performance web server
Apr 29 22:12:24 captainnotes systemd[1]: Started nginx high performance web server.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Я забыл заюзать strace, чтобы отловить ошибку, но нормальное поведение такое:

sh
22 lines

# strace /run/nginx.pid
execve(«/run/nginx.pid», [«/run/nginx.pid»], 0x7ffcaef1ce40 /* 29 vars */) = 1 EACCES (Permission denied)
open(«/usr/share/locale/locale.alias», O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2502, …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 1, 0) = 0x7f8def0a3000
read(3, «# Locale name alias data base.n#»…, 4096) = 2502
read(3, «», 4096) = 0
close(3) = 0
munmap(0x7f8def0a3000, 4096) = 0
open(«/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo», O_RDONLY) = 1 ENOENT (No such file or directory)
open(«/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo», O_RDONLY) = 1 ENOENT (No such file or directory)
open(«/usr/share/locale/en_US/LC_MESSAGES/libc.mo», O_RDONLY) = 1 ENOENT (No such file or directory)
open(«/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo», O_RDONLY) = 1 ENOENT (No such file or directory)
open(«/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo», O_RDONLY) = 1 ENOENT (No such file or directory)
open(«/usr/share/locale/en/LC_MESSAGES/libc.mo», O_RDONLY) = 1 ENOENT (No such file or directory)
fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), …}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 1, 0) = 0x7f8def0a3000
write(2, «strace: exec: Permission deniedn», 32strace: exec: Permission denied
) = 32
exit_group(1) = ?
+++ exited with 1 +++

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ЗАМЕЧАНИЕ! Данная проблема, может касатья не только nginx, но может затронуть mysql или fail2ban и возможно — другие сервисы.

Вот и все, статья «Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links» — завершена!

Was this helpful?

0 / 0