500 ошибка периодически: как локализовать
Сервер иногда отдаёт 500 — нагрузка, БД, плагины. Как найти причину через логи.
Симптом
- В браузере появляется страница с кодом 500 Internal Server Error.
- Сообщение может выглядеть как «Internal Server Error» или «Server Error».
- Ошибка возникает не постоянно, а только в определённый момент (например, после обновления, при пиковой нагрузке).
- В логах веб‑сервера (
error.log,access.log) виден статус 500. - В логах приложения (PHP‑error.log, Django‑log, Node‑error.log) появляется сообщение об исключении или ошибке выполнения.
- Иногда в логах сервера есть запись «timeout» или «connection refused».
Причина
- Перегрузка сервера – слишком много запросов, недостаточно ресурсов (CPU, RAM).
- Проблемы с базой данных – таймауты, deadlock, переполнение соединений.
- Ошибки в коде – необработанные исключения, неверные пути к файлам, неправильные настройки.
- Недостаток памяти – скрипт превышает лимит
memory_limit(PHP) илиmax_memory(Python). - Неправильные права доступа – скрипт не может открыть нужный файл/директорию.
- Проблемы с внешними сервисами – API‑запросы падают, таймауты.
- Конфигурационные ошибки – неверные директивы в
nginx.conf,httpd.conf,.htaccess.
Как проверить
| Шаг | Что сделать | Команда / пример |
|---|---|---|
| 1 | Проверить статус 500 в логах веб‑сервера | tail -n 200 /var/log/nginx/error.log |
| 2 | Найти причину в логах приложения | grep -i "error" /var/log/php-fpm/www-error.log |
| 3 | Проверить нагрузку на сервер | top -b -n 1 или htop |
| 4 | Проверить лимиты памяти и памяти процесса | ps aux | grep php |
| 5 | Проверить соединения к БД | mysqladmin processlist (MySQL) или pg_stat_activity (PostgreSQL) |
| 6 | Проверить таймауты в конфигурации | grep -i "timeout" /etc/php/7.4/fpm/php.ini |
| 7 | Проверить права доступа к файлам | ls -l /var/www/html/ |
| 8 | Проверить внешние сервисы | curl -I https://api.example.com/health |
| 9 | Включить режим отладки (если возможно) | export APP_DEBUG=1 (Laravel, Django и т.д.) |
Решение
1. Устранение перегрузки
- Увеличьте лимиты в конфигурации веб‑сервера:
worker_processes auto;
worker_connections 10240;
- Настройте кэширование:
location / {
proxy_cache my_cache;
proxy_pass http://backend;
}
- Добавьте балансировщик нагрузки (если есть несколько серверов).
2. Оптимизация работы с БД
- Увеличьте лимит соединений в настройках БД (
max_connections). - Проверьте индексы и план выполнения запросов (
EXPLAIN). - Включите логирование медленных запросов:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
- Проверьте наличие deadlock в логах.
3. Исправление кода
- Обработайте исключения:
try {
// код
} catch (Exception $e) {
error_log($e->getMessage());
http_response_code(500);
echo "Internal Server Error";
}
- Проверьте пути к файлам и права доступа:
chmod 644 /var/www/html/config.php
chown www-data:www-data /var/www/html
- Увеличьте лимит памяти (PHP):
memory_limit = 256M
4. Настройка таймаутов
- В
php.ini:
max_execution_time = 60
default_socket_timeout = 60
- В
nginx.conf:
proxy_read_timeout 120;
proxy_connect_timeout 60;
5. Проверка внешних сервисов
- Если ваш код зависит от внешнего API, добавьте retry‑логики и fallback‑механизм.
- Пример в Python:
import requests, time
def get_data(url, retries=3):
for i in range(retries):
try:
resp = requests.get(url, timeout=5)
resp.raise_for_status()
return resp.json()
except requests.RequestException:
time.sleep(2)
raise RuntimeError("API unavailable")
6. Перезапуск сервисов
После внесения изменений перезапустите веб‑сервер и PHP‑файпм:
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm
Связанные
SEO КП · нужна помощь?
Не хотите разбираться сами?
Запустите технический аудит сайта за 5 минут — получите PDF-отчёт с разбором всех 64 параметров и конкретными точками роста. Или закажите комплексное SEO-продвижение сайта — починим всё это и возьмём на себя дальнейшую оптимизацию.