Angie (Энджи) — эффективный, мощный и масштабируемый веб-сервер, реализованный как форк nginx:
- Создан бывшими разработчиками исходного проекта, чтобы двигаться в новом направлении, и может служить заменой предшественнику без переработки конфигурации и модулей.
- Включает все возможности nginx 1.27.4 и добавляет к ним целый ряд новых функций.
На основе официальной документации: https://angie.software/angie/docs/installation/
Начинаем с установки подключение к серверу через терминал с SSH c логином от root:
Обновляем систему
apt update && apt upgrade -y
Меняем пароль root
если надо:
passwd
По желанию устанавливаем mc
(Midnight Commander). Это простой менеджер файлов с двумя панелями и редактором - ускоряет и облегчает серфинг и обработку файлов и папок.
sudo apt install -y mc
Для работы модуля ACME в Angie который обеспечивает автоматическое получение сертификатов с использованием протокола ACME, необходимо иметь включенный внутренний резолвер 127.0.0.53 который работает в службе systemd-resolved
. Причем обычно по умолчанию при установке нового дистрибутива VPS Ubuntu эта служба встроена и включена, а в Debian по умолчанию ее нет.
- Проверить статус службы systemd-resolved:
sudo systemctl status systemd-resolved.service
- Установить
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
Добавляет пользователя
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
- Установите вспомогательные пакеты для подключения репозитория Angie:
sudo apt update
sudo apt install -y ca-certificates curl
- Скачайте открытый ключ репозитория Angie для проверки подлинности пакетов:
sudo curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg \
https://angie.software/keys/angie-signing.gpg
- Подключите репозиторий 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
- Обновите индексы репозиториев:
sudo apt update
- Установите пакет Angie:
sudo apt install -y angie
-
(Дополнительно) Установите пакеты необходимых вам динамических модулей.
- устанавливаем модуль 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
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.htmlerror_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;
}
Есть два варианта работы с сервисами - приведем оба.
Проверка статуса и перезапуск с использованием `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
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
Создаём две папки - для конфигов сайтов:
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