Skip to content

Instantly share code, notes, and snippets.

@phpclub
Forked from llcawc/angie.md
Created July 2, 2025 06:41
Show Gist options
  • Save phpclub/ffa56480019efb74bccdf9b0eea76eaf to your computer and use it in GitHub Desktop.
Save phpclub/ffa56480019efb74bccdf9b0eea76eaf to your computer and use it in GitHub Desktop.
Настройка сервера Angie для Ubuntu или Debian

Настройка сервера Angie

Angie (Энджи) — эффективный, мощный и масштабируемый веб-сервер, реализованный как форк nginx:

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

Установка Angie на сервер Ubuntu или Debian

На основе официальной документации: https://angie.software/angie/docs/installation/

Начинаем с установки подключение к серверу через терминал с SSH c логином от root:

Обновляем систему

apt update && apt upgrade -y

Меняем пароль root если надо:

passwd

По желанию устанавливаем mc (Midnight Commander). Это простой менеджер файлов с двумя панелями и редактором - ускоряет и облегчает серфинг и обработку файлов и папок.

sudo apt install -y mc

Проверяем службу systemd-resolved и наличие resolver 127.0.0.53

Для работы модуля ACME в Angie который обеспечивает автоматическое получение сертификатов с использованием протокола ACME, необходимо иметь включенный внутренний резолвер 127.0.0.53 который работает в службе systemd-resolved. Причем обычно по умолчанию при установке нового дистрибутива VPS Ubuntu эта служба встроена и включена, а в Debian по умолчанию ее нет.

  1. Проверить статус службы systemd-resolved:
sudo systemctl status systemd-resolved.service
  1. Установить systemd-resolved
sudo apt install -y systemd-resolved

[!Info] Для включения службы рекомендуется перезагрузить сервер.

Дополнительные команды:

# Запустить службу (при необходимости)
sudo systemctl start systemd-resolved.service

# Добавить службу в автозапуск (при необходимости)
sudo systemctl enable systemd-resolved.service

Cмотрим открытые порты и кто их использует:

sudo netstat -plnt

Если команда netstat не найдена - надо установить пакет net-tools

sudo apt update
sudo apt install net-tools

Вот так выглядит запуск netstat при НЕ настроенном resolver 127.0.0.53:

root@server:~# netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      12951/sshd: /usr/sb
tcp6       0      0 :::22                   :::*                    LISTEN      12951/sshd: /usr/sb

Вот так выглядит запуск netstat при настроенном resolver:

root@server:~# netstat -plnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      562/sshd: /usr/sbin
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      487/systemd-resolve
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      487/systemd-resolve
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      487/systemd-resolve
tcp6       0      0 :::22                   :::*                    LISTEN      562/sshd: /usr/sbin
tcp6       0      0 :::5355                 :::*                    LISTEN      487/systemd-resolve

Настройка user пользователя

Добавляет пользователя

adduser user

Даёт права sudo

adduser user sudo

Для сервера nginx да и apache как и php как правило требуется группа www-data, однако при использовании сервера angie по умолчанию используется группа angie.

Добавим существующего пользователя user в группу www-data без смены для него основной группы:

usermod -aG www-data user

или создаём группу angie и добавляем в нее пользователя user не меняя его основной группы user

groupadd angie && usermod -aG angie user

[!info] Если в дальнейшем планируется использовать php-fpm, надо будет не забыть добавить группу angie в настройки - файл /etc/php/8.4/fpm/pool.d/www.conf

Проверим в каких группах состоит пользователь user:

groups user

Выходим

logout

Подключается от user

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

Самый простой способ скопировать ключ на удаленный сервер - это использовать утилиту ssh-copy-id.

ssh-copy-id [email protected]

Предварительно - надо посмотреть - а есть ли наши ключи на локальном компьютере в папке ~/.ssh

Если нашего ключа нет, то надо его создать.

mkdir -p ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh
ssh-keygen

Если работаем в Debian то можем настроить короткую команду ll как сокращение от команды ls -lha. Для этого в домашней папке надо отредактировать alias в файле .bashrc - запускаем редактор mc выделяем файл для редактирования и нажимаем F4. При первом запуске редактора выбираем редактор по умолчанию:

user@server:~$ mc

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/mcedit
  4. /usr/bin/vim.tiny

Choose 1-4 [1]:

В дальнейшем его можно поменять командой select-editor или редактируя или удалив файл ~/.selected_editor

Устанавливаем сервер Angie

  1. Установите вспомогательные пакеты для подключения репозитория Angie:
sudo apt update
sudo apt install -y ca-certificates curl
  1. Скачайте открытый ключ репозитория Angie для проверки подлинности пакетов:
 sudo curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg \
            https://angie.software/keys/angie-signing.gpg
  1. Подключите репозиторий Angie:
echo "deb https://download.angie.software/angie/$(. /etc/os-release && echo "$ID/$VERSION_ID $VERSION_CODENAME") main" \
    | sudo tee /etc/apt/sources.list.d/angie.list > /dev/null
  1. Обновите индексы репозиториев:
sudo apt update
  1. Установите пакет Angie:
sudo apt install -y angie
  1. (Дополнительно) Установите пакеты необходимых вам динамических модулей.

    • устанавливаем модуль brotli:
sudo apt install -y angie-module-brotli

Далее - до работы с конфигами - предлагается настроить папку сайта.

Настраиваем папку Сайта

Создаём папку для сайта

sudo mkdir -p /var/www/example.com/html

Добавляем файлы в папку сайта. Например так:

sudo nano /var/www/example.com/html/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>example.com</title>
  </head>
  <body>
    <h1>Hello from example.com!</h1>
    <p>How did you end up here?</p>
  </body>
</html>

Забираем права на папку для сайтов с учетом что сайт будет в группе angie.

sudo chown -R user:angie /var/www/

Даем права чтения и исполнения на папки и файлы сайта:

sudo chmod -R 755 /var/www

Проверяем настройки папок:

ll /var/www

Настраиваем конфиги сервера Аngie

sudo nano /etc/angie/angie.conf

или с редактором mc -> mcedit:

sudo mcedit /etc/angie/angie.conf

Пример конфига angie.conf для обслуживания по протоколу http с сжатием gzip и brotli и acme клиентом:

# Load Brotli module
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

user  angie;
worker_processes  auto;
worker_rlimit_nofile 65536;

error_log  /var/log/angie/error.log notice;
pid        /run/angie.pid;

events {
    worker_connections  65536;
}

http {

    resolver                  127.0.0.53;
    acme_client example       https://acme-v02.api.letsencrypt.org/directory;

    # Basic
    sendfile                  on;
    tcp_nopush                on;
    tcp_nodelay               on;
    types_hash_max_size       2048;
    server_tokens             off;
    ignore_invalid_headers    on;

    # Decrease default timeouts to drop slow clients
    keepalive_timeout         40s;
    send_timeout              20s;
    client_header_timeout     20s;
    client_body_timeout       20s;
    reset_timedout_connection on;

    # Hash sizes
    server_names_hash_bucket_size 64;

    # Mime types
    include       /etc/angie/mime.types;
    default_type  application/octet-stream;

    # Logs
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format extended '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" rt="$request_time" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        'h="$host" sn="$server_name" ru="$request_uri" u="$uri" '
                        'ucs="$upstream_cache_status" ua="$upstream_addr" us="$upstream_status" '
                        'uct="$upstream_connect_time" urt="$upstream_response_time"';

    access_log  /var/log/angie/access.log  main;

    # Brotli
    brotli on;
    brotli_comp_level 6;
    brotli_static on;

    # Gzip
    gzip on;
    gzip_comp_level 5;

    # Virtual Hosts
    include /etc/angie/sites-enabled/*;

    # Configs
    include /etc/angie/http.d/*.conf;
}

Пример конфига default.conf в папке http.d который не позволяет пользователям попадать на сайт по цифровому ip сайта:

sudo nano /etc/angie/http.d/default.conf
server {
    listen      80 default_server;
    listen      [::]:80 default_server;

    listen      443 ssl default_server;
    listen      [::]:443 ssl default_server;
    ssl_reject_handshake on;

    server_name "";
    return      444;
}

Если сервер будет обслуживать один сайт проще всего настроить его конфиг там же в папке .http.d. Примерный конфиг сайта статичных страниц с автоматическим получением ssl сертификата Let's Encrypt с использованием протокола ACME при этом не забываем держать открытым и обрабатывать порт :80 так как это необходимо для корректной работы ACME:

sudo nano /etc/angie/http.d/example.conf
server {
    listen 443 ssl;
    http2 on;

    server_name example.com www.example.com;
    root /var/www/example.com/html;
    index index.html;

    acme example;
    ssl_certificate $acme_cert_example;
    ssl_certificate_key $acme_cert_key_example;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    # redirect server error pages to the static page /404.html
    error_page 404    /404.html;
    
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
}
server {
    listen 80;
    listen [::]:80;
    
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

Ниже описано действие этих директив и блоков расположения:

  • listen — определяет, что будет прослушивать порт Angie. В данном случае он будет прослушивать порт 80, используемый по умолчанию для протокола HTTP и порт 443 используемый по умолчанию для для протокола HTTPS.
  • root — определяет корневую директорию документа, где хранятся файлы, обслуживаемые этим сайтом.
  • index — задает для Angie приоритет обслуживания файлов индекса для этого сайта. Довольно часто вы указываете файлы index.html, которые имеют высший приоритет по сравнению с файлами index.php, чтобы обеспечить быструю настройку начальной страницы в приложениях PHP. Вы можете менять эти настройки в зависимости от потребностей вашего приложения.
  • server_name — определяет, на какие доменные имена и/или IP-адреса должен реагировать ваш серверный блок. Эта директива должна указывать на доменное имя или публичный IP-адрес вашего сервера.
  • acme - для всех доменов, указанных в директивах server_name во всех блоках server, которые ссылаются на клиент ACME с именем имя (в примере выше имя это example - эти имена придумывает сам пользователь), будет получен единый сертификат; если изменится конфигурация server_name, сертификат будет обновлен для учета изменений.
  • переменная $acme_cert_example - ( как $acme_cert_ + имя) - содержимое последнего файла сертификата (если он есть), полученного клиентом с этим именем.
  • переменная $acme_cert_key_example ( как $acme_cert_key_ + имя) - содержимое файла ключа сертификата, используемого клиентом с этим именем.
  • location / — первый блок расположения включает директиву try_files, которая проверяет наличие файлов или директорий, соответствующих запросу URI. Если Angie не сможет найти соответствующий ресурс, будет возвращена ошибка 404.
  • location ~ /.ht — отвечает за файлы .htaccess, которые Angie не обрабатывает. При добавлении директивы deny all, если любой из файлов .htaccess попадет в корневую директорию документа, они не будут выводиться посетителям.
  • error_page 404 — обработка файла с ошибкой 404 (файл не найден) как статического файла 404.html
  • error_page 500 — обработка файла с ошибкой 500 (ошибки сервера) как статического файла 50x.html

[!info] Надо учитывать что получение ssl сертификата займет некоторое время. Кроме того рекомендуется заглядывать в лог файл error.log сервера Angie для контроля процесса.

Если сервер будет обслуживать внутренний сервер (например в контейнере docker), т.е. работать как прокси-сервер то так же это можно настроить в папке .http.d. Например:

server {
    listen 443 ssl;
    http2 on;

    server_name portainer.example.com;

    acme example;
    ssl_certificate $acme_cert_example;
    ssl_certificate_key $acme_cert_key_example;

    location / {
        proxy_pass https://0.0.0.0:9443;
        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;
    }
}
server {
    listen 80;
    listen [::]:80;

    server_name portainer.example.com;
    return 301 https://portainer.example.com$request_uri;
}

Проверяем конфиг angie

Есть два варианта работы с сервисами - приведем оба.

Проверка статуса и перезапуск с использованием `Systemd:

sudo angie -t && sudo systemctl restart angie

Проверка статуса и перезапуск с использованием `System V:

sudo angie -t && sudo service angie restart
# Дополнительные команды управления сервером Angie с использованием Systemd:

# запустить сервис
sudo systemctl start angie

# Добавить сервис в автозагрузку
sudo systemctl enable angie

# Список сервисов добавленных в автозагрузку
sudo systemctl list-unit-files --type=service --state=enabled

# проверить находится ли сервис уже в автозагрузке
sudo systemctl is-enabled angie

# посмотреть находится ли сервис в автоазагрузке, запущен ли и последние логи:
sudo systemctl status angie

# Дополнительные команды управления сервером Angie с использованием System V (SysVinit "service"):

sudo service angie start
sudo service angie restart
sudo service angie status

# проверка и рестарт
sudo angie -t && sudo service angie restart

# или проверка и перезагрузка
sudo angie -t && sudo service angie reload

Смотрим и проверяем ошибки сервера:

cat /var/log/angie/error.log

Проверяем работает ли сжатие Brotli

curl -H 'Accept-Encoding: br' -I https://example.com
Content-Encoding: br

Установка файрволла UFW

sudo apt install ufw

Добавляем новые настройки приложения для файрволла - создаем файл angie.ini

sudo nano /etc/ufw/applications.d/angie.ini
[Angie HTTP]
title=Web Server
description=Enable ANGIE HTTP traffic
ports=80/tcp

[Angie HTTPS]
title=Web Server (HTTPS)
description=Enable ANGIE HTTPS traffic
ports=443/tcp

[Angie Full]
title=Web Server (HTTP,HTTPS)
description=Enable ANGIE HTTP and HTTPS traffic
ports=80,443/tcp

Проверяем список приложений

sudo ufw app list

Включаем файрволл

sudo ufw enable

Разрешаем сервисы - открываем порты 22, 80 и 443

sudo ufw allow 'OpenSSH'
sudo ufw allow 'Angie Full'

Проверяет статус

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Angie Full                 ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
Angie Full (v6)            ALLOW       Anywhere (v6)
OpenSSH (v6)               ALLOW       Anywhere (v6)

Проверяем открытые порты:

sudo netstat -plnt

Вариант настройки сервере Angie для обработки нескольких сайтов:

Создаём две папки - для конфигов сайтов:

sudo mkdir -p /etc/angie/sites-available/

и для их ссылок:

sudo mkdir -p /etc/angie/sites-enabled/

редактируем файл конфигурации (и незабываем поменять example.com на имя своего домена)

sudo nano /etc/angie/sites-available/example.com.conf

или

sudo mcedit /etc/angie/sites-available/example.com.conf
server {
    listen 443 ssl;
    http2 on;

    server_name example.com;
    root /var/www/example.com/html;
    index index.html index.php index.xml;

    acme example;
    ssl_certificate $acme_cert_example;
    ssl_certificate_key $acme_cert_key_example;

    # pass the PHP scripts to FastCGI server listening on UNIX sock
    #
    # location ~ \.php$ {
    #     fastcgi_pass   unix:/run/php/php8.4-fpm.sock;
    #     fastcgi_index  index.php;
    #     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    #     include        /etc/angie/fastcgi_params;
    # }

    location / {
        try_files $uri $uri/ =404;
    }
    #
    # redirect server error pages to the static page /404.html
    error_page 404    /404.html;
    location = /404.html {
        root /var/www/example.com/html;
    }
    #
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /var/www/example.com/html;
    }
    # deny access to .htaccess files, if Apache's document root concurs with angie's one
    location ~ /\.ht {
        deny  all;
    }
}
server {
    listen 443 ssl;
    http2 on;

    server_name www.example.com;
    return 301 https://example.com$request_uri;

    acme example;
    ssl_certificate $acme_cert_example;
    ssl_certificate_key $acme_cert_key_example;
}
server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

Включает конфиг - создает символическую ссылку в папке sites-enabled

sudo ln -s /etc/angie/sites-available/example.com.conf /etc/angie/sites-enabled/

Проверяет конфиг и перезагрузка angie :

sudo angie -t && sudo service angie reload

Проверяет работу angie

sudo systemctl status angie

Смотреть адрес домена

ip addr show eth0 | grep inet | awk '{ print $2; }'

Проверяет домен

curl example.com

END

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment