Как отлаживать Apache 404?

Каждый раз, когда я настраивал новый httpd установка, я борюсь с начальной VirtualHost / mod_proxy_fcgi / и т.д. конфигурация.

Когда я настраиваю свои виртуальные хосты и получаю 404, я всегда обращаюсь к журналам, только чтобы найти:

  • access_log:

    ::1 - - [13/Sep/2019:21:33:57 +0200] "GET /phpinfo.php HTTP/1.1" 404 196
    

    То есть только то, что 404 получилось.

  • error_log:

    ...
    [Fri Sep 13 21:33:55.009444 2019] [mpm_prefork:notice] [pid 73200] AH00163: Apache/2.4.41 (Unix) configured -- resuming normal operations
    [Fri Sep 13 21:33:55.011901 2019] [core:notice] [pid 73200] AH00094: Command line: '/usr/local/opt/httpd/bin/httpd -D FOREGROUND'
    

    То есть ничего.

Поэтому я всегда делаю одно и то же: метод проб и ошибок.

Есть ли способ, которым я могу поручить Apache регистрировать каждый шаг, который он пробовал, прежде чем сделать вывод, что это 404?

Что-то типа:

  • нет совпадений для VirtualHost x
  • нет совпадений для VirtualHost y
  • совпадение для VirtualHost z, файл не найден: / путь / к / файлу

То есть что-то полезное?

1 ответ

Первое, что нужно проверить, это вывод apachectl -S. Он показывает, какой IP-адрес прослушивает какой порт и для какого виртуального хоста. А также показывает номер файла и строки, в которой он был настроен.

Затем вы можете добавить директиву GlobalLog для всех виртуальных хостов и увеличить LogLevel во время отладки, сохраняя при этом стандартные файлы CustomLog.

Например, создать файл /etc/apache2/conf-available/temp_debug.conf:

LogLevel trace4
GlobalLog ${APACHE_LOG_DIR}/debug.log "%v:%p %h %l %u %t \"%r\" %>s %O file=%f"

# http://httpd.apache.org/docs/current/mod/mod_log_config.html#formats
# %v    The canonical ServerName of the server serving the request.
# %f    Filename.

Включите это с помощью

sudo a2enconf temp_debug && sudo apachectl graceful

Когда закончите, отключите дополнительное ведение журнала с помощью

sudo a2disconf temp_debug && sudo apachectl graceful

Информация о трассировке попадет в ваш журнал ошибок, где также будет указано, какой уровень трассировки был необходим для записи в журнал.

Да. Там возможны подходы для решения вашей проблемы. На мой взгляд, лучше всего настроить разные ErrorLog а также CustomLog директивы для каждого виртуального хоста, сохранение в независимых файлах. Еще один способ - настроить журнал, вставив виртуальный хост с использованием масок LogFormat (например,%v, чтобы зарегистрировать соответствующий виртуальный хост). Проблема этого метода заключается в том, что если вы используете какой-то анализатор логов Apache, вы можете столкнуться с какой-то проблемой или вам придется настроить ее в соответствии с новым шаблоном.

С наилучшими пожеланиями.

Другие вопросы по тегам