Я пытался настроить свой Ubiquiti ErPoe-5 (прошивка 1.9.1) для запуска обратного прокси с использованием nginx уже несколько дней, и кажется, что большинство моих проблем вызвано тем, что я не могу получить последняя версия nginx на устройстве.

Уроки, которые я видел по установке nginx на нем, позволяют мне узнать только о nginx 1.2, который не поддерживает websockets или HTTP2. HTTP2 не является обязательным требованием, но поддержка веб-сокетов является обязательной для внутренних ресурсов, которые я хочу предоставить через обратный прокси-сервер. Фактически, сам маршрутизатор использует их в своем собственном веб-интерфейсе управления, и из этого поста на форумах ubiquiti следует, что вам может понадобиться и HTTP2 для него.

1 ответ1

2

ПРИМЕЧАНИЕ. Этот ответ предполагает, что вы обладаете достаточными знаниями об общих командах Linux и / или, по крайней мере, имеете возможность войти в свой маршрутизатор через SSH. Если вы этого не сделаете, то вам следует освежить свои навыки, чтобы выполнить эти предварительные условия, прежде чем продолжить, поскольку я не планирую освещать основы сценариев Linux или команд в ответе или в последующих комментариях.


Справочная информация и отказ от ответственности (1.2 безопасен, но 1.14 работает)

Маршрутизаторы Ubiquiti Edge в настоящее время основаны на Debian 7.11 - т.е. wheezy - и, следовательно, лучшее, что вы получите, не нарушая норм, - это nginx 1.6 (с использованием репозитория wheezy-backports вместо или в дополнение к wheezy). Это будет работать для поддержки веб-сокетов, но новые опции, такие как http2, все еще будут отсутствовать.

Чтобы получить более новые версии, такие как 1.14, вам нужно будет немного выйти из зоны комфорта и начать использовать новые репозитории Debian 9.5 - то есть stretch и stretch-backports . Я говорю "выйти из своей зоны комфорта" не из-за плохого опыта, а потому, что логика подсказывает, что, вероятно, есть причина, по которой Ubiquiti все еще использует wheezy на маршрутизаторе. Таким образом, некоторый риск связан с использованием пакетов stretch когда они зависят от обновления других пакетов, которые может использовать маршрутизатор (например, libc6).

Поэтому, хотя я не могу сказать, что приведенное ниже решение не нарушит ЛЮБУЮ функцию на маршрутизаторе, я могу сказать, что я использую значительное количество функций маршрутизатора (включая сервер / клиент openvpn, балансировку нагрузки и VLAN), и у меня нет не было никаких проблем.

Я также был в состоянии успешно повторно прошить текущую версию ОС / прошивки Ubiquiti EdgeMax (1.10.8) без каких-либо проблем, которые возвращают все пакеты к их исходным / стандартным версиям. (но учтите, что при перепрошивке прошивки также стираются все сделанные вами изменения / настройки, которые вы не сохранили в каталоге /config - всегда храните их где-нибудь в /config а затем добавьте сценарий запуска в /config/scripts/post-config.d который поддерживает ссылку на них в других местах по мере необходимости)

Итак, я чувствую себя довольно комфортно, говоря, что будущие обновления Ubiquiti, вероятно, будут устанавливаться нормально после этой установки - хотя вам придется переустанавливать nginx снова (возможно, используя скрипт ниже).

Теперь, когда обычные заявления об отказе от ответственности находятся в стороне, вот что работает для меня.


Мое решение (нарушить правила и получить 1.14)

Безопасность прежде всего

  1. Сделайте резервную копию вашего конфига.

  2. Если вы уже пытались установить nginx, неплохо было бы также продолжить и переустановить последнюю версию прошивки, чтобы вернуть все обратно к хорошей базовой точке (будьте осторожны, если вы добавили какие-либо настройки / настройки вне обычной конфигурации CLI или параметров веб-интерфейса - вы можете их потерять).

  3. Поскольку вы будете работать со службами, которые управляют веб-интерфейсом, вероятно, было бы разумно ознакомиться с командами, необходимыми для прошивки обновлений прошивки также из SSH (СОВЕТ: add system image https://dl.ubnt.com/firmwares/edgemax/v1.10.x/ER-e100.v1.10.8.5142440.tar).

Теперь самое интересное

SSH * в ваш маршрутизатор и запустите следующий скрипт (или эквивалентные операторы), который будет:

  • Настройте соответствующие репозитории Debian (stretch и stretch-backports)
  • Настройка приоритеты хранилища предпочитать stretch-backports (если вы хотите использовать Nginx 1.10.3 измените ниже сценарий предпочитают stretch , а не stretch-backports удалив его из приоритета - 910)
  • Настройте сценарий запуска, который будет использоваться для создания каталога журнала nginx при каждой загрузке системы (в противном случае nginx не запустится при перезагрузке маршрутизатора)
  • Загрузите / установите последний стабильный пакет nginx-light (1.14.0 на момент написания статьи).

* Вам НЕ следует использовать функцию CLI в веб-интерфейсе вместо SSH, поскольку веб-интерфейс, вероятно, станет временно неработоспособным как часть этого процесса.

#! /bin/bash

vcfg=/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper

echo Updating package repositories ...
echo

$vcfg begin

$vcfg delete system package

$vcfg set system package repository stretch url http://ftp.us.debian.org/debian
$vcfg set system package repository stretch components "main contrib non-free"
$vcfg set system package repository stretch distribution stretch

$vcfg set system package repository stretch-backports url http://ftp.us.debian.org/debian
$vcfg set system package repository stretch-backports components "main contrib non-free"
$vcfg set system package repository stretch-backports distribution stretch-backports

$vcfg commit

$vcfg end

apt-get update

echo
echo Setting repository priorities ...
echo

echo "Package: *
Pin: release a=stretch
Pin-Priority: 900

Package: *
Pin: release a=stretch-backports
Pin-Priority: 910">/etc/apt/preferences.d/stretch

echo
echo Temporarily stopping the current web interface ...
echo
kill -SIGTERM $(cat /var/run/lighttpd.pid)

echo
echo Installing nginx-light ...
echo

echo "#! /bin/bash
[ -d /var/log/nginx ] || mkdir /var/log/nginx">/config/scripts/post-config.d/create_nginx_log_dir
chmod a+x /config/scripts/post-config.d/create_nginx_log_dir

[ -d /var/log/nginx ] || mkdir /var/log/nginx

apt-get install nginx-light -V -y

echo
echo Restarting the old web interface ...
echo
service nginx stop
/usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf

echo
echo Updating the nginx default site listen on non-standard ports ...
echo

sed -i -E 's/^(\s*)(listen\s+(:|\[|\])*)([0-9]+)(;|\s)/\1\2\4\4\5/g' /etc/nginx/sites-enabled/default

echo
echo Starting the nginx service ...
echo

service nginx start

echo
echo Installation complete.

[Ответьте «y Enter » на запрос о перезапуске служб]

Теперь у вас должна быть работающая установка nginx, и вы сможете проверить ее, перейдя по http://<router IP address>:8080 в вашем веб-браузере. Обратите внимание на использование порта 8080 который должен был быть настроен командой sed в приведенном выше сценарии, а не по умолчанию для порта 80 который, вероятно, конфликтовал бы с вашим веб-интерфейсом маршрутизатора по умолчанию.

Будет ли nginx служить обратным прокси-сервером для вашего роутера?

Лично я предпочитаю использовать нестандартный порт (553 в приведенном ниже примере конфигурации) для службы / графического интерфейса lighttpd предоставляемой по умолчанию на маршрутизаторе, а затем использовать nginx (прослушивание на стандартных портах 80/443) в качестве обратного прокси-сервера для lighttpd , Это позволяет мне использовать одно доменное имя для всех веб-сайтов моей локальной сети, включая маршрутизатор (т.е. router.myhouse.com, nas.myhouse.com и т.д.) Если вы хотите сделать то же самое, вы можете изменить свой порт графического интерфейса с помощью инструкции configure -> set service gui http(s)-port ### или сделать то же самое изменение в разделе Config Tree веб-интерфейса / графического интерфейса.

Настройте nginx с помощью файла конфигурации обратного прокси

Далее вы захотите настроить nginx для работы в качестве обратного прокси-сервера для некоторого ресурса. Как правило, это будет ресурс локальной сети, доступный с использованием определенного имени хоста / домена в URL-адресе, который разрешается в порт прослушивания nginx маршрутизатора.

Для этого вы создаете файл конфигурации nginx в каталоге /etc/nginx/sites-enabled (или, что еще лучше, создаете его в /config/user-data а затем создаете ссылку на него в /etc/nginx/sites-enabled каталог - это облегчит восстановление после обновлений, которые сбрасывают содержимое каталога /etc ).

Существует множество примеров файлов конфигурации nginx в сети, но приведенный ниже пример может оказаться полезным, если вы планируете разместить свой интерфейс маршрутизатора (или какой-либо другой веб-сайт, использующий веб-сокеты) за обратным прокси-сервером nginx. Или, если вы хотите специально установить Synology NAS (фотостанция, в частности, немного хитрая).

upstream edgemax {
  server 192.168.1.1:553;
  keepalive 32;
}

upstream nas {
  server 192.168.1.7:5001;
  keepalive 32;
}

upstream nasphoto {
  server 192.168.1.5:443;
  keepalive 32;
}

upstream nasfile {
  server 192.168.1.7:7001;
  keepalive 32;
}

server {
  listen 443 ssl http2;
  server_name router.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  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;

  location / {
    proxy_pass https://edgemax;
  }
}

server {
  listen 443 ssl http2;
  server_name nas.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  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-Forward-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass https://nas;
  }

  location /photo {
    proxy_pass https://nasphoto/photo;
  }
}

server {
  listen 443 ssl http2;
  server_name files.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  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-Forward-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass https://nasfile;
  }
}

server {
  listen 443 ssl http2;
  server_name photos.*;

  ssl_certificate /config/user-data/ssl_chain_key.pem;
  ssl_certificate_key /config/user-data/ssl_chain_key.pem;

  client_max_body_size 0;
  proxy_http_version 1.1;
  proxy_buffering off;
  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-Forward-For $proxy_add_x_forwarded_for;

  rewrite ^/photo/(.*)$ /$1;

  location / {
    proxy_pass https://nasphoto/photo/;
  }
}

Как только файл конфигурации обратного прокси-сервера будет создан, вы можете запустить sudo service nginx restart чтобы сделать его эффективным. Обратитесь к /var/log/nginx/error.log если есть проблемы.

СОВЕТ № 1: Если вы планируете использовать нестандартный порт для обратного прокси-сервера nginx (т. Е. В конфигурации вашего обратного прокси-сервера указано что-то отличное от listen 80 и / или listen 443), вы, вероятно, будете готовы заменить proxy_set_header Host $host; в приведенном выше конфиге с proxy_set_header Host $http_host; , Это особенно важно для веб-сокетов, которые, кажется, всегда хотят, чтобы веб-клиенты запрашивали трафик через порты по умолчанию, в противном случае это приводит к интерфейсам, в которых отсутствуют компоненты или текущие данные. (Вы также можете попробовать proxy_set_header Host $host:$server_port; но учтите, что это заметно отличается, так как он всегда добавляет порт в заголовок, даже если он не использовался в исходном запросе)

СОВЕТ №2. Также обратите внимание на использование server_name router.* Что просто означает, что использование URL- маршрутизатора. < Что- router.<anything>.<anything> Что- нибудь> для просмотра обратного прокси-сервера nginx приведет к применению этого раздела конфигурации. (В большинстве примеров вы найдете полное / явное доменное имя, например router.domain.com)

Это полезно не только с целью возможного изменения доменных имен / имен DNS (т. Е. Работает для router.home.com а также router.home.net без изменения конфигурации), но также помогает сократить ваши записи server_name . Это важно, потому что длинные имена часто приводят к ошибкам, говорящим о том, что "при увеличении размера корзины" вы запускаете nginx. Если у вас должны быть длинные имена, вам, вероятно, потребуется настроить значения server_names_hash_max_size и / или server_names_hash_bucket_size в вашей конфигурации.


ОБНОВЛЕНИЕ: я успешно обновил свой маршрутизатор с EdgeOS версии 1.9.1 до каждой версии между 1.10.8 включительно и практически без проблем. На маршрутизаторе не было nginx после обновления (как и ожидалось), но я смог запустить свой скрипт (первый блок кода в этом ответе), и он вернулся обратно. Сохранение настроек в /config и использование сценариев в /config/scripts/post-config.d для поддержки любых изменений, которые не переживают перезагрузку / обновление, является ключом к плавности плавания здесь.

ОБНОВЛЕНИЕ № 2: Этот процесс работает на меньших маршрутизаторах, таких как ER-X. Однако из-за ограниченного объема памяти на устройстве вам придется удалить неактивный образ прошивки, чтобы освободить место для nginx. Это нужно делать и после каждого обновления. Чтобы удалить неактивный образ прошивки, запустите delete system image и ответьте «да» на приглашение (я).

- Мой процесс обновления ER-X -

  1. Сделайте резервную копию моего конфига !!!!
  2. Обновите микропрограмму до последней версии и перезагрузите компьютер (и проверьте основные функции, отличные от nginx)
  3. Удалите старую прошивку (которая теперь является неактивным образом) с помощью команды delete system image (show system storage отчеты об использовании системы хранятся 80% до удаления и 36% после)
  4. Используйте сценарии / шаги выше, чтобы переустановить nginx (показать отчеты о show system storage 79% после установки)
  5. Запустите sudo apt-get clean чтобы освободить место, используемое временными файлами и т.д. (Показать отчеты об использовании show system storage 61% после очистки)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .