Загрузка данных


Ниже представлено решение на индивидуальное практическое задание по теме «Работа с сервером: чтение логов, диагностика и устранение типовых ошибок».

### Решение индивидуального задания

#### Часть 1. Чтение и базовый анализ логов веб-сервера (Apache)

**Сценарий:** Пользователь жалуется, что не может получить доступ к файлу `report.pdf` на сайте `www.example.com`. В браузере отображается ошибка "403 Forbidden".

**Задание:** Проанализировать фрагмент лога доступа (`access.log`) и определить причину проблемы.

**Фрагмент лога:**
```
192.168.1.50 - - [29/May/2026:11:20:01 +0300] "GET /downloads/report.pdf HTTP/1.1" 403 205 "-" "Mozilla/5.0"
192.168.1.50 - - [29/May/2026:11:20:05 +0300] "GET /index.html HTTP/1.1" 200 4523 "-" "Mozilla/5.0"
```

**Решение:**
1.  **Анализ строки запроса:**
    *   IP-адрес клиента: `192.168.1.50`.
    *   Время запроса: `[29/May/2026:11:20:01 +0300]`.
    *   Метод и ресурс: `"GET /downloads/report.pdf HTTP/1.1"` — клиент пытается получить файл `report.pdf` из каталога `/downloads/`.
    *   Код ответа сервера: `403`. Этот код означает "Forbidden" (Запрещено). Сервер понял запрос, но отказывается его выполнять. Это отличается от кода `404 Not Found`, который бы означал, что файла нет.
    *   Размер ответа: `205` байт. Для ошибки 403 это обычно размер страницы-заглушки, которую сервер отправляет клиенту.

2.  **Вывод:** Проблема заключается в правах доступа. Веб-сервер имеет права на чтение файла и каталога, в котором он находится, но не имеет прав на выполнение (поиска) для одного из родительских каталогов или самого каталога `/downloads/`. Без флага "execute" на каталоге сервер не может "зайти" в него, чтобы прочитать содержимое и отдать файл.

3.  **Устранение ошибки:**
    Необходимо проверить права доступа к каталогу `/downloads/` и всем его родителям. Права должны быть установлены как минимум на `r-x` (755), чтобы пользователь, от имени которого запущен веб-сервер (например, `www-data`), мог просматривать каталог и получать файлы из него.
    ```bash
    # Проверка текущих прав
    ls -ld /var/www/html/downloads/

    # Установка правильных прав (если веб-корень в /var/www/html)
    chmod 755 /var/www/html/downloads/
    ```

---

#### Часть 2. Диагностика системной ошибки (Service Failure)

**Сценарий:** Внутренний мониторинг сообщает, что сервис базы данных перестал отвечать. Служба `postgresql` неактивна.

**Задание:** Провести диагностику, используя системные логи, и предложить план действий.

**Решение:**
1.  **Проверка статуса службы:**
    Сначала необходимо убедиться в статусе сервиса с помощью команды `systemctl`.
    ```bash
    sudo systemctl status postgresql
    ```
    Предположим, команда вывела:
    > `Active: failed (Result: exit-code)`
    Это подтверждает, что служба завершилась с ошибкой при попытке запуска.

2.  **Чтение логов службы:**
    Для диагностики причины сбоя необходимо просмотреть журнал этой службы.
    ```bash
    sudo journalctl -u postgresql.service --since "today"
    ```
    В выводе журнала находим критическую ошибку:
    > `FATAL: could not create shared memory segment: Cannot allocate memory`
    > `DETAIL: Failed system call was shmget(key=..., size=..., 03600).`

3.  **Интерпретация ошибки:**
    Ошибка `Cannot allocate memory` указывает на нехватку оперативной памяти (RAM) на сервере. PostgreSQL не смог зарезервировать необходимый ей сегмент разделяемой памяти (*shared memory*) для своей работы.

4.  **План устранения:**
    *   **Краткосрочное решение (перезапуск):** Если проблема вызвана временным всплеском нагрузки, можно попытаться освободить память, перезапустив службу. Иногда после завершения других процессов система сможет выделить память.
        ```bash
        sudo systemctl restart postgresql
        ```
    *   **Долгосрочное решение (анализ и масштабирование):** Необходимо проанализировать потребление памяти на сервере (`free -h`, `top`).
        *   Если нагрузка легитимная и будет расти, требуется увеличить объем оперативной памяти на сервере.
        *   Можно оптимизировать конфигурацию самой СУБД (параметры `shared_buffers`, `work_mem` в файле `postgresql.conf`), чтобы она потребляла меньше ресурсов.
        *   Выяснить, какой другой процесс потребляет избыточное количество памяти, и принять меры.

---

#### Часть 3. Анализ логов приложения (PHP-FPM)

**Сценарий:** Пользователи периодически видят на сайте "белый экран смерти" (Blank Page) без каких-либо сообщений об ошибках.

**Задание:** Найти причину в логах PHP-FPM и исправить ее.

**Решение:**
1.  **Локализация лог-файлов:**
    Логи PHP-FPM обычно находятся в директории `/var/log/php-fpm/` или `/var/log/`. Определим точный путь, проверив пул в конфиге `/etc/php/*/fpm/pool.d/www.conf`. Ищем директиву `error_log`.

2.  **Анализ лога:**
    Открываем указанный лог-файл (например, `sudo tail -f /var/log/php7.4-fpm.log`) и видим повторяющиеся записи:
    > `[29-May-2026 11:25:10] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it`
    > `[29-May-2026 11:25:10] WARNING: [pool www] seem to be overloaded, launching 5 children...`

3.  **Интерпретация ошибки:**
    Эти сообщения говорят о том, что все рабочие процессы PHP-FPM (`children`) заняты обработкой входящих запросов. Новые запросы встают в очередь, а когда очередь переполняется, они просто отбрасываются. Клиент получает пустой ответ, так как его запрос даже не был обработан.

4.  **Устранение ошибки:**
    *   **Диагностика:** Нужно понять природу нагрузки. Это кратковременный пик (например, запуск тяжелого скрипта администратором) или постоянная высокая посещаемость?
    *   **Оптимизация конфигурации:** Отредактировать настройки пула в файле `/etc/php/*/fpm/pool.d/www.conf`.
        *   Увеличить значение `pm.max_children` (например, до 10 или 15), если у сервера достаточно оперативной памяти для этого.
        *   Изменить политику управления процессами (`pm = ondemand` или `dynamic`) и их лимиты (`pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers`), чтобы лучше соответствовать реальной нагрузке.
    *   **Оптимизация кода:** Если высокая нагрузка вызвана неэффективным скриптом, следует профилировать и оптимизировать его.
    После внесения изменений в конфиг необходимо перезапустить службу PHP-FPM:
    ```bash
    sudo systemctl restart php8.1-fpm
    ```