Ниже — список вопросов, которые можно часто услышать на собеседованиях веб-разработчика по темам Linux, Devops, CI/CD, SRE, Docker … В общем, все что не относится напрямую к кодингу, но то с тем часто имеют дело веб-разработчики ходже своей работы.
/**/
- Основы Linux
- Какие основные команды linux знаете ?
- Какими командами можно прочитать лог-файл в Linux ?
- Как в bash прочитать 2 лог-файла одновременно, за определенный день и только ошибки ?
- Что такое load average ?
- Как выйти из редактора vim ?
- Что означают цифры в правах на файл unix? Например, что будет означать число 644 ?
- Чем отличаются потоки от процессов?
- Какой командой можно убить процесс в unix?
- Docker
- Что такое Docker ? Зачем он нужен ?
- Чем отличается docker от виртуализации?
- В чем отличие docker от docker-compose ?
- Какие виды сетей могут быть между контейнерами в docker-compose ?
- Как делается масштабирование в Docker?
- Что такое файл конфигурации yaml в Docker ? Приведи пример. Писал ли сам конфигурации yaml ?
- Как расшарить порты в докере ?
- Composer
- CI / CD
- Что такое GitLab ? зачем он нужен ?
- Что такое CI / CD ? Писал ли сам / настраивал ?
- Что такое pipeline в CI CD ?
- Что такое GITLAB CI , Github Travis ? Был ли опыт работы с ними?
- Перечисли основные виды линтеров, используемых для разработки веб-приложений на php. Какие линтеры знаешь/используешь ?
- Зачем нужен PhpStan ? Что он проверяет?
- Что такое Vagrant ? Есть опыт применения?
- SRE
- Очереди сообщений
- Перечисли основные брокеры сообщений в веб-приложениях. Какие брокеры сообщений знаешь/использовал ?
- Для чего можно использовать очереди задач RabbitMQ в веб-приложениях на php ? Есть ли опыт использования (какой)?
- Что сделать , чтобы очередь RabbitMQ не останавливалась, если какая-то задача в ней зависла?
- Для чего нужен Producer в RabbitMQ ?
- Для чего в веб-приложениях используются Redis и Memcache?
- Инструменты для поиска
- NGINX
Основы Linux
Какие основные команды linux знаете ?
Вот таблица основных команд Linux, полезных для веб-разработчика:
Команда |
Описание |
Пример использования |
---|---|---|
|
Вывод списка файлов и папок |
|
|
Переход в директорию |
|
|
Вывод пути текущей директории |
|
|
Создание директории |
|
|
Удаление файла |
|
|
Удаление директории |
|
|
Копирование файла |
|
|
Перемещение/переименование файла |
|
|
Вывод содержимого текстового файла |
|
|
Постраничный вывод файла |
|
|
Поиск текста в файле |
|
|
Список процессов |
|
|
Завершение процесса |
|
|
Проверка доступности хоста |
|
|
Отправка HTTP запроса |
|
|
Скачивание файлов |
|
|
Выполнение команды от суперпользователя |
|
|
Справочная informация по команде |
|
|
Информация о системе |
|
|
Проверка использования диска |
|
|
Проверка использования пространства |
|
Какими командами можно прочитать лог-файл в 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 права доступа к файлам задаются при помощи трёх чисел:
-
Права владельца файла
-
Права группы, к которой принадлежит файл
-
Права всех остальных пользователей
Каждое число представляет собой сумму следующих прав доступа:
-
4 — чтение (r)
-
2 — запись
-
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 включает следующие шаги:
-
Выбрать провайдера CI/CD (
Jenkins, GitLab CI, CircleCI
и др.) -
Описать процесс сборки и тестирования в конфигурационных файлах.
-
Определить триггеры запуска pipelines (например, при коммите в git).
-
Настроить доставку кода на серверы: скрипты развертывания,
Ansible
и т.д. -
Настроить мониторинг и уведомления о результатах выполнения pipelines.
-
Определить стратегию развертывания: канарийное, синий/зеленый и т.д.
-
Внедрять 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 обычно происходит в несколько шагов:
-
Установка расширения Xdebug в PHP (модуль php-xdebug).
-
Настройка php.ini — включение xdebug, настройка режимов отладки/профилирования.
-
Установка плагина отладчика в IDE (PHPStorm, NetBeans, VSCode).
-
Установка точек останова (breakpoints) в коде через IDE.
-
Запуск скрипта в режиме отладки из IDE — скрипт будет останавливаться на точках останова.
-
Пошаговая отладка — просмотр переменных, вызов стэк функций и т.д.
-
Сбор профилировщика выполнения скрипта по времени, памяти и т.д.
-
Анализ результатов профилирования для оптимизации кода.
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 не останавливалась из-за зависания отдельных задач, можно использовать следующие подходы:
-
Включить автоматическое подтверждение получения сообщения (auto ack). Тогда после получения задача будет удалена из очереди независимо от результата обработки.
-
Добавить таймаут получения сообщения (consumer timeout). Если задача не обрабатывается за отведенное время, она будет возвращена в очередь.
-
Использовать ограничение видимости сообщения (TTL). Если задача не обработана за это время, она станет доступна другим потребителям.
-
Настроить максимальное количество попыток обработки задачи, после которых она помещается в отдельную очередь неудавшихся задач для последующего анализа.
-
Реализовать паттерн «Мертвое письмо» — после максимального числа попыток задача удаляется или отправляется в очередь необрабатываемых задач.
-
Масштабировать число потребителей задач, чтобы проблемная задача попала другому 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 осуществляет прослушивание портов следующим образом:
-
При запуске nginx создает worker-процессы (по умолчанию их количество равно количеству ядер CPU).
-
Каждый worker-процесс запускает несколько потоков (задается директивой worker_connections).
-
Эти потоки и выполняют непосредственное прослушивание сетевых сокетов на указанных портах.
-
Когда на порт поступает новое TCP-подключение, оно акцептуется одним из свободных потоков.
-
Этот поток обрабатывает запрос пользователя, взаимодействуя с приложением по протоколу FastCGI, если таковое настроено.
-
После отправки ответа поток освобождается и может акцептовать новое подключение.
Таким образом, используется многопоточная асинхронная обработка запросов в рамках каждого 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 позволяет эффективно обрабатывать динамические запросы, масштабировать архитектуру приложения и улучшает производительность.
Если вы хотите качественно подготовиться к собеседованиям на должность веб-разработчика php, рекомендую скачать мою авторскую книгу на эту тему. Здесь разобраны все популярные вопросы и задачи, которые встречаются на собеседованиях. Вопросы/задачи собраны с реальных интервью, пройденных мной на протяжении последних 5+ лет. Все вопросы и задачи здесь подробно разобраны.
Нет Ответов