Ниже — список вопросов, которые можно часто услышать на собеседованиях веб-разработчика по темам Linux, Devops, CI/CD, SRE, Docker … В общем, все что не относится напрямую к кодингу, но то с тем часто имеют дело веб-разработчики ходже своей работы.

/**/


Основы Linux

Какие основные команды linux знаете ?

Вот таблица основных команд Linux, полезных для веб-разработчика:

Команда

Описание

Пример использования

ls

Вывод списка файлов и папок

ls -la /var/www/

cd

Переход в директорию

cd /var/www/project

pwd

Вывод пути текущей директории

pwd

mkdir

Создание директории

mkdir foldername

rm

Удаление файла

rm filename

rm -r

Удаление директории

rm -r foldername

cp

Копирование файла

cp src.txt dest.txt

mv

Перемещение/переименование файла

mv file.txt newfile.txt

cat

Вывод содержимого текстового файла

cat access.log

less

Постраничный вывод файла

less access.log

grep

Поиск текста в файле

grep "error" access.log

ps

Список процессов

ps aux

kill

Завершение процесса

kill 123

ping

Проверка доступности хоста

ping http://google.com

curl

Отправка HTTP запроса

curl http://example.com

wget

Скачивание файлов

wget file.zip

sudo

Выполнение команды от суперпользователя

sudo service nginx restart

man

Справочная informация по команде

man ls

uname

Информация о системе

uname -a

df

Проверка использования диска

df -h

du

Проверка использования пространства

du -sh folder

Какими командами можно прочитать лог-файл в Linux ?

В Linux есть несколько основных команд для чтения и анализа лог-файлов:

  • cat — выводит содержимое лог-файла целиком:

cat /var/log/nginx/access.log
  • less — постраничный просмотр файла с возможностью поиска:

less /var/log/syslog
  • tail — выводит последние строки файла (по умолчанию 10 строк):

tail /var/log/dmesg.log
  • head — выводит первые строки файла:

head /var/log/messages
  • grep — поиск строки в файле:

grep "error" /var/log/apache2/error.log
  • awk — выборка строк по шаблону:

awk '/REGEX/' /var/log/nginx/access.log
  • zgrep — поиск в сжатых лог-файлах gzip:

zgrep "warning" /var/log/syslog.gz

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


Как в bash прочитать 2 лог-файла одновременно, за определенный день и только ошибки ?

Чтобы прочитать 2 лог-файла одновременно, отфильтровав по дате и ошибкам, можно воспользоваться конвейером команд в bash:

cat access.log error.log | grep 2019-08-17 | grep -i error

Разберём:

  • cat access.log error.log — объединяет содержимое двух лог-файлов

  • | — передаёт вывод в следующую команду

  • grep 2019-08-17 — выбирает только строки за 17 августа 2019 года

  • grep -i error — ищет строки со словом «error» без учёта регистра

Таким образом, эта команда выведет все строки из двух лог-файлов, содержащие ошибки за указанную дату.

Для более сложных случаев можно использовать регулярные выражения в grep или привлечь утилиты вроде awk, sed для фильтрации данных из логов.


Что такое load average ?

Load average (средняя загрузка системы) — это показатель, отражающий среднюю загрузку процессора сервера за определённый период времени.

Он рассчитывается Linux на основании числа активных процессов, ожидающих выполнения в очереди процессора.

Load average имеет три значения:

  • За последнюю минуту

  • За последние 5 минут

  • За последние 15 минут

Эти значения показывают краткосрочную, среднесрочную и долгосрочную загрузку системы.

Load average отражает, сколько в среднем процессов находилось в состоянии ожидания выполнения в каждый момент времени.

Оптимальное значение load average зависит от числа CPUs на сервере. Например, для 8 CPUs рекомендуемый диапазон 0.7 — 7.0.

Мониторинг load average важен для определения пиковых нагрузок и правильного масштабирования серверов.

Пример

Допустим, у нас сервер с 4 ядрами CPU. Команда uptime выводит следующие значения load average:

0.50 0.38 0.44

Это означает:

  • За последнюю минуту в среднем было 0.50 процессов в состоянии ожидания выполнения.

  • За последние 5 минут в среднем было 0.38 процессов в ожидании.

  • За последние 15 минут в среднем было 0.44 процессов в ожидании.

Так как у нас 4 CPU, оптимальный load average для этого сервера должен быть в диапазоне 0.7 — 4.0.

Текущие показатели говорят о том, что сервер не перегружен и справляется с текущей нагрузкой.

Если бы значения load average были выше 4, это signalillo бы о высокой загрузке сервера и требовало бы его масштабирования или оптимизации приложения.

Таким образом, анализируя load average, можно определить текущую загрузку сервера относительно его аппаратных возможностей.


Как выйти из редактора vim ?

Для выхода из редактора vim существует несколько вариантов:

  • Нажмите клавиши Esc для перехода в нормальный режим, затем введите команду :q и нажмите Enter. Если документ был изменён, Vim запросит подтверждение :q! для принудительного выхода без сохранения.

  • Для сохранения и выхода нажмите Esc, введите :wq и Enter.

  • Чтобы сохранить файл под другим именем и выйти: Esc, :w newname.txt и Enter.

  • Для выхода без сохранения изменений: Esc и :q!.

  • Нажмите сочетание клавиш Shift+ZZ — сохранит и выйдет из редактора.

  • В режиме командной строки без открытого файла: просто нажмите Ctrl+C.

  • В некоторых окружениях можно закрыть терминал, Vim автоматически выйдет.

Vim — мощный редактор с множеством команд. Выход осуществляется через нормальный режим и команды :q или :wq. При возникновении проблем можно использовать принудительный выход :q!.


Что означают цифры в правах на файл unix? Например, что будет означать число 644 ?

В Unix права доступа к файлам задаются при помощи трёх чисел:

  1. Права владельца файла

  2. Права группы, к которой принадлежит файл

  3. Права всех остальных пользователей

Каждое число представляет собой сумму следующих прав доступа:

  • 4 — чтение (r)

  • 2 — запись (w)

  • 1 — выполнение (x)

Например:

644 
~
-rw-r--r--

Здесь:

  • Владелец имеет права rw- (4 + 2 = 6)

  • Группа имеет права r— (4)

  • Другие пользователи имеют права r— (4)

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


Чем отличаются потоки от процессов?

Кратко: Процесс является основной единицей распределения ресурсов операционной системы, а поток является основной единицей планирования и выполнения задач процессора. Процесс состоит как минимум из одного потока, все потоки используют ресурсы процесса.

Потоки (threads) отличаются от процессов в ОС следующим образом:

  • Потоки расшаривают память и ресурсы процесса, в котором запущены, а процессы — нет.

  • Переключение между потоками происходит быстрее, чем между процессами.

  • В одном процессе может быть несколько потоков. Процесс содержит как минимум один поток.

  • Потоки одного процесса выполняются параллельно. Процессы выполняются независимо.

  • Если падает один поток — остальные продолжают работу. Если падает процесс — все его потоки останавливаются.

  • Потоки эффективнее процессов при частом обмене данными. Процессы лучше изолируют задачи друг от друга.

  • Создание потока занимает меньше ресурсов ОС, чем создание процесса.

Таким образом, потоки — это «легковесные» процессы внутри общего пространства одного процесса.


Какой командой можно убить процесс в unix?

Чтобы «убить» (принудительно завершить) процесс в Unix системах, используется команда kill.

Базовый синтаксис:

kill [сигнал] [PID]

Где:

  • сигнал — номер сигнала, который будет послан процессу. По умолчанию SIGTERM (15) — стандартный сигнал завершения.

  • PID — идентификатор процесса (Process ID).

Например, чтобы «убить» процесс с PID 1234, нужно выполнить:

kill 1234

или эквивалентно:

kill -15 1234

Если процесс не завершается от SIGTERM, можно послать SIGKILL (9) — безусловное немедленное завершение:

kill -9 1234

Таким образом команда kill позволяет принудительно остановить выполнение процесса по его PID.


Docker

Что такое Docker ? Зачем он нужен ?

Docker — это платформа для разработки, развертывания и запуска приложений в изолированных контейнерах.

Основные преимущества Docker:

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

  • Переносимость. Контейнеры можно запускать на любой ОС без изменения самого приложения.

  • Масштабируемость. Добавление новых экземпляров контейнера занимает считанные секунды.

  • Легковесность контейнеров по сравнению с виртуальными машинами.

  • Возможность создавать автоматизированные CI/CD пайплайны.

  • Быстрое восстановление после сбоев. Приложение в контейнере можно перезапустить очень быстро.

  • Рациональное использование ресурсов благодаря изоляции процессов.

Docker позволяет разрабатывать, тестировать и разворачивать приложения гораздо быстрее и проще, решая многие проблемы портирования приложений между разными средами. Поэтому Docker стал настолько популярен в последние годы.


Чем отличается docker от виртуализации?

Docker отличается от полноценной виртуализации следующими аспектами:

  • Docker использует контейнеризацию на уровне ОС, а виртуализация — виртуальные машины на уровне железа.

  • Контейнеры Docker работают поверх ядра хостовой ОС, а ВМ эмулируют отдельное железо и ядро.

  • Контейнеры более легковесны и быстрее запускаются, так как не эмулируют оборудование.

  • Контейнеры изолируют процессы, а ВМ изолируют целые ОС.

  • Образ Docker содержит только приложение и зависимости, а ВМ — полную ОС.

  • Контейнеры Docker менее требовательны к ресурсам хоста.

  • Масштабирование контейнеров проще и быстрее, чем ВМ.

  • Переносимость образов Docker выше, чем ВМ из-за отсутствия зависимости от железа.

Таким образом, Docker позволяет разворачивать приложения изолированно и быстро, но с меньшей изоляцией, чем полноценные ВМ.


В чем отличие docker от docker-compose ?

Docker и docker-compose — это разные инструменты в экосистеме Docker, которые используются для слегка разных целей:

Docker — это технология, которая позволяет запускать приложения в изолированных контейнерах. Основные компоненты Docker:

  • Docker engine — демон, который создает и запускает контейнеры

  • Docker image — «образ» контейнера с предустановленным ПО

  • Dockerfile — файл для создания image

  • Docker Registry — хранилище образов (например, Docker Hub)

Docker Compose — это инструмент для определения и запуска много-контейнерных приложений.

Основные возможности:

  • Описание приложения в файле docker-compose.yml

  • Автоматический запуск нескольких контейнеров через одну команду

  • Настройка сетей и подключения контейнеров

  • Переиспользование кода для развертывания на разных окружениях

  • Управление всем приложением как единым целым

Таким образом, Docker — это базовая технология, а Docker Compose позволяет собирать на ее основе более сложные многокомпонентные приложения.


Какие виды сетей могут быть между контейнерами в docker-compose ?

Docker Compose позволяет настроить несколько типов сетей для взаимодействия между контейнерами:

  • По умолчанию используется сеть типа bridge. Контейнеры в этой сети изолированы, но могут общаться по именам контейнеров.

  • Сеть типа host. Контейнеры подключаются к сети хоста и используют его IP и порты.

  • Пользовательские сети типа bridge. Позволяют изолировать контейнеры от других сетей, настраивать подсети.

  • Overlay сети. Используются в кластерах Docker, позволяют контейнерам на разных хостах общаться по именам.

  • Macvlan сети. Назначают контейнерам физические MAC-адреса для подключения к сети хоста на уровне 2 модели OSI.

Пример различных сетей в docker-compose:

networks:
  frontend:
  backend:

services:
  frontend:
    networks:
     - frontend

  db:
    networks: 
     - backend

Здесь контейнеры frontend и db подключены к разным bridge сетям.

Таким образом, Docker Compose предоставляет гибкие возможности для настройки сетевого взаимодействия между контейнерами.


Как делается масштабирование в Docker?

В Docker можно легко масштабировать приложения за счет горизонтального масштабирования контейнеров. Основные способы:

  • Docker compose. В файл docker-compose.yml можно указать необходимое количество реплик сервиса:

version: '3'
services:
  web:
    image: nginx
    deploy:
      replicas: 5

Это запустит 5 копий контейнера nginx.

  • Docker Swarm — для оркестрации кластеров Docker. Позволяет легко масштабировать сервисы в кластере командой:

docker service scale web=5
  • Контейнеры можно запускать в любом оркестраторе Kubernetes, который автоматически распределяет нагрузку и масштабирует число реплик.

  • Использование сервисов автомасштабирования, например AWS Auto Scaling Groups.

  • Мониторинг нагрузки и запуск дополнительных контейнеров скриптами или API.

Таким образом Docker позволяет легко и гибко масштабировать приложения путем горизонтального масштабирования контейнеров.


Что такое файл конфигурации yaml в Docker ? Приведи пример. Писал ли сам конфигурации yaml ?

YAML (YAML Ain’t Markup Language) — это формат конфигурационных файлов, часто используемый в Docker. Файлы YAML используются в Docker для описания различных параметров, например:

  • Описание Docker образов (Dockerfile)

  • Описание сервисов и их параметров (docker-compose.yml)

  • Параметры стека приложений (stack.yml)

Пример файла docker-compose.yml:

yamlCopy codeversion: "3.7"

services:

  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password

  web:
    image: nginx
    ports:
      - "8080:80"
    depends_on:
      - db

volumes:
  db-data:

Здесь описаны два сервиса — база данных Postgres и web-сервер Nginx. Указаны параметры запуска каждого контейнера, зависимости между ними.

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


Как расшарить порты в докере ?

Чтобы расшарить порты между хостом и контейнером в Docker, используется опция -p или —publish при запуске контейнера.

Например, чтобы сделать доступным порт 80 контейнера по адресу 0.0.0.0:8080 хоста, нужно запустить контейнер так:

docker run -p 8080:80 image

Здесь 8080 — порт хоста, 80 — порт контейнера.

Также можно указать диапазон портов:

docker run -p 3000-3005:8000-8005 image

Это отобразит порты с 3000 по 3005 хоста на порты 8000-8005 контейнера.

В docker-compose файле настройка портов выглядит так:

ports:
  - "8080:80"
  - "3000-3005:8000-8005"

Кроме того, можно расшарить все порты контейнера командой:

Copy codedocker run -P image

Таким образом docker позволяет гибко настраивать видимость портов контейнеров на хосте.

Чтобы расшарить порыт между контейнерами:

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

expose работает следующим образом:

  • Открывает порт для входящего трафика в контейнере. Если порт не открыт приложением в контейнере, expose не будет работать.

  • Добавляет запись о порте в метаданные Docker image. Это нужно для документирования того, какие порты используются.

  • Позволяет связывать контейнеры в одной сети по известным портам. Например, в docker-compose контейнеры могут общаться по именам и портам.

Однако expose не публикует порт на хост-машине. Для публикации порта при запуске контейнера нужно использовать опцию -p или -P.

Пример использования в Dockerfile:

EXPOSE 8080

Это сообщит, что контейнер ожидает трафик на порту 8080.

Таким образом, docker expose — утилита для документирования и связывания контейнеров, а не для публикации портов.


Composer

Чем отличаются composer.json от composer.lock

composer.json и composer.lock — это два различных файла, используемых в процессе работы с Composer, инструментом для управления зависимостями в PHP.

composer.json — это файл, в котором определяются зависимости проекта, а также указывается информация о проекте, такая как его имя, версия, автор и другие метаданные. В composer.json также определяются настройки проекта, такие как автозагрузка классов и скрипты, которые должны выполняться при установке или обновлении пакетов. Этот файл обычно хранится в корневой директории проекта.

composer.lock — это файл, создаваемый Composer после установки или обновления пакетов. Он содержит информацию о точных версиях пакетов и их зависимостях, которые были установлены в проекте. Этот файл используется для обеспечения воспроизводимости установленных зависимостей. В composer.lock также указываются хеши файлов пакетов, что позволяет Composer проверять целостность пакетов при установке или обновлении. Этот файл обычно хранится вместе с composer.json в корневой директории проекта и должен быть добавлен в систему контроля версий.

В целом, composer.json используется для определения зависимостей и настроек проекта, в то время как composer.lock используется для фиксации конкретных версий зависимостей и обеспечения их воспроизводимости при установке или обновлении пакетов.


CI / CD

Что такое GitLab ? зачем он нужен ?

GitLab — это программное решение для работы с репозиториями Git, которое позволяет хранить код проектов, отслеживать изменения, управлять версиями, а также автоматизировать процесс разработки ПО.

Основные возможности GitLab:

  • Работа с репозиториями Git — создание, клонирование, ветвление, слияние веток, управление коммитами.

  • Отслеживание изменений в коде, просмотр истории коммитов.

  • Контроль версий и релизов ПО.

  • Управление правами доступа к репозиториям и проектам.

  • Интегрированная система для автоматизации сборки, тестирования и развертывания ПО (CI/CD).

  • Встроенный wiki, issue-трекер, календарь задач.

  • Визуализация рабочих процессов.

  • Интеграция с другими системами через API.

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


Что такое CI / CD ? Писал ли сам / настраивал ?

CI/CD (непрерывная интеграция / непрерывная доставка) — это набор практик для автоматизации процессов сборки, тестирования и доставки ПО.

  • CI подразумевает автоматическую сборку и тестирование кода каждый раз при изменении кода в репозитории.

  • CD означает автоматическое развертывание кода на тестовых/продуктивных серверах после успешного прохождения CI.

Настройка CI/CD включает следующие шаги:

  1. Выбрать провайдера CI/CD (Jenkins, GitLab CI, CircleCI и др.)

  2. Описать процесс сборки и тестирования в конфигурационных файлах.

  3. Определить триггеры запуска pipelines (например, при коммите в git).

  4. Настроить доставку кода на серверы: скрипты развертывания, Ansible и т.д.

  5. Настроить мониторинг и уведомления о результатах выполнения pipelines.

  6. Определить стратегию развертывания: канарийное, синий/зеленый и т.д.

  7. Внедрять CI/CD постепенно, начиная с небольших частей проекта.

Грамотное внедрение CI/CD позволяет ускорить и автоматизировать процесс доставки кода в продакшен.


Что такое pipeline в CI CD ?

Pipeline в CI/CD — это последовательность этапов (jobs) автоматизированной сборки, тестирования и развертывания кода.

Основные этапы pipeline:

  • Checkout кода из репозитория

  • Сборка приложения

  • Автоматическое тестирование кода (unit, integration, e2e)

  • Сканирование уязвимостей

  • Развертывание на тестовом окружении

  • Автоматическое тестирование на стенде

  • Развертывание на продакшене

  • Уведомления о результатах

Pipeline запускается при определенных событиях, например при коммите в репозиторий.

Преимущества pipeline:

  • Автоматизация рутинных задач

  • Стандартизация и унификация процессов

  • Частая интеграция и доставка изменений

  • Быстрое получение обратной связи

  • Соблюдение качества, минимизация ошибок

В целом pipeline в CI/CD позволяет автоматизировать процесс создания, тестирования и доставки ПО.


Что такое GITLAB CI , Github Travis ? Был ли опыт работы с ними?

GitLab CI и Travis CI — это системы непрерывной интеграции (CI), которые позволяют автоматизировать сборку, тестирование и развертывание приложений.

GitLab CI — это встроенное решение для CI/CD в GitLab. Оно позволяет запускать pipelines для проектов в GitLab при каждом коммите в репозиторий. Конфигурация pipeline описывается в файле .gitlab-ci.yml в корне репозитория.

Основные возможности GitLab CI:

  • Автоматическая сборка, тестирование, деплой кода

  • Отслеживание статусов pipeline

  • Масштабируемость за счет встроенных или внешних runners

  • Кэширование для ускорения сборки

  • Уведомления разработчиков о результатах

Travis CI — популярное решение CI, которое интегрируется с GitHub. Конфигурация описывается в файле .travis.yml.

Основные возможности Travis CI:

  • Поддержка множества языков программирования

  • Интеграция с GitHub

  • Параллельные задачи в pipeline

  • Кэширование

  • Масштабируемость за счет инфраструктуры Travis

  • Уведомления и виджеты статусов сборки

Таким образом эти системы позволяют настроить непрерывную интеграцию для проектов и автоматизировать рутинные задачи.


Перечисли основные виды линтеров, используемых для разработки веб-приложений на php. Какие линтеры знаешь/используешь ?

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

  • PHP линтеры — проверяют синтаксис и стиль PHP кода, например PHP_CodeSniffer, PHP Mess Detector, PHPStan, PHPLintm Psalm.

  • JavaScript линтеры — например, ESLint, JSHint — для проверки JavaScript кода.

  • CSS линтеры — проверка CSS кода на ошибки и соответствие стандартам — Stylelint, CSS Lint.

  • HTML линтеры — например, HTMLHint — проверка разметки на валидность.

  • Линтеры шаблонов — для шаблонов Twig, Blade и др. — проверка синтаксиса и ошибок в шаблонах.

  • SQL линтеры — проверка синтаксиса и стиля SQL запросов — sqlint, SQLFluff.

  • Регулярных выражений — проверка регэкспов на валидность и отсутствие уязвимостей — RegExpLint.

  • Линтеры в IDE — встроенные в редакторы кода проверки, например линтеры в PHPStorm, VS Code.

  • Универсальные линтеры — проверка разных типов файлов проекта — Lintit, Corrette.

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


Зачем нужен PhpStan ? Что он проверяет?

PhpStan — это статический анализатор кода для PHP. Он позволяет находить ошибки и неоптимальные решения в коде без его выполнения.

Основные возможности PhpStan:

  • Проверка типов — обнаружение несоответствия передаваемых в функции типов.

  • Проверка возможных ошибок — обращение к несуществующим методам, переменным и т.д.

  • Обнаружение неиспользуемого кода.

  • Проверка совместимости кода с версиями PHP.

  • Проверка SQL-запросов на уязвимости.

  • Проверка правильности работы сREGEX и форматов данных.

  • Проверка логики кода — возможных логических ошибок.

  • Выявление дублирования и неоптимального кода.

  • Интеграция в CI/CD для автоматической проверки кода.

PhpStan позволяет на ранних этапах находить проблемы в коде и повышать его качество и надежность, не дожидаясь выполнения приложения.


Что такое Vagrant ? Есть опыт применения?

Vagrant — это инструмент для создания и управления виртуальными машинами.

Основные возможности Vagrant:

  • Позволяет автоматизировать процесс создания и настройки виртуальных машин на основе готовых box-образов (шаблонов ВМ).

  • Использует провайдеры виртуализации как backend — VirtualBox, VMware, AWS и другие.

  • Конфигурация окружения описывается в Vagrantfile на языке Ruby.

  • Поддерживает общие папки и сеть между хостом и гостевой ВМ.

  • Есть возможность провиженинга — автоматической настройки ПО и системных параметров внутри ВМ.

  • Позволяет создавать переносимые окружения разработки приложений.

  • Упрощает совместную работу над проектами в одинаковых окружениях.

Vagrant используется для автоматизации развертывания dev-окружений, тестирования, создания демонстраций и прототипов. Упрощает onboarding новых разработчиков в проект.


SRE

Что стоит делать разработчику, если упал сайт (какие шаги предпринимать в первую очередь) ?

Если «упал» сайт, разработчику в первую очередь стоит:

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

  • Проверить работу сервера — запущен ли веб-сервер, не вышел ли из строя. Подключиться по SSH и проверить логи на наличие критических ошибок.

  • Если сервер работает, то проверить базу данных — запущена ли она, нет ли в логах ошибок подключения или запросов к БД.

  • Посмотреть в логах веб-приложения на наличие критических ошибок, приводящих к отказу в обслуживании.

  • Посмотреть проблемы с сервером: не переполнен ли диск сервера: команда du в linux, не перегружен ли процессор: команда htop, оценить load average сервера

  • Попробовать перезапустить веб-сервер и/или приложение.

  • Если перезапуск не помог — откатить последние изменения кода приложения, вернув предыдущую рабочую версию из системы контроля версий.

  • Сообщить о проблеме другим членам команды. Проанализировать с ними возможные причины и способы устранения.

  • После восстановления работы — разобраться в корне причины инцидента, чтобы избежать его повторения.


Что делать разработчику, если тормозит сайт?

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

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

  • Проверить загрузку ЦП и памяти сервера, возможно приложение использует слишком много ресурсов.

  • Если есть очереди/worklist — посмотреть на рост невыполненных задач, возможно есть утечка.

  • Проверить работу базы данных, запущен ли оптимизатор запросов, нет ли длительных блокировок.

  • Можно подумать о том, чтобы добавить пагинацию в чтении данных (получение данных порциями)

  • Проанализировать запросы в логе БД, проверить их запуск через EXPLAIN <sql_query>

  • Включить логирование времени выполнения запросов, найти узкие места.

  • Проверить работу кэша, размер свободной памяти.

  • Добавить кэширование результатов запросов (там, где это приемлемо и желательно)

  • Проверить индексы в БД, добавить недостающие, оптимизировать неэффективные запросы.

  • Настроить пулы подключений, ограничить количество одновременных запросов к БД.

  • Настроить балансировку нагрузки, добавить ресурсы (CPU, RAM, IOPS диска).

  • Перевести приложение в режим только чтения, если проблема в записи данных.

  • В критическом случае — перевести приложение в режим техобслуживания.

Главное — найти и устранить узкое место, оптимизировать запросы, скрипты, добавить ресурсы.


Перечисли основные профилировщики кода php. Какие знаешь/использовал ?

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

  • Xdebug — популярный отладчик и профайлер для PHP. Позволяет собирать подробную статистику по времени выполнения скриптов, функций, запросов.

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

  • Tideways — профайлер, оптимизированный для анализа приложений на базе фреймворков. Есть интеграция с Laravel, Symfony.

  • XHProf — иерархический профайлер, встроенный в PHP 7, отличается низким оверхедом.

  • PHP DebugBar — отображает debug-информацию и профилирование запросов в браузере.

  • Sysdig Inspect — профилирование производительности PHP в контейнерах и Kubernetes.

  • PHPBench — микро-бенчмаркинг PHP кода и сравнение производительности.

  • Uber Engineering’s php-profiler — профайлер от Uber с фокусом на асинхронные приложения.

Инструменты помогают найти «узкие места» кода и оптимизировать производительность PHP приложений. Наиболее популярны Xdebug, Blackfire и Tideways.


Для чего нужен XDebug ? Как происходит работа с ним по шагам? Есть ли опыт работы с ним ?

Xdebug — это отладчик и профайлер для PHP, который используется для:

  • Отладки приложения по шагам (step debugging)

  • Профилирования скриптов

  • Трассировки вызовов функций (function traces)

Работа с Xdebug обычно происходит в несколько шагов:

  1. Установка расширения Xdebug в PHP (модуль php-xdebug).

  2. Настройка php.ini — включение xdebug, настройка режимов отладки/профилирования.

  3. Установка плагина отладчика в IDE (PHPStorm, NetBeans, VSCode).

  4. Установка точек останова (breakpoints) в коде через IDE.

  5. Запуск скрипта в режиме отладки из IDE — скрипт будет останавливаться на точках останова.

  6. Пошаговая отладка — просмотр переменных, вызов стэк функций и т.д.

  7. Сбор профилировщика выполнения скрипта по времени, памяти и т.д.

  8. Анализ результатов профилирования для оптимизации кода.

Xdebug — мощный инструмент для анализа производительности и корректности PHP приложений.


Очереди сообщений

Перечисли основные брокеры сообщений в веб-приложениях. Какие брокеры сообщений знаешь/использовал ?

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

  • RabbitMQ — популярный open source брокер на базе протокола AMQP.

  • Apache Kafka — брокер для реализации распределенных пайплайнов и стриминга данных.

  • Amazon SQS — полностью управляемый брокер сообщений от AWS.

  • Redis — кэш и брокер сообщений в одном флаконе. Поддерживает Pub/Sub.

  • ZeroMQ — брокер с открытым кодом, поддерживает множество языков и протоколов.

  • ActiveMQ — реализация брокера от Apache Software Foundation на базе JMS.

  • RabbitMQ — брокер от CloudAMQP с управляемым хостингом RabbitMQ.

  • Amazon SNS — сервис для рассылки уведомлений и push-сообщений.

  • Beanstalkd — простой и легковесный брокер сообщений.

  • NSQ — брокер от Bitly с фокусом на производительность и устойчивость.

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


Для чего можно использовать очереди задач RabbitMQ в веб-приложениях на php ? Есть ли опыт использования (какой)?

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

  • Откладывание долгих фоновых задач, чтобы не загружать HTTP-потоки — например, обработка изображений, видео, отчетов.

  • Распределенные вычисления и параллельная обработка задач — например, транскодирование видео на нескольких серверах.

  • Разделение приложения на сервисы с асинхронным взаимодействием через очереди. Например, веб-сервер + обработчик файлов + API + push уведомления.

  • Балансировка нагрузки задач между node-ами приложения за счет очереди.

  • Отложенная отправка email и уведомлений пользователям после каких-либо событий.

  • Логирование и сбор метрик работы приложения асинхронно.

  • Транзакционная обработка данных между сервисами.

  • Построение очередей заданий для обработки пользовательскими запросами.

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


Что сделать , чтобы очередь RabbitMQ не останавливалась, если какая-то задача в ней зависла?

Чтобы очередь задач в RabbitMQ не останавливалась из-за зависания отдельных задач, можно использовать следующие подходы:

  1. Включить автоматическое подтверждение получения сообщения (auto ack). Тогда после получения задача будет удалена из очереди независимо от результата обработки.

  2. Добавить таймаут получения сообщения (consumer timeout). Если задача не обрабатывается за отведенное время, она будет возвращена в очередь.

  3. Использовать ограничение видимости сообщения (TTL). Если задача не обработана за это время, она станет доступна другим потребителям.

  4. Настроить максимальное количество попыток обработки задачи, после которых она помещается в отдельную очередь неудавшихся задач для последующего анализа.

  5. Реализовать паттерн «Мертвое письмо» — после максимального числа попыток задача удаляется или отправляется в очередь необрабатываемых задач.

  6. Масштабировать число потребителей задач, чтобы проблемная задача попала другому worker-у.

Главное — обрабатывать ошибки и не допускать застревания задач в очереди.


Для чего нужен Producer в RabbitMQ ?

Producer в RabbitMQ выполняет следующие функции:

  • Отправляет сообщения в очередь. Producer создает сообщение и помещает его в очередь RabbitMQ.

  • Не блокируется при отправке сообщений. Producer просто передает сообщение в очередь и сразу получает подтверждение от RabbitMQ.

  • Может настраивать свойства сообщения — приоритет, время жизни, отложенная отправка.

  • Может создавать разные exchange для маршрутизации сообщений.

  • Масштабируется за счет добавления новых producer.

  • Может буферизовать сообщения локально, если очередь временно недоступна.

  • Гарантирует доставку сообщений даже при временных сбоях.

  • Позволяет отслеживать статусы доставки с помощью подтверждений и коллбэков.

Таким образом, Producer отвечает за надежную асинхронную отправку сообщений в очереди RabbitMQ, абстрагируя логику приложения от работы с очередью.


Для чего в веб-приложениях используются Redis и Memcache?

Redis и Memcache — популярные кеши и хранилища данных, которые используются в веб-приложениях для следующих целей:

  • Кеширование данных — хранение часто используемых данных в быстрой памяти, чтобы разгрузить базу данных. Например, кеширование результатов запросов, объектов, фрагментов страниц.

  • Хранение сессий пользователей вместо файлов или базы данных.

  • Буферизация очередей и задач перед обработкой. Например, очередь фоновых задач.

  • Реализация блокировок и взаимоисключений при параллельном доступе к ресурсам.

  • Сбор статистики и метрик работы приложения.

  • Реализация списков активности пользователей в реальном времени.

  • Хранение неструктурированных данных, например результатов веб-скрапинга.

  • Транзакционная обработка данных между сервисами.

  • Межсервисное кэширование данных.

Redis и Memcache позволяют оптимизировать производительность, масштабируемость и доступность веб-приложений.


Инструменты для поиска

Для чего используется ElasticSearch ?

(звезда) подсказка: для агрегирующие запросов

ElasticSearch — это популярная система для поиска и анализа данных на основе Lucene. Основные задачи, которые решает ElasticSearch:

  • Поиск данных — быстрый и точный поиск по тексту, фильтрация, выделение результатов. Может использоваться как поисковая система сайта.

  • Хранение структурированных и неструктурированных данных — документов, объектов, логов. Является распределенной NoSQL базой данных.

  • Агрегации и аналитика — построение аналитических отчетов, дашбордов, статистики в реальном времени по хранимым данным.

  • Обработка больших объемов данных — горизонтальное масштабирование кластера ElasticSearch позволяет хранить и обрабатывать большие данные.

  • Интеграция данных из разных источников — импорт данных через API из БД, файлов, облака.

  • Мониторинг приложений и систем с сбором логов в ElasticSearch.

  • Построение маппингов и геопространственный поиск данных.

ElasticSearch активно применяется для поиска, мониторинга, анализа данных во многих веб-приложениях и сервисах.


Расскажи про популярные инструменты поиска: ClickHouse, ElasticSearch, Sphinx. Использовал ли их в работе?

ClickHouse, Elasticsearch и Sphinx — это инструменты для работы с данными, которые имеют разные области применения:

  • ClickHouse — это СУБД для хранения и обработки больших объемов данных. Отличается высокой скоростью агрегаций на основе колоночного хранения данных. Используется для аналитики и BI. Нет полнотекстового поиска.

  • ElasticSearch (ES) — поисковая система на основе Lucene. Предназначена для полнотекстового поиска и хранения полуструктурированных данных. Может масштабироваться на большие объемы данных. Имеет развитые возможности по аналитике и агрегации данных.

  • Sphinx — высокопроизводительная система для полнотекстового поиска. Может работать со структурированными и неструктурированным данными. Отличается высокой скоростью индексирования и поисковых запросов. Имеет ограниченные возможности хранения и анализа данных.

Ключевые различия:

  • ClickHouse ориентирован на аналитику структурированных данных, Sphinx и ES — на поиск текста.

  • ES более универсален, Sphinx — выше по скорости поиска.

  • ClickHouse и ES масштабируются горизонтально, Sphinx — только вертикально.

Выбор зависит от задач — поиск, хранение, аналитика и объемы данных.


Что такое ситуационный (фасетный) поиск ?

Ситуационный или фасетный поиск (faceted search) — это тип поиска, который позволяет уточнять запросы пользователя за счет фильтрации данных по различным критериям (фасетам).

Основные возможности фасетного поиска:

  • Пользователь может выбрать интересующие фасеты (свойства, метки) объектов — цена, бренд, цвет и т.д.

  • Результаты поиска динамически фильтруются в соответствии с выбранными фасетами.

  • Отображаются количества найденных результатов для каждого значения фасета.

  • Пользователь может добавлять или удалять фасеты для уточнения поиска.

  • Фасеты генерируются автоматически на основе характеристик объектов.

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

Для реализации фасетного поиска обычно используются такие системы как ElasticSearch, Solr, Sphinx.


NGINX

Как происходить прослушка портов nginx-ом?

Nginx осуществляет прослушивание портов следующим образом:

  1. При запуске nginx создает worker-процессы (по умолчанию их количество равно количеству ядер CPU).

  2. Каждый worker-процесс запускает несколько потоков (задается директивой worker_connections).

  3. Эти потоки и выполняют непосредственное прослушивание сетевых сокетов на указанных портах.

  4. Когда на порт поступает новое TCP-подключение, оно акцептуется одним из свободных потоков.

  5. Этот поток обрабатывает запрос пользователя, взаимодействуя с приложением по протоколу FastCGI, если таковое настроено.

  6. После отправки ответа поток освобождается и может акцептовать новое подключение.

Таким образом, используется многопоточная асинхронная обработка запросов в рамках каждого worker-процесса.

Количество worker-ов и потоков можно настраивать в соответствии с нагрузкой на сервер для оптимизации производительности.


Зачем нужен php-fpm ? За счет чего php-fpm ускоряет выполнение скриптов?

php-fpm (FastCGI Process Manager) — это альтернативный PHP FastCGI менеджер процессов. Он используется совместно с веб-серверами, такими как nginx, для ускорения выполнения PHP скриптов.

Основные преимущества php-fpm:

  • Кеширование оп-кода PHP в памяти. Компиляция скрипта в оп-код выполняется один раз, что ускоряет последующие запуски.

  • Постоянно запущенные процессы PHP вместо пересоздания процесса для каждого запроса. Это экономит ресурсы ОС при выполнении скриптов.

  • Асинхронный FastCGI протокол вместо блокирующего mod_php в Apache.

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

  • Разделение процессов на пулы по сайтам или директориям.

  • Ограничение числа дочерних процессов для предотвращения fork-бомб.

  • Поддержка PHP-FPM в nginx позволяет отказаться от Apache в пользу более производительного nginx.

За счет этих механизмов использование php-fpm может значительно ускорить выполнение PHP скриптов и снизить нагрузку на сервер.


Что такое fast-cgi ? Зачем он нужен?

FastCGI — это протокол взаимодействия веб-сервера с внешним приложением для обработки динамического контента, например, с PHP приложением.

Основные преимущества FastCGI:

  • Веб-сервер (nginx, Apache) перенаправляет запросы приложению по FastCGI и получает результат. Приложение может быть написано на любом языке.

  • Внешнее приложение запускается один раз и обрабатывает множество запросов в отдельных потоках или процессах. Это эффективнее, чем перезапуск CGI-приложения для каждого запроса.

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

  • Масштабируется на множество серверов оптимальнее, чем mod_php в Apache.

  • Безопаснее CGI благодаря изоляции приложений друг от друга.

  • Поддерживается всеми популярными веб-серверами и языками программирования.

Таким образом, FastCGI позволяет эффективно обрабатывать динамические запросы, масштабировать архитектуру приложения и улучшает производительность.


(warning) Если вы хотите качественно подготовиться к собеседованиям на должность веб-разработчика php, рекомендую скачать мою авторскую книгу на эту тему. Здесь разобраны все популярные вопросы и задачи, которые встречаются на собеседованиях. Вопросы/задачи собраны с реальных интервью, пройденных мной на протяжении последних 5+ лет. Все вопросы и задачи здесь подробно разобраны.


Tags

Нет Ответов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рубрики


Подпишись на новости
👋

Есть вопросы?