Что будет происходить после ввода команды `curl example.com` в Linux?

«Что будет происходить после ввода команды `curl example.com` в Linux?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команда curl example.com инициирует процесс получения главной страницы сайта по HTTP. Вот что происходит под капотом с точки зрения DevOps-инструментов и сетей:

  1. Разрешение DNS:

    • curl запрашивает у системы разрешение имени example.com в IP-адрес.
    • Происходит проверка локального кеша (/etc/hosts, systemd-resolved), затем запрос к DNS-серверам из /etc/resolv.conf.
    • Можно отследить: dig example.com или nslookup example.com.
  2. Установка TCP-соединения (SYN, SYN-ACK, ACK):

    • curl (клиент) отправляет TCP SYN пакет на полученный IP-адрес, порт 80 (HTTP).
    • Если на пути есть файрвол (iptables, nftables, облачные Security Groups), он проверяет правило на исходящий трафик.
    • Можно симулировать проверку доступности порта утилитой nc (netcat): nc -zv example.com 80.
  3. Отправка HTTP-запроса:

    • После установки TCP-сессии curl отправляет HTTP/1.1 GET запрос:
      GET / HTTP/1.1
      Host: example.com
      User-Agent: curl/7.68.0
      Accept: */*
  4. Получение и обработка ответа:

    • Сервер отвечает HTTP-статусом (например, 200 OK) и телом HTML.
    • curl по умолчанию выводит полученное тело ответа в stdout.

DevOps-перспектива и отладка: В реальной работе я редко использую curl просто так. Чаще с флагами для отладки API, проверки здоровья сервисов или диагностики проблем в продакшене.

  • Проверка здоровья endpoint'а в Kubernetes:

    # В поде или как часть liveness-пробы
    curl -f -s -o /dev/null -w "%{http_code}n" http://localhost:8080/health
    # Возвращает только код статуса. Код >400 приведет к exit code !=0
  • Диагностика проблем с балансировщиком или ingress-контроллером:

    # Следим за заголовками, чтобы увидеть, через какой сервис/под прошел запрос
    curl -v -H "Host: my-app.example.com" http://<INGRESS_IP>/
    # В выводе ищем заголовки вроде `X-Served-By` или `upstream_addr`
  • Базовый нагрузочный тест (для быстрой проверки):

    # 100 запросов с 10 параллельными потоками
    curl -s "http://example.com/" | wrk -t10 -c100 -d10s

Таким образом, curl — это не просто команда для скачивания страниц, а основной инструмент для взаимодействия с HTTP-сервисами, их тестирования и отладки в инфраструктуре.