Вопрос или проблема
Мне нужно перезапустить процесс. Что делать, когда я продолжаю видеть эти сообщения? Нужны ли дополнительные команды?
$ nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
$ service nginx start
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
$ systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2019-05-29 13:28:29 KST; 26s ago
Process: 24508 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 31955 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Process: 31952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 13077 (code=exited, status=0/SUCCESS)
May 29 13:28:27 ip-172-26-12-170 nginx[31955]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
May 29 13:28:27 ip-172-26-12-170 nginx[31955]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
May 29 13:28:28 ip-172-26-12-170 nginx[31955]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
May 29 13:28:28 ip-172-26-12-170 nginx[31955]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
May 29 13:28:29 ip-172-26-12-170 nginx[31955]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
May 29 13:28:29 ip-172-26-12-170 nginx[31955]: nginx: [emerg] still could not bind()
May 29 13:28:29 ip-172-26-12-170 systemd[1]: nginx.service: Control process exited, code=exited status=1
May 29 13:28:29 ip-172-26-12-170 systemd[1]: Failed to start A high performance web server and a reverse proxy server.
May 29 13:28:29 ip-172-26-12-170 systemd[1]: nginx.service: Unit entered failed state.
May 29 13:28:29 ip-172-26-12-170 systemd[1]: nginx.service: Failed with result 'exit-code'.
Приложение в настоящее время использует порт 80
. Скорее всего, это другая инстанция nginx
.
Найти приложение, прослушивающее сокет
С помощью команды netstat можно найти приложение, которое в данный момент прослушивает сокет. Также используйте grep для фильтрации вывода netstat
.
$ netstat -lpn | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 780/nginx: master p
tcp6 0 0 :::80 :::* LISTEN 780/nginx: master p
Последняя запись в списке 780/nginx
указывает PID
процесса, который в данный момент использует порт 80
.
Найти и завершить приложение
С помощью ps вы можете увидеть структуру процесса, использующего сокет:
$ ps f -g780
PID TTY STAT TIME COMMAND
780 ? Ss 0:00 nginx: master process nginx
781 ? S 0:00 \_ nginx: worker process
782 ? S 0:00 \_ nginx: worker process
783 ? S 0:00 \_ nginx: worker process
784 ? S 0:00 \_ nginx: worker process
785 ? S 0:00 \_ nginx: worker process
786 ? S 0:00 \_ nginx: worker process
787 ? S 0:00 \_ nginx: worker process
788 ? S 0:00 \_ nginx: worker process
С помощью команды kill вы можете завершить процесс, который использует сокет:
$ kill 780
Если процесс не завершается, используйте -9
:
$ kill -9 780
После этого попробуйте перезапустить сервис nginx
.
В будущем это может быть полезно. Вы можете проверить синтаксис файлов конфигурации Nginx, запустив:
nginx -t -c /etc/nginx/nginx.conf
Вывод ошибки подскажет, в чем проблема, а также укажет номер строки.
или:
отладка с помощью команды:
$ service nginx configtest
Вывод будет примерно таким:
Testing nginx configuration: nginx: [emerg] unknown directive “stub_status” in /etc/nginx/sites-enabled/nginx_status:11
nginx: configuration file /etc/nginx/nginx.conf test failed
.
Ответ или решение
Если вы являетесь IT-специалистом и сталкиваетесь с проблемой, когда не удается перезапустить nginx и появляются сообщения об ошибке, это может вызывать серьезные неудобства, особенно в производственной среде. Рассмотрим, как можно эффективно решить эту проблему.
Проблема
Вы получаете следующие сообщения об ошибке при попытке перезапустить nginx:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Это говорит о том, что порт 80 уже занят другим процессом. Наиболее вероятно, что это другой экземпляр nginx или другая служба, занимающая этот порт.
Шаги по решению проблемы
-
Поиск процесса, занимающего порт 80
Используйте команду
netstat
, чтобы определить, какой процесс в данный момент слушает на порту 80:$ netstat -lpn | grep 80
Вы получите PID процесса, который использует этот порт, например,
780/nginx: master p
, что указывает на то, что процесс с PID 780 в данный момент занимает порт 80. -
Просмотр структуры процесса
Воспользуйтесь командой
ps
, чтобы увидеть дочерние процессы, связанные с этим PID:$ ps f -g780
Это покажет вам информацию о мастере и рабочих процессах nginx.
-
Завершение процесса
Используйте команду
kill
для завершения процесса, который блокирует порт:$ kill 780
Если процесс не завершается, используйте принудительное завершение:
$ kill -9 780
-
Проверка конфигурации nginx
Убедитесь, что файлы конфигурации nginx не содержат ошибок. Для этого выполните:
$ nginx -t -c /etc/nginx/nginx.conf
Это обеспечит, что файлы конфигурации корректны и готовы к использованию.
Также можно использовать специальную команду для проверки конфигурации:
$ service nginx configtest
Заключение
После выполнения вышеуказанных шагов вы сможете успешно перезапустить службу nginx. Эти действия помогут избежать периода простоя и проблем с доступом. Применяйте их всякий раз, когда сталкиваетесь с проблемами перезапуска nginx. Это гарантирует бесперебойную работу веб-сервера, улучшая тем самым пользовательский опыт и рабочую эффективность.