Angie – не просто веб-сервер, но многофункциональный сетевой фронтенд, который способен выступать в самых различных ролях. Например, Angie может работать как обратный прокси-сервер, что является одной из его важных функций, унаследованных от Nginx, на базе которого он и был создан. В данном руководстве рассмотрим, как настроить Angie в качестве обратного прокси-сервера для тестового веб-приложения.
Как это работает?
При работе в качестве обратного прокси Angie фактически становится посредником между внешними клиентами и внутренними сервисами. Клиенты отправляют свои HTTP или HTTPS-запросы на публичный адрес сервера, и при этом не знают, что на самом деле получают доступ к другому приложению, которое работает на порту, отличном от 80 или 443. Angie принимает эти запросы, анализирует их, после чего в зависимости от конфигурации перенаправляет на нужный внутренний сервер или приложение.
В ходе обработки данных Angie может изменять заголовки, добавлять информацию о клиенте, кешировать ответы, управлять сессиями и даже распределять нагрузку между несколькими серверами. Благодаря этому внутренние сервисы остаются защищёнными от прямого доступа из сети, а все внешние взаимодействия проходят через единый, контролируемый вход. Данная конфигурация позволяет централизованно управлять безопасностью, логированием, сжатием данных и обработкой SSL-соединений, тем самым снимая с приложений лишнюю нагрузку. Как результат, Angie обеспечивает более безопасную, стабильную и масштабируемую архитектуру.
Далее разберём, как можно защитить веб-приложение при помощи Angie, настроенного как обратный прокси. В качестве примера мы создадим приложение на Node.js LTS-версии 22.16.0, актуальной на момент написания статьи.

Платформой для нашего приложения послужит виртуальный выделенный сервер, работающий под управлением Ubuntu 24.04.
Запуск приложения
Для запуска тестового приложения перейдите в домашний каталог вашего пользователя и создайте файл приложения, например, app.js
:
$ nano app.js
В нашем примере это будет простейшая веб-страница. Для её запуска мы используем следующий код:
const http = require('http');
const server = http.createServer((req, res) => {
console.log(`Запрос: ${req.method} ${req.url}`);
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(`
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Веб-страница на Node.js</title>
</head>
<body>
<h1>Ваша веб-страница, созданная на Node.js.</h1>
</body>
</html>
`);
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Приложение работает на http://localhost:${PORT}`);
});
Из кода нашего приложения видно, что веб-страница будет доступна на порту 3000. Поэтому, чтобы открыть её извне, необходимо добавить в брандмауэр UFW разрешающее правило для данного порта:
$ sudo ufw allow 3000
После чего запустите приложение командой:
$ node app.js
Затем на своём локальном компьютере откройте браузер и проверьте доступность веб-страницы, перейдя по IP-адресу вашего сервера или доменному имени вашего сайта, если его A-запись указывает на IP-адрес виртуальной машины. При этом не забудьте, что в ссылке на веб-страницу нужно указать номер порта, на котором работает ваше приложение. В нашем примере созданное приложение доступно по адресу your-site-name.ru:3000
.

Для того, чтобы прервать работу приложения, в командной нажмите Ctrl
C
.
Как настроить Angie в качестве обратного прокси-сервера
Для настройки Angie в качестве обратного прокси-сервера необходимо, во-первых, создать каталоги для конфигурационных файлов и для активных конфигураций. В последнем будет находиться символическая ссылка на соответствующий файл из первого каталога.
$ sudo mkdir -p /etc/angie/sites-available
$ sudo mkdir -p /etc/angie/sites-enabled
Затем откройте основной конфигурационный файл Angie:
$ sudo nano /etc/angie/angie.conf
И в секцию http
добавьте директиву include
, указывающую на каталог, в котором будут находиться конфигурационные файлы Angie:
include /etc/angie/sites-enabled/*;
Затем создайте файл конфигурации виртуального хоста для домена, по имени которого будет открываться веб-страница. В нашем примере это – your-site-name.ru
.
$ sudo nano /etc/angie/sites-available/your-site-name.ru
Добавьте в данный файл следующие строки:
server {
listen 80;
server_name your-site-name.ru www.your-site-name.ru;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
}
}
Обратите внимание на следующие параметры конфигурации виртуального хоста:
listen 80;
– указывает на то, что Angie будет слушать HTTP-трафик на порту 80 – стандартном порту для протокола HTTP;server_name your-site-name.ru www.your-site-name.ru;
– определяет доменные имена, на которые будет срабатывать данная конфигурация;proxy_pass http://127.0.0.1:3000;
– перенаправляет запросы от клиентов на локальное приложение, работающее на порту 3000;- директивы
proxy_set_header Upgrade $http_upgrade;
иproxy_set_header Connection 'upgrade';
требуются для корректной поддержки WebSocket – протокола, который используется для живого обновления интерфейса.
Далее создайте символическую ссылку на файл конфигурации виртуального хоста:
$ sudo ln -s /etc/angie/sites-available/your-site-name.ru /etc/angie/sites-enabled
Чтобы убедиться в том, что после внесённых изменений Angie работает без ошибок, проверьте его синтаксис на корректность:
$ sudo angie -t
Вывод команды должен содержать сообщение об успешном прохождении проверки.

И, наконец, для применения изменений перезапустите конфигурацию Angie:
$ sudo systemctl reload angie
Чтобы проверить, что доступ к веб-странице обеспечивается с использованием Angie, запустите приложение:
$ node app.js
И в браузере перейдите по доменному имени сайта.

Для остановки работы приложения в терминале используйте комбинацию клавиш Ctrl
C
.
Запуск приложения как службы
Чтобы созданное при помощи Node.js приложение работало постоянно и не было необходимости запускать его вручную, рассмотрим, как запустить его в качестве службы.
Для этого создайте юнит-файл systemd для новой службы. В нашем примере данный файл будет называться yourapp.service
. Соответственно, создаваемая служба также будет называться yourapp
.
$ sudo nano /etc/systemd/system/yourapp.service
Содержимое юнит-файла в нашем случае имеет следующий вид:
[Unit]
Description=Your Node.js App
After=network.target
[Service]
ExecStart=/home/your-user/.nvm/versions/node/v22.16.0/bin/node /home/your-user/app.js
WorkingDirectory=/home/your-user
Restart=always
User=your-user
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
В данном случае, ExecStart=/home/your-user/.nvm/versions/node/v22.16.0/bin/node /home/your-user/app.js
– команда, которая запускает приложение. Обратите внимание, что команда содержит полный путь к исполняемому файлу Node.js и полный путь к файлу приложения. Чтобы узнать, где в системе расположен исполняемый файл Node.js, выполните команду:
$ which node
Её вывод и будет содержать полный путь до исполняемого файла.

Также юнит-файл должен содержать:
WorkingDirectory=/home/your-user
– рабочий каталог приложения;User=your-user
– имя пользователя, под именем которого будет запускаться приложение;Environment
– директиву, которая добавляет переменную окружения.
В нашем примере в юнит-файле присутствуют две переменных окружения:
NODE_ENV=production
– стандартная переменная окружения для Node.js, которая устанавливает режимproduction
;PORT=3000
– переменная окружения, которая указывает приложению, на каком порту оно должно слушать входящие подключения.
Сохраните изменения в файле, закройте его и, чтобы система узнала о новом юнит-файле, перезагрузите конфигурацию сервисов без их непосредственного перезапуска:
$ sudo systemctl daemon-reload
Затем запустите новую службу:
$ sudo systemctl start yourapp
И установите её в автозагрузку:
$ sudo systemctl enable yourapp
Чтобы убедиться в успешном запуске службы, выведите на экран её состояние:
$ systemctl status yourapp
Вывод команды не должен содержать сообщений об ошибках.

Теперь приложение, созданное на Node.js, будет выводить веб-страницу, доступ к которой, в свою очередь, будет обеспечивать обратный прокси-сервер Angie. Убедиться в этом можно, перейдя в браузере по имени сайта, который в нашем примере открывается по ссылке http://your-site-name.ru
.
В данный момент веб-страница доступна как по протоколу HTTP, так и по порту 3000. Данный порт использовался нами для проверки работоспособности приложения. Чтобы закрыть доступ к серверу через порт 3000, удалите соответствующее разрешающее правило в брандмауэре UFW:
$ sudo ufw delete allow 3000
То, что доступ к работающей на Node.js веб-странице обеспечивает именно Angie, видно, например, в DevTools браузера Firefox.
