Caddy в качестве альтернативы Nginx

До недавнего времени все мои веб сервисы были жёстко завязаны на Nginx. Через него работал сайт и проксировались приложения. Естественно, всё находится внутри контейнеров и рассортировано по серверам в разных масштабах.

Проблема в том, что веб сейчас достаточно требователен в плане стандартов и всяких штук связанных с безопасностью. Конфиг Nginx только для данного сайта состоит из 50 строк. Кроме того, есть ещё задачи связанные с получением и доставкой сертификатов. Для этих целей обычно используют certbot. Он постоянно обновляется и если нужно гарантировано получать обновления сертификатов без сюрпризов, то и его надо запускать в заранее оттестированном контейнере. Получается слоёный пирог из мелких задач, а нужно ведь всего лишь запустить маленький сайт.

Несколько лет назад появился веб сервер Caddy, написанный на Go и предлагающий в качестве главных своих фишек как раз таки упрощённое конфигурирование и так называемое HTTPS по умолчанию. Я решил взглянуть на него и рассмотреть возможность использования на проектах не требующих серьёзных нагрузок.

Caddy отлично задокументирован. Разобраться с базовым функционалом не составит труда и займёт мало времени. Есть возможность использования плагинов для расширения его возможностей и я не сказал бы, что они бесполезные. Самое главное, что о сертификатах думать вообще не надо. Прозрачная встроенная интеграция с Let’s Encrypt. По умолчанию веб сервер сам сходит за сертификатом, положит его в отдельную папку и обновит когда придёт время.

Примеры конфигураций

Базовый конфиг для веб сайта будет выглядеть вот так:

https://snupt.com {
  root /srv/snupt.com
}

Сравним с Nginx:

server {
  listen 80;
  if ($scheme = http) {
    return 301 https://$server_name$request_uri;
  }

  listen 443 ssl http2;
  ssl_certificate /etc/letsencrypt/live/snupt.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/snupt.com/privkey.pem;

  server_name snupt.com;
  root /var/www/snupt.com/;
  index index.html;
}

А если надо, чтоб SSL Test прошёл на А+ без особых претензий к безопасности, то придётся расширить его раза в два. В Caddy же всё из коробки.

Возьмём пример с проксированием какого-нибудь сервиса, смотрящего в веб. Ну, например, нужно прокинуть веб морду для git. Вот так я описал конфигурацию в Caddy:

https://git.snupt.com {
  proxy / gogs:3000 {
    transparent
  }
}

Nginx, который делает ровно то же самое:

server {
  listen 80;
  if ($scheme = http) {
    return 301 https://$server_name$request_uri;
  }

  listen 443 ssl http2;
  ssl_certificate /etc/letsencrypt/live/git.snupt.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/git.snupt.com/privkey.pem;

  server_name git.snupt.com;

  location / {
    proxy_pass http://gogs:3000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

SSL сертификаты

Теперь про то как получать сертификаты в случае с Nginx. Я это делаю через docker-compose следующим образом:

letsencrypt:
    image: certbot/dns-route53:latest
    container_name: letsencrypt
    volumes:
      - ./letsencrypt:/etc/letsencrypt
    command: certonly -n --agree-tos --email snupt@snupt.com --renew-by-default --dns-route53 -d snupt.com -d www.snupt.com
    # command: renew
    env_file: .secrets

После того как сертификаты получены, папку letsencrypt нужно доставить в контейнер с Nginx, а дальше по расписанию делать renew и перезапускать конфигурацию веб сервера:

docker-compose -f /home/snupt/apps/nginx/docker-compose.yml run letsencrypt && docker kill -s HUP nginx

С Caddy же вообще ничего делать не надо, эта задача решается автоматически.

Недостатки

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

С маркетингом Caddy происходит что-то очень странное. Говорят, что раньше в заголовках содержалась реклама от спонсоров. В HTTP заголовках реклама — неслыханная наглость! Но, судя по всему, эти времена прошли и сейчас ничего подобного нет. Зато, начиная с версии 0.11 веб сервер отправляет телеметрию своим авторам. В неё входит некая статистика, которая нужна разработчикам для служебных целей. Эта штука включена по умолчанию и Caddy будет отправлять данные, если её не вырубить. В официальном письме говорится, что в статистику не падают персональные данные, но я, разумеется, отключил. Делается это передачей ключа -disabled-metrics при запуске приложения.

В общем и целом Caddy хороший продукт, которым я с удовольствием буду пользоваться. Но маркетинг ужасный и если они ещё что-нибудь учудят, рука моя не дрогнет снести это чудо к чертям.

Вот мой репозиторий с примерами использования Caddy в быту: vps-app-caddy.

comments powered by Disqus