Зашел на сервер я такой, думаю — обновлю его ( давно не ставил обновы на него). Выполнил апдейт. Захотел кое-что поменят в конфиге с nginx ( менял то, что не должно было поломать веб-сервер). Но после рестарта службы — веб-сервер лег вообще… Обидненько!
PS: Если спросить — чего я автоматом не обновляю пакеты или ОС — та не знаю. Чтобы не лягло все! Это ответ на вопрос ( если у кого-то появится).
Ошибка выглядет так:
(captain-notes)─(✗)─(10:08 PM Wed Apr 29)
└─(/home)─(5 files, 28Kb)─> systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: activating (start) since Wed 2020-04-29 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 captain-notes systemd[1]: Starting nginx - high performance web server...
Apr 29 22:06:39 captain-notes systemd[1]: Can't open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links
Приступим к решению!
Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links
Приведу пару солюшенов, которые нашел в инете. Перепробовал несколько из них — пофиксил ишью.
Решение №1
Папка /var/run не имеет символической ссылки (symbolic link) для /run директории. Можно проверить это так:
ls -ld /var/run
drwxr-xr-x 12 root root 4096 Apr 29 22:10 /var/run
Так же, папка /run имеется на сервере, проверим:
# ls -ld /run
drwxr-xr-x 32 root root 980 Apr 29 22:12 /run
Так же, можно грепнуть конфиг nginx:
# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf.default:#pid /var/run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;
А собственно, решение вот:
# mv /var/run /var/run_orig && ln -s ../run /var/run && ls -ld /var/run
Перезапускаем сервер с nginx и это должно пофиксить проблему.
У меня не решилось… Пробуем другой солюшен….
Решение №2
Смотрим что у нас в конфигах nginx:
# grep -ir pid /etc/nginx
/etc/nginx/nginx.conf:pid /run/nginx.pid;
/etc/nginx/nginx.conf:#pid /var/run/nginx.pid;
Находим строку:
pid /var/run/nginx.pid;
И меняем ее на:
pid /run/nginx.pid;
PS: Можно использовать SED и сделать замену:
# sed -i 's/pid \/var\/run\/nginx.pid/pid \/run\/nginx.pid/' /etc/nginx/nginx.conf
Далее, открываем:
# vim /lib/systemd/system/nginx.service
И меняем строку:
PIDFile=/var/run/nginx.pid
На:
PIDFile=/run/nginx.pid
Чтобы изменения применились, выполняем:
# systemctl daemon-reload
Затем, перезагружаем веб-сервер:
# service nginx restart
В итоге, получаем:
┌(captain-notes)─(✓)─(10:12 PM Wed Apr 29)
└─(/home)─(5 files, 28Kb)─> systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-04-29 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 captain-notes systemd[1]: Starting nginx - high performance web server...
Apr 29 22:12:24 captain-notes systemd[1]: Started nginx - high performance web server.
Я забыл заюзать strace, чтобы отловить ошибку, но нормальное поведение такое:
# 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 denied\n", 32strace: exec: Permission denied
) = 32
exit_group(1) = ?
+++ exited with 1 +++
ЗАМЕЧАНИЕ! Данная проблема, может касатья не только nginx, но может затронуть mysql или fail2ban и возможно — другие сервисы.
Вот и все, статья «Can’t open PID file /var/run/nginx.pid (yet?) after start: Too many levels of symbolic links» — завершена!
в большинстве случае это решается проще:
sudo chown nginx:nginx /var/run/nginx.pid
sudo service nginx restart
Чтобы исправить ошибку, нужно поменять владельца файла nginx.pid с root на Nginx
Выполняю команду chown -R nginx:nginx /run/nginx.pid
Владелец поменялся, но возвращается обратно root после перезагрузки nginx. Что делать?