Почему Apache не запускается

Многие новички, которые пытаются настроить свой домашний веб-сервер на основе Apache часто сталкиваются с ошибкой, что Apache не запускается. Благо сейчас в Ubuntu веб-сервер будет правильно работать по умолчанию и запустится, если вы не будете менять настройки, но раньше и в других дистрибутивах приходилось настраивать различные параметры и возникали ошибки.

В этой небольшой статье мы рассмотрим почему Apache не работает, что может стать причиной этой проблемы и как ее решить. Инструкция подойдет не только для Ubuntu, но и для других Linux дистрибутивов.

Почему не запускается Apache?

Вы можете столкнуться с такой проблемой по разным причинам, давайте сначала рассмотрим основные из них, чтобы вы знали что дальше делать:

А теперь рассмотрим более подробно почему так происходит и как решить проблему.

Как решить проблему с Apache?

systemctl status apache2.service

Дальше вы можете проверить конфигурационный файл на корректность с помощью такой команды:

Тут будут показаны даже предупреждения, которые не влияют на работу сервиса. Все серьезные ошибки нужно исправить если таковые имеются, возможно именно они препятствуют запуску.

Таким же образом проверяем папку с логами:

Как видите, у меня папка /var/www/public_html принадлежит пользователю root, но на папку public_html установлены права чтения и записи для всех пользователей. Поэтому проблем нет, а на папку с логами в качестве группы установлена adm, в эту группу входит пользователь www-data, так что тут тоже проблем нет. Если у вас что-то отличается и вы видите что прав недостаточно, то либо измените владельца папки с файлами веб-сайтов на www-data, либо дайте больше разрешений:

Также, если в вашей системе включен SELinux, то вы можете его отключить на время, чтобы понять не в нем ли проблема:

Другой момент, который может вызвать ошибку, это если на порту, который вы хотите использовать для веб-сервера уже запущен какой-то процесс, например, nginx или lighttpd, в таком случае, его нужно остановить:

sudo systemctl stop nginx
sudo systemctl stop lighttpd

Или вы можете попытаться изменить порт на другой, для этого откройте конфигурационный файл веб-сервера и найдите там строку Listen:

Если такой строки еще нет, то вы можете ее создать. Далее просто измените номер порта с 80 на любой удобный, например, 8080

Failed to resolve server name for localhost

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

А также ассоциировать это имя с localhost в файле hosts:

Дальше было достаточно перезапустить Apache и все начинало работать.

Выводы

В этой статье мы рассмотрели несколько причин почему не запускается Apache и примеров их решения. Причин может быть множество, но мы разобрали только самые главные, которые встречаются наиболее часто. Надеюсь, эта информация была для вас полезной, если у вас остались вопросы, спрашивайте в комментариях! А для тех кого интересует еще один способ решения проблемы xampp apache не запускается для Windows есть видео:

Добавить в избранное

Главное меню » Linux » Настройка журналов ошибок и доступа Apache

Настройка журналов ошибок и доступа Apache

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

Apache записывает записи своих событий в два типа журналов: журналы доступа и журналы ошибок. Журналы доступа содержат информацию о клиентских запросах, а журналы ошибок – информацию о проблемах сервера и приложения.

В этой статье описывается, как настроить доступ и прочитать журналы ошибок к Apache.

Настройка журнала доступа

Веб-сервер Apache генерирует новое событие в журнале доступа для всех обработанных запросов. Каждая запись события содержит метку времени и включает в себя различную информацию о клиенте и запрошенном ресурсе. Журналы доступа показывают местоположение посетителей, страницу, которую они посещают, сколько времени они проводят на странице и многое другое.

Директива CustomLog определяет местоположение файла журнала и формат сообщений журнала.

Основной синтаксис директивы CustomLog следующий:

log_file может быть по отношению к ServerRoot или полный путь к файлу журнала. Сообщения журнала также могут передаваться в другую программу с использованием символа канала |.

Второй аргумент format указывает формат сообщений журнала. Это может быть либо явное определение формата, либо псевдоним, определенный директивой LogFormat.

Чтобы не повторять один и тот же код несколько раз, предпочитайте определять директиву LogFormat и использовать ее в качестве псевдонима в директиве CustomLog.

Полный список всех форматных строк и модификаторов смотрите в документации к модулю «mod_log_config».

Например, если вы хотите исключить запросы к файлам css для записи в файл журнала, вы должны использовать следующее:

Чтобы изменить формат ведения журнала, вы можете либо определить новую директиву LogFormat, либо переопределить формат по умолчанию. Обычно лучше определить новый формат.

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

Для этого просто закомментируйте или удалите директиву CustomLog из разделов конфигурации основного сервера и виртуального сервера.

Если вы хотите отключить журнал доступа только для одного виртуального хоста, установите первый аргумент директивы CustomLog /dev/null:

Настройка журнала ошибок

Apache записывает сообщения об ошибках приложения и общих ошибках сервера в файл журнала ошибок. Если вы столкнулись с ошибками в вашем веб-приложении, журнал ошибок – это первое место, с которого можно начать устранение неполадок.

Директива ErrorLog определяет имя местоположение журнала ошибок. Он принимает следующую форму:

Если путь к log_file не является абсолютным, он устанавливается относительно ServerRoot. Сообщения об ошибках также могут передаваться в другую программу с использованием символа канала |.

Параметр LogLevel устанавливает уровень протоколирования. Ниже перечислены уровни их серьезности (от низкого до высокого):

Каждый уровень журнала включает в себя более высокие уровни. Например, если вы установите уровень журнала warn, Apache также пишет там сообщения error, crit, alert и emerg.

Если параметр LogLevel не указан, по умолчанию используется значение warn. Рекомендуется установить уровень как минимум crit.

Директива ErrorLogFormat определяет формат журнала ошибок. В большинстве дистрибутивов Linux сервер Apache использует формат по умолчанию, который является достаточным для большинства случаев.

Виртуальные хосты и глобальная регистрация

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

Затем директивы CustomLog или ErrorLog устанавливаются в контексте основного сервера, сервер записывает все сообщения журнала в один и тот же файл журнала доступа и журнала ошибок. В противном случае, если директивы находятся внутри блока <VirtualHost>, в указанный файл записываются только сообщения журнала для этого виртуального хоста.

Директива log, установленная в блоке <VirtualHost>, переопределяет директиву, заданную в контексте сервера.

Виртуальные хосты без директив CustomLog или ErrorLog получат свои сообщения журнала, записанные в журналы глобального сервера.

Для лучшей читаемости рекомендуется установить отдельные файлы журналов доступа и ошибок для каждого виртуального хоста. Вот пример:

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

Расположение файлов журнала

По умолчанию в дистрибутивах на основе Debian, таких как Ubuntu, журналы доступа и ошибок расположены в каталоге /var/log/apache2. На CentOS файлы журналов помещаются в каталог /var/log/httpd.

Чтение и понимание файлов журнала Apache

Файлы журнала можно открыть и проанализировать с помощью стандартных команд, таких как cat, less, grep, cut, awk, и так далее.

Вот пример записи из файла журнала доступа, который использует формат combine журнала в Debian :

Давайте разберемся, что означает каждое поле записи:

Используйте команду tail для просмотра файла журнала в режиме реального времени:

Вывод

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

Apache имеет очень настраиваемую систему ведения журналов, которая позволяет вам настраивать доступ и журналы ошибок в соответствии с вашими потребностями.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Вновь проверяем Apache HTTP Server

Проект Apache HTTP Server продолжает развиваться. Анализатор PVS-Studio не отстаёт и становится всё более мощным с каждой новой версией. Посмотрим, какие результаты покажет проверка на этот раз.

0427_Apache_HTTP_Recheck_ru/image1.png

Введение

Ранние версии проекта Apache HTTP Server проверялись с помощью Сoverity. В проверенной версии не было обнаружено следов проверки другими анализаторами. Качество кода проекта на высоком уровне. Несмотря на это, анализатор PVS-Studio смог обнаружить несколько интересных ошибок.

Проект уже проверялся в 2011 году. О найденных в то время ошибках можно прочитать в статье «Лев Толстой и статический анализ кода».

Для проверки использовался анализатор PVS-Studio версии 6.08.

Неправильная проверка, что строка пустая

V528 It is odd that pointer to ‘char’ type is compared with the ‘\0’ value. Probably meant: ** ctx->re_source == ‘\0’. util_expr_eval. c 199

При работе с указателями иногда возникает путаница между указателем и значениями, на которые он указывает. В примере видно, что при проверке третьего подвыражения в условии забыли разыменовать указатель. Разработчик предполагает, что он проверяет, является строка пустой или нет. Для этого нужно сравнить первый символ строки с терминальным нулём. Но на самом деле происходит сравнение указателя с нулевым символом. После исправления выражения становится очевидно, что код так же следует дополнить проверкой на существование указателя на строку.

Анализатор уже обнаруживал данную ошибку в проекте, о чём свидетельствует запись на странице с примерами ошибок, находимых диагностикой V528. Раз ошибка по-прежнему присутствует в проекте, о ней следует упомянуть вновь. Для исправления требуется изменить код следующим образом:

Инкрементирование указателя вместо значения

V532 Consider inspecting the statement of ‘*pointer++’ pattern. Probably meant: ‘(*pointer)++’. iconv_uc. c 114

В коде используется операция разыменования указателя. Полученное значение при этом не используется. Судя по коду функции, работать требовалось именно со значением указателя. А значит, для исправления ошибки надо повысить приоритет операции разыменования с помощью скобок: (*res) ++;

Неправильное затирание пароля

V597 The compiler could delete the ‘memset’ function call, which is used to flush ‘buf’ buffer. The RtlSecureZeroMemory() function should be used to erase the private data. passwd_common. c 165

Обязанность любой программы, работающей с конфиденциальными данными, затирать в памяти пароли и прочую важную информацию после завершения работы с ней. В этом фрагменте разработчики пытаются обнулить буфер, использовавшийся для хранения пароля. Выбранный ими способ должен был выполнить эту задачу. Однако для того, чтобы функция memset выполнила задачу правильно, буфер должен использоваться в последующем коде. Если же память заполняется нулями, а потом не используется, компилятор имеет право удалить функцию memset при построении кода. В результате информация, которая должна быть уничтожена, остаётся в памяти. Неизвестно, что будет с этим регионом памяти после, и куда попадёт эта неуничтоженная информация. Для очистки памяти надо использовать специализированные функции, такие как RtlSecureZeroMemory() или memset_s().

Хочется отметить, что это, пожалуй, самые серьезные из найденных дефектов для такого приложения как Apache HTTP Server!

Ещё несколько сообщений найденных этой диагностикой:

Неинициализированная переменная

V614 Potentially uninitialized pointer ‘wch’ used. start. c 58

Функция подготавливает информацию для конвертирования строки из Wide Unicode в UTF-8. Если переменная args содержит отрицательное значение, значит количество символов в строке неизвестно, и их требуется посчитать.

Позднее, на основе адреса последнего символа в строке, содержащегося в переменной wch, и адреса начала строки arrsz, вычисляется значение wsize. С помощью wsize создаётся буфер для новой строки. Переменная wch инициализируется внутри цикла, который начинает работу только если args содержит отрицательное значение. Если же в функцию поступит положительное значение, то инициализации переменой не произойдёт. Это приведёт к неопределённому поведению, так как размер буфера будет вычислен некорректно.

Подозрительное выражение

Очень подозрительное условие. Первое выражение в условии может быть ложным только в том случае, если произойдёт переполнение при сложении указателя с единицей. Если происходит переполнение указателя, то возникает неопределённое поведение, так что этот код в любом случае некорректен.

Неверная проверка HRESULT

V545 Such conditional expression of ‘if’ operator is incorrect for the HRESULT type value ‘SHGetMalloc(& pMalloc)’. The SUCCEEDED or FAILED macro should be used instead. apachemonitor. c 915

SHGetMalloc представляет из себя системную функцию и возвращает результат типа HRESULT. HRESULT 32-разрядное значение, логически состоящее из трёх полей. Его нельзя использовать как значение типа bool. Для обработки таких значений необходимо использовать макрос SUCCEEDED.

Лишняя операция?

V560 A part of conditional expression is always true: (rv == 0). config. c 2029

Анализатор усмотрел лишнюю проверку внутри условия. На первый взгляд это просто избыточный код. При подробном рассмотрении видно, что такое значение переменной rv не позволило бы дойти до входа в цикл. К тому же странно, зачем использовать значение переменной, оставшееся после выполнения предыдущих операций, если в теле цикла она больше негде не используется.

Логично предположить, что перед условием также надо было использовать функцию rv = apr_dir_open(. ); и тогда проверка результата rv обретает смысл. Конечно, могу ошибаться и это просто лишняя проверка, но на мой взгляд фрагмент кода обязательно надо проверить. Возможно, разработчики увидят, что в код цикла и обрабатываемых в нём операций действительно закралась ошибка и смогут вовремя её исправить.

Ещё несколько похожих ошибок:

Избыточное условие

V571 Recurring check. The ‘ldc->ChaseReferrals == 1’ condition was already verified in line 399. util_ldap. c 400

В этом примере приведено избыточное условие. Нет необходимости проверять одно и тоже выражение во внутреннем и внешнем условном операторе, так как условием входа во внутренний оператор, является прохождение проверок внешнего. В данном случае, весь код, заложенный внутри операторов, требует проверки всех выражений в обеих операторах if. Поэтому логичнее убрать внешний условный оператор. А для сохранения последовательности проверок предлагаю немного изменить выражение внутреннего условного оператора.

Неверная директива

V665 Possibly, the usage of ‘#pragma warning(default: X)’ is incorrect in this context. The ‘#pragma warning(push/pop)’ should be used instead. Check lines: 38, 40. apr_getpass. c 40

В приведённом фрагменте кода разработчики вместо возвращения директиве предыдущего значения используют значение по умолчанию для директивы. Это ошибочный подход. В таких случаях необходимо действовать иначе: запомнить предыдущее значение с помощью директивы #pragma warning(push), и вернуть его #pragma warning(pop). Исправленный код:

Заключение

Найденные недочёты показывают, что ошибки могут остаться даже в самых качественных и хорошо протестированных проектах. Статический анализ требует регулярного подхода. Одноразовой проверки недостаточно. Как бы ни был опытен программист, он все равно может допускать опечатки и иные ошибки. Анализатор PVS-Studio позволит выявить ошибки и подозрительные места раньше, чем они отразятся на итоговом релизе. Предлагаю скачать и попробовать анализатор PVS-Studio самостоятельно.

Источники:

https://losst. ru/pochemu-apache-ne-zapuskaetsya

https://andreyex. ru/linux/nastrojka-zhurnalov-oshibok-i-dostupa-apache/

https://pvs-studio. com/ru/b/0427/

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: