Недавно я установил nginx и PHP-FPM через MacPorts на OS X 10.9 Mavericks, и хотя он работает, мой основной error_log постоянно сообщает, что порт 80 используется.
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: still could not bind()
Я не проверял, что больше ничего, например, Apache использует порт 80.
При поиске решения несколько мест, таких как вот этот говорят, что решение состоит в том, чтобы удалить / закомментировать listen
директивная строка в хосте по умолчанию.
#listen 80 default_server;
Для меня это ничего не изменило, и основной error_log продолжал заполняться.
Наконец кто-то в форумы nginx устранение аналогичной проблемы рекомендуется посмотреть на вывод
ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'
Что для меня было
PID PPID %CPU VSZ WCHAN COMMAND
4963 1 0.0 2504128 - /opt/local/bin/daemondo --label=nginx --start-cmd /opt/local/sbin/nginx ; --pid=fileauto --pidfile /opt/local/var/run/nginx/nginx.pid
4967 1 0.0 2475388 - nginx: master process /opt/local/sbin/nginx
4969 4967 0.0 2476412 - nginx: worker process
5024 1538 0.0 2432784 - egrep (nginx|PID)
1969 1874 0.0 2432772 - tail -F /opt/local/etc/nginx/logs/error.log
В первой строке я заметил, что расположение pidfile задано в команде запуска MacPorts --pidfile /opt/local/var/run/nginx/nginx.pid
и что оно отличалось от того места, которое я указал в моем nginx.conf
. Я изменил pid
запись обратно, чтобы соответствовать тому, что указывала команда запуска:
pid /opt/local/var/run/nginx/nginx.pid;
После перезапуска nginx и закрытия error_log (tail -F /opt/local/etc/nginx/logs/error.log
) Я заметил, что проблема решена.
Вкратце: если вы используете версию nginx для MacPorts, вы, вероятно, не захотите связываться с изменением местоположения pidfile.
Кроме того, если вы посмотрите на другие страницы, пытающиеся решить эту проблему, в частности те, на которых проблема была устранена путем удаления listen
или если что-то еще, например Apache, также использует порт 80, вы заметите, что в этих журналах ошибок написано
[emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
и у меня был
[emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)
Я подозреваю разницу между ошибкой 98 и ошибка 48 это разница, но я не смог найти описания различных ошибок.
У меня была похожая проблема с установкой Nginx Homebrew. У меня была более старая установка Nginx, работающая как процесс launchd, хотя я удалил ее некоторое время назад (возможно, я не lauchctl unload
он или Homebrew не отключили его при удалении). Во всяком случае, Nginx не подошел бы brew list
ни netstat
может найти процесс, используя порт. Я мог обнаружить это только с lsof
:
sudo lsof -i 4tcp:8080
Процесс был запущен и использовал порт, но я нигде не мог его найти (я даже пытался sudo find / -name nginx -type d
чтобы найти на всем диске каталоги с именем nginx, но безуспешно). После некоторого удара головой о стол я подумал о том, чтобы проверить, показывает ли Activity Monitor путь к открытым файлам для процесса, и это действительно так.
Откройте Activity Monitor, найдите процесс, дважды щелкните его, и откроется другое окно с деталями процесса:
Несмотря на то, что процесс и его файлы были указаны в списке, файлов на диске не было. Мне просто пришлось принудительно закрыть запущенные процессы зомби Nginx, а затем новая установка Nginx заработала, как ожидалось.
Я не уверен, но если я правильно помню, я также пытался ps aux | grep nginx
и он не появился, но выстрел стоит:
sudo ps aux | grep nginx