Envoy vs Nginx vs Node.js Proxy. Анализируем прокси серверы

Envoy, Nginx и Node.js Proxy являются популярными решениями для проксирования трафика в современных веб-приложениях. В этой статье мы проведем сравнительный анализ этих трех инструментов, чтобы определить их сильные и слабые стороны.

Envoy
Envoy — это высокопроизводительный сервис-прокси, который был создан компанией Lyft для использования в своих собственных приложениях. Он предлагает множество функций, включая балансировку нагрузки, кэширование, шифрование TLS и многое другое. Envoy также поддерживает развертывание в кластере Kubernetes и может работать как в режиме прослушивания (listener mode), так и в режиме сервиса (service mode).

Основные преимущества Envoy включают следующее:
— Envoy способен обрабатывать большое количество запросов в секунду благодаря своей оптимизированной архитектуре.
— Envoy предоставляет множество возможностей для управления трафиком, таких как балансировка нагрузки, кэширование и шифрование TLS.
— Envoy легко интегрируется с Kubernetes, что делает его идеальным выбором для облачных приложений.

Недостатки Envoy:
— Envoy требует глубоких знаний о его конфигурации и возможностях, что может быть сложным для новичков.
— Хотя Envoy имеет хорошую документацию, она может быть недостаточной для некоторых пользователей.

Nginx (eNgine X)
Nginx — это широко известный веб-сервер и обратный прокси, который используется миллионами сайтов по всему миру. Он известен своей высокой производительностью и надежностью, а также простотой настройки. Nginx также поддерживает балансировку нагрузки, кэширование и другие функции.

Преимущества Nginx:
— Nginx имеет простой и понятный интерфейс конфигурации, что делает его легким в использовании даже для новичков.
— Nginx известен своей стабильностью и способностью обрабатывать большие объемы трафика без сбоев.
— Nginx является проектом с открытым исходным кодом, что позволяет пользователям вносить свой вклад в его развитие.

Недостатки Nginx:
— По сравнению с другими прокси, такими как Envoy, Nginx может иметь ограниченный набор функций.
— Nginx может быть менее гибким в управлении трафиком, чем некоторые другие прокси.

Node.js Proxy
Node.js Proxy — это модульный прокси-сервер для Node.js, написанный на JavaScript с использованием Node.js. Это позволяет разработчикам создавать свои собственные прокси-серверы с помощью знакомого языка программирования. Node.js Proxy также поддерживает различные функции, такие как балансировка нагрузки и кэширование.

Преимущества Node.js Proxy:
— Node.js Proxy позволяет разработчикам создавать специализированные прокси-серверы, которые могут быть адаптированы под конкретные нужды.
— Если ваше приложение уже использует Node.js, использование Node.js Proxy может упростить интеграцию.
— Благодаря большому сообществу разработчиков Node.js, существует множество библиотек, которые могут расширить функциональность вашего прокси.

Недостатки Node.js Proxy:
— Node.js может быть менее производительным по сравнению с другими языками программирования, такими как Go, которые используются в Envoy.
— Поскольку Node.js Proxy написан на JavaScript, он может быть уязвимым для некоторых видов атак, таких как XSS.

Установка HHVM и nginx на CentOS 8

HHVM — это виртуальная машина с открытым исходным кодом, предназначенная для выполнения программ, написанных на Hack и PHP. HHVM использует подход JIT-компиляции для достижения более высокой производительности при сохранении гибкости разработки, предоставляемой PHP.

HHVM поддерживает Hack, PHP 5 и основные функции PHP 7.

Внимание: обратите внимание, что HHVM работает только на 64-битных машинах.

Я предполагаю, что у вас есть права root, в противном случае вы должны начинать команды с «sudo».

Начинаем пляски
Прежде всего, вам нужно запустить обновление, чтобы продолжить:
dnf update -y
Теперь вам нужно добавить репозиторий EPEL.
dnf install epel-release -y
dnf repolist
Установите некоторые зависимости для установки HHVM:
dnf -y install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc,numactl}-devel \
{ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel \
lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \
{unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel \
glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel \
mariadb mariadb-server libc-client make git
Теперь мы можем установить HHVM из исходников.

Сперва клонируем репозиторий:
git clone git://github.com/facebook/hhvm.git
cd hhvm
git submodule update --init --recursive
Теперь соберем HHVM:
cmake -DMYSQL_UNIX_SOCK_ADDR=/var/run/mysqld/mysql.sock . # путь сокета MySQL, посмотрите его перед сборкой
make -j [номер_процессорных_ядер] # например make -j 4
make install
Проверим версию HHVM:
hhvm --version

Настройка HHVM и nginx

На этом этапе мы настроим HHVM для работы в качестве службы systemd, которая работает быстрее, чем на системном порте, мы будем запускать HHVM в файле сокета unix.

Перейдите в каталог systemd и создайте файл «hhvm.service»:
cd /etc/systemd/system/
dnf install nano -y
nano hhvm.service
Вставьте приведенную ниже конфигурацию службы в этот файл:
[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
After=network.target nginx.service mariadb.service

[Service]
ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock

[Install]
WantedBy=multi-user.target
Сохраните его и выйдите.

Затем нам нужно отредактировать файл «server.ini» в каталоге HHVM:
cd /etc/hhvm/
nano server.ini
Замените строку «hhvm.server.port» следующей строкой:
hhvm.server.file_socket = /var/run/hhvm/hhvm.sock
Сохраните его и выйдите.

Теперь нам нужно изменить владельца каталога файлов сокета на пользователя «nginx».
chown -R nginx:nginx /var/run/hhvm/
Перезапустите сервис Nginx:
systemctl restart nginx

Конфигурация HHVM и nginx

На этом этапе мы настроим HHVM для работы с веб-сервером nginx, для этого нам нужно создать новый файл конфигурации HHVM и включить его в файл конфигурации Nginx.

Перейдите по указанному ниже пути и создайте файл «hhvm.conf»:
cd /etc/nginx/
nano hhvm.conf
Вставьте конфигурацию ниже:
location ~ \.(hh|php)$ {
root /usr/share/nginx/html;
fastcgi_keep_conn on;
fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Сохраните его и выйдите.

Затем откройте файл «nginx.conf»:
nano nginx.conf
Добавьте следующую строку в директиву «server»:
include /etc/nginx/hhvm.conf;
Проверьте конфигурацию Nginx на наличие синтаксических ошибок и перезапустите службу:
nginx -t
systemctl restart nginx

Тестируем HHVM и nginx

Перейдите в публичный каталог вашего Nginx, путь по умолчанию ниже:
cd /usr/share/nginx/html/
Создайте тестовый файл PHP с помощью текстового редактора, как показано ниже:
nano info.php
Вставьте простой код ниже, сохраните его и выйдите:
<?php phpinfo(); ?>
Теперь вы можете протестировать свой HHVM, открыв свой домен или публичный IP-адрес в браузере, вы должны увидеть страницу, как показано ниже:

Как настроить обратный прокси Nginx в Ubuntu/Debian

Обратный прокси-сервер Nginx HTTPS — это промежуточная прокси-служба, которая принимает запрос клиента, передает его одному или нескольким серверам, а затем доставляет ответ сервера обратно клиенту. Хотя большинство распространенных приложений могут работать как веб-серверы сами по себе, веб-сервер Nginx может предоставлять ряд расширенных функций, таких как балансировка нагрузки, возможности TLS/SSL и ускорение, которых не хватает большинству специализированных приложений. Используя обратный прокси-сервер Nginx, все приложения могут воспользоваться этими функциями.

Преимущества использования обратного прокси Nginx на экземпляре

Установка обратного прокси-сервера Nginx HTTPS дает важные преимущества:
  • Балансировка нагрузки: обратный прокси-сервер Nginx может выполнять балансировку нагрузки, которая помогает равномерно распределять клиентские запросы между внутренними серверами. Это также улучшает избыточность, так как если один сервер выходит из строя, обратный прокси просто перенаправляет запросы на другой сервер в соответствии с политикой маршрутизации.
  • Повышенная безопасность: обратный прокси-сервер Nginx также действует как линия защиты для ваших внутренних серверов. Настройка обратного прокси-сервера гарантирует, что идентификационные данные ваших внутренних серверов останутся неизвестными.
  • Лучшая производительность: известно, что Nginx лучше работает при доставке файлов статического содержимого и анализе URL-адресов.
  • Простота ведения журнала и аудита: поскольку при реализации обратного прокси-сервера Nginx существует только одна точка доступа, это значительно упрощает ведение журнала и аудит.
  • Зашифрованное соединение. Шифрование соединения между клиентом и обратным прокси-сервером Nginx с помощью TLS позволяет пользователям использовать зашифрованное и защищенное соединение HTTPS, защищая свои данные.

Требования

  • У вас есть привилегии sudo или доступ к пользователю root.
  • У вас есть веб-приложение, работающее на нестандартном веб-порту экземпляра.
  • У вас есть вычислительный экземпляр, на котором запущен Ubuntu или Debian.
  • Убедитесь, что ваше доменное имя указывает на IP-адрес вашего сервера (запись A или AAAA).

Установка и настройка Nginx

Примечание. Для этого руководства требуется, чтобы на вашем экземпляре уже было запущено веб-приложение. Вы можете, например, установить легкий веб-сервер, такой как Webfsd, который по умолчанию работает на порту 8000, чтобы к нему можно было подключиться через стандартные порты HTTP через прокси. При необходимости его можно установить с помощью apt install webfs.

В следующем примере мы настроим обратный прокси Nginx перед веб-сервером Apache. В результате мы предполагаем, что Apache уже установлен и настроен (на той же машине).

1. Обновите кеш пакетов APT и установите веб-сервер Nginx через диспетчер пакетов:
apt update
apt install nginx
2. Отключите виртуальный хост по умолчанию, который предварительно настроен при установке Nginx через диспетчер пакетов apt:
unlink /etc/nginx/sites-enabled/default
3. Войдите в каталог /etc/nginx/sites-available и создайте файл конфигурации обратного прокси.
cd /etc/nginx/sites-available
nano reverse-proxy.conf
4. Вставьте следующую конфигурацию Nginx в текстовый редактор. Прокси-сервер перенаправляет все входящие соединения на порт 80 на сервер Webfsd, прослушивая порт 8000. Измените значение порта в зависимости от порта конкретного приложения.
server {
listen 80;
listen [::]:80;

access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;

location / {
    proxy_pass http://127.0.0.1:8000;
    }
}
Примечание. Доступы и ошибки находятся в файлах журнала в /var/log/nginx.

5. Скопируйте конфигурацию из /etc/nginx/sites-available в /etc/nginx/sites-enabled. Рекомендуется использовать символическую ссылку.
ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf
6. Протестируйте файл конфигурации Nginx
nginx -t
который должен вернуть
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
7. Откройте веб-браузер на локальном компьютере и вставьте свой общедоступный IP-адрес, который будет отображать домашнюю страницу вашего веб-приложения.

Добавление TLS к обратному прокси-серверу Nginx с помощью Let's Encrypt

Убедитесь, что ваше доменное имя указывает на IP-адрес вашего сервера (запись A или AAAA). В противном случае будет ошибка.

При текущей настройке весь входящий трафик на стандартном незащищенном HTTP-порту обслуживается Nginx, который передает его веб-приложению на экземпляре.

По соображениям безопасности рекомендуется добавить уровень шифрования с TLS / SSL и использовать HTTPS. Хотя использование самозаверяющих сертификатов технически возможно, это может вызвать очень неудобства, поскольку при использовании самозаверяющего сертификата в веб-браузере пользователя по умолчанию отображается предупреждение. Сертификат аутентификации (CA) может выдавать доверенные сертификаты, которые распознаются большинством современных веб-браузеров. CA Let’s Encrypt предоставляет сертификат TLS бесплатно, а настройку Nginx можно легко выполнить с помощью Certbot, инструмента, предоставляемого EFF.

1. Установите Certbot на свой экземпляр с помощью диспетчера пакетов APT:
apt-get update
apt-get install software-properties-common
apt-get update
apt-get install python-certbot-nginx
2. Certbot предоставляет плагин, разработанный для веб-сервера Nginx, автоматизирующий большую часть работы по настройке, связанной с запросом, установкой и управлением сертификатом TLS:
certbot --nginx
3. Ответьте на запросы, отображаемые на экране, чтобы запросить действительный сертификат Let's Encrypt:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your.domain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for your.domain.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/reverse-proxy.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/reverse-proxy.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://your.domain.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=your.domain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Когда вас спросят, хотите ли вы автоматически перенаправлять HTTP-трафик на HTTPS, выберите вариант 2. Это включает автоматическое перенаправление всех входящих запросов через незашифрованное HTTP-соединение на безопасное HTTPS-соединение. Обеспечение дополнительного уровня безопасности для веб-приложения, работающего за обратным прокси-сервером Nginx.

Как настроить nginx как фронтенд к Apache

В следующем примере мы настроим обратный прокси-сервер Nginx перед веб-сервером Apache. В результате мы предполагаем, что Apache уже установлен и настроен (на той же машине).
Обновите кэш пакетов APT и установите веб-сервер Nginx через Диспетчер пакетов:
apt update
apt install nginx -y
2. Отключите виртуальный хост по умолчанию, предварительно настроенный при установке Nginx через Диспетчер пакетов apt:
unlink /etc/nginx/sites-enabled/default
3. Перейдите в каталог /etc/nginx/sites-available и создайте файл конфигурации обратного прокси-сервера.
cd /etc/nginx/sites-available
nano reverse-proxy.conf
4. Вставьте следующую конфигурацию Nginx в текстовый редактор. Прокси-сервер перенаправляет все входящие соединения по порту 80 на сервер Webfsd, прослушивая порт 8443. Измените значение порта в зависимости от конкретного порта приложения.
server {
listen 80;
listen [::]:80
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
location / {
proxy_pass http://127.0.0.1:8443;
}
}
Примечание: обращения и ошибки находятся в файлах журнала по адресу /var/log/nginx.
5. Скопируйте конфигурацию из файла /etc/nginx/sites-available в файл /etc/nginx/sites-enabled. Рекомендуется использовать символическую ссылку.
ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/reverse-proxy.conf
6. Проверьте конфигурационный файл nginx
nginx -t
должно написать
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
7. Откройте веб-браузер на локальном компьютере и вставьте public_ip, который будет отображать домашнюю страницу веб-приложений.