#Симптом и границы применимости
Пользователь видит 403, 404, 500 или 502, но в выбранном access.log Apache нет записи. Это не обязательно ошибка журналирования: HTTP-ответ мог сформировать внешний Nginx, CDN, иной VirtualHost или модуль, а нужный CustomLog мог быть отключён или направлен в другой файл.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ответ создаёт первый проксиApache мог вообще не получать соединение. | В Apache нет совпадающей записи, в Nginx/CDN она есть | Проверить, какой процесс отвечает запросу |
| Журнал настроен для другого VirtualHostЖурналы могут быть индивидуальными для каждого домена. | Apache -S показывает другой vhost, CustomLog указывает иной путь | Найти active CustomLog и ErrorLog |
| Условное логирование или stdoutНекоторые запросы намеренно не записываются в стандартный файл. | CustomLog с env=… или pipe/stdout | Проверить фильтр и точку вывода |
#Пошаговая диагностика и исправление
- Сохраните точный момент и URLУточните домен, путь, метод и время запроса у пользователя; не собирайте пароль, cookie и токены. Снаружи выполните один безопасный запрос, зафиксируйте код, IP назначения и заголовки. Заголовок Server не является надёжным подтверждением того, кто создал ошибку.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаВыберите существующий безопасный URL без изменений данных; -v может показать сетевые сведения.
curl -Ivs https://example.com/test-asset.css
- Проверьте, куда смотрит DNS и кто держит внешний портУзнайте A и AAAA, а на сервере проверьте слушателей 80/443. Если Nginx слушает внешний порт, проверьте его журналы в первую очередь: некоторые 403 и 502 формируются до Apache.
- SSH Linux; только чтениеLinux · Терминал (Bash)КомандаНужен sudoSSH Linux; только чтение. CDN может завершать соединение вне сервера.
sudo ss -lntp | grep -E ":(80|443)[[:space:]]"
- Определите активный VirtualHostНа SSH-сервере, где Apache, выполните apache2ctl -S. По имени и IP:порту выберите нужный VirtualHost. Сопоставьте его ErrorLog и CustomLog. Не считайте /var/log/apache2/access.log единственным возможным журналом.Linux · Терминал (Bash)КомандаНужен sudoDebian пример; в других установках используйте apachectl -S.
sudo apache2ctl -S
- Найдите директивы журналированияПросмотрите CustomLog, TransferLog, ErrorLog, LogFormat и условные env= или expr= для нужного хоста. Относительный путь вычисляется относительно ServerRoot; pipe в CustomLog может перенаправлять данные в rotatelogs или другую службу.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoТолько чтение; у панели каталог может отличаться, записи могут относиться к нескольким хостам.
sudo grep -R -nE "CustomLog|TransferLog|ErrorLog|LogFormat" /etc/apache2/
- Сделайте один контрольный запрос и сопоставьте три журналаОткройте отдельные SSH-окна с tail -f нужного access.log и error.log, а также лога Nginx, если он есть. На клиенте запросите безопасный статический URL с уникальным параметром logcheck. Если запись есть в Nginx, но не Apache, выясните, не отдал ли файл сам Nginx.
- Клиентский терминал; безопасный GET/HEAD без персональных данныхLinux · Терминал (Bash)КомандаКлиентский терминал; безопасный GET/HEAD без персональных данных. Если файл отсутствует, используйте существующий.
curl -I "https://example.com/assets/test.css?logcheck=a1627"
- Проверяйте буферизацию и права логовЕсли CustomLog указан верно, посмотрите, не направлен ли он в stdout контейнера, системный журнал, rotatelogs и нет ли ошибок открытия файла. Не создавайте журнал с правами 777: запись журнала должна быть защищена.
- Debian с systemd; в контейнере смотреть штатный журнал контейнераLinux · Терминал (Bash)КомандаНужен sudoDebian с systemd; в контейнере смотреть штатный журнал контейнера.
sudo journalctl -u apache2 --since "30 minutes ago" --no-pager
- Исправьте только реальную настройкуПри неверном CustomLog сохраните копию VirtualHost, установите правильный управляемый журнал и ротацию, выполните apache2ctl -t и reload. Если ошибку формирует Nginx/CDN, исправляйте соответствующий слой; изменение Apache-журнала не устранит чужой 502.Linux · Терминал (Bash)С осторожностьюНужен sudoТолько если менялись системные конфиги Apache; отследите права и объём журналов.
sudo apache2ctl -t && sudo systemctl reload apache2Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Новый контрольный запрос появляется в ожидаемом access.log с корректным кодом и правильным VirtualHost; ошибка также локализована на конкретном слое. Приватные поля и токены не попадают в журнал.
#Если проблема не устранена
При полном отсутствии следа на origin проверьте CDN/балансировщик/DNS. Если события есть только в error_log, оцените стадию обработки запроса и условные правила CustomLog.