Разнообразие приложений с открытым исходным кодом является самым большим благом в бесплатном и с открытым исходным программным обеспечением ( foss) Движение и его величайшее препятствие для усыновления. Вы не всегда владеете приложением, которое вы потребляете, и это часто бывает с определенными мнениями и ограничениями, налагаемыми автором программного обеспечения — намеренно или иным образом.
Обратные прокси являются одним из способов вернуть контроль над деталями реализации этих продуктов. Отфильтровывая данные в Слой 7 (или, на уровне приложения), способный процессор, вы можете манипулировать, шифровать и расшифровать, перенаправить и контролировать, как данные, предназначенные для ваших услуг, могут течь и вести себя.
Что такое Nginx и зачем вам это нужно?
Одним из замечательных примеров управления этими данными является Nginx. Nginx это веб-сервер с открытым исходным кодом, который является мировым лидером в области балансировки нагрузки и прокси-прокси. Он поставляется с множеством плагинов и возможностей, которые могут настроить поведение приложения, используя легкий и простой для понимания пакет. Согласно NetCraft и W3Techs, Nginx обслуживает приблизительно 31-36% активных веб-сайтов, ставя его шее и шею Apache в качестве предпочтительного веб-сервера мира. Это означает, что это не только уважаемый, доверенный, достаточный характер для большой части производственных систем и совместимый практически с любой архитектурой, но также имеет лояльные последователи инженеров и разработчиков, поддерживающих проект. Это ключевые факторы при рассмотрении долговечности вашего приложения, насколько это может быть портативно и где оно может быть размещено.
Хероку и Нгинкс
Давайте посмотрим на ситуацию, когда вам может понадобиться Nginx. В нашем примере вы создали приложение и развернули его на платформе в качестве услуги (PAAS) — в нашем случае, Хероку. С PAAS ваша жизнь проще, так как решения об инфраструктуре, мониторинге и поддержке уже были приняты для вас, гарантируя для вас в чистую среду, чтобы легко запустить свои приложения. Однако, чтобы получить эти преимущества PAAS, ваше приложение должно соответствовать ограничениям поставщика.
Когда вы пишете пользовательский код самостоятельно, это не проблема; Просто добавьте крючки, необходимые для инфраструктуры, и вы отправляетесь на гонки. Однако, когда вам нужно использовать стороннюю услугу или продукт, который не соответствует форме этой инфраструктуры, такой как наш пример BookStack ниже, единственный способ разработки этой интеграции может быть с трафиком среднего уровня, такого как Nginx Анкет
Итак, давайте посмотрим на три способа использования Nginx для настройки поведения вашего приложения в Heroku.
- Динамическое назначение портов сервера в среде выполнения контейнера
- Добавление базовой аутентификации в ваше приложение
- Отражение трафика для тестирования изменений приложений без влияния на производственную услугу
Динамическое привязка среднего уровня
Во -первых, давайте посмотрим на привязку динамического порта. Чтобы обслуживать трафик в веб -динасе Heroku, вам нужен доступ к переменной среды, называемой «порт». Эта переменная изменяется с каждым развертыванием и не рекламируется до запуска приложения. Это четкий блокировщик для любой услуги, которая не имеет способа привязки к такому динамическому порту.
Heroku предлагает сборки сборки, которые могут автоматизировать развертывание и конфигурацию такого среднего уровня, но решение для динамических переменных не всегда может быть таким простым. Есть моменты, когда нам может понадобиться решить эти или подобные проблемы без помощи поставщика. Итак, давайте посмотрим, как мы могли бы вручную создать решение, которое может преобразовать статически настроенное приложение в динамически настроенное, используя BookStack.
BookStack это самопровозглашенная самоуверенная вики-система, построенная в Ларавеле с бэкэнд MySQL. BookStack взял несколько дизайнерских соображений из рук приложения развертывателя, чтобы упростить как общую архитектуру поддержки, так и для предотвращения кроличьей дыры на страницах вики, которые никогда не встречаются, когда они наиболее необходимы.
Чтобы подготовиться, нам понадобится несколько фрагментов, собранных из официальной документации BookStack & Nginx, чтобы собрать DockerFile и несколько основных файлов лесов. Вы можете увидеть весь проект здесь: https://github.com/tokugero/bookstack-demo.
Давайте посмотрим на Dockerfile:
FROM debian:stable-slim ENV PORT="80" ENV APP_URL="http://localhost/" ADD https://github.com/BookStackApp/BookStack/archive/release.zip /bookstack/ ADD https://getcomposer.org/installer /root/composer-setup.php RUN apt-get update && \ apt-get install -y \ unzip \ php-cli \ php-mbstring \ php7.3-curl \ php7.3-dom \ php7.3-gd \ php7.3-mysql \ php7.3-tidy \ php7.3-xml \ php-fpm \ nginx && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN unzip /bookstack/release.zip -d / && \ rm /bookstack/release.zip && \ php /root/composer-setup.php --install-dir=/usr/local/bin --filename=composer && \ mkdir -p /var/lib/nginx && \ touch /run/nginx.pid && \ touch /var/log/php7.3-fpm.log COPY config/bookstack.env /BookStack-release/.env COPY config/nginx.conf /etc/nginx/nginx.conf COPY scripts/run.sh /BookStack-release/run.sh COPY config/nginx.htpasswd /BookStack-release/.htpasswd RUN cd /BookStack-release && \ composer install --no-dev && \ chown -R www-data:www-data /BookStack-release/ && \ chown -R www-data:www-data /etc/nginx/ && \ chown -R www-data:www-data /var/lib/nginx/ && \ chown -R www-data:www-data /etc/php/7.3/fpm/ && \ chown www-data:www-data /run/nginx.pid && \ chown www-data:www-data /var/log/php7.3-fpm.log && \ chmod 600 .htpasswd USER www-data WORKDIR /BookStack-release/ ENTRYPOINT ["./run.sh"]
Scripts/run.sh
#!/bin/bash sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/nginx.conf sed -i -e 's,APPURL,'${APP_URL}',g' /BookStack-release/.env sed -i -e 's,listen = /run/php/php7.3-fpm.sock,listen = 127.0.0.1:9000,g' /etc/php/7.3/fpm/pool.d/www.conf sed -i -e 's,pid = /run/php/php7.3-fpm.pid,pid = php7.3-fpm.pid,g' /etc/php/7.3/fpm/php-fpm.conf cd /BookStack-release/ && \ echo yes | php artisan key:generate && \ echo yes | php artisan migrate php-fpm7.3 & \ nginx -g 'daemon off;'
config/nginx.conf
worker_processes 4; error_log /dev/stderr; user www-data; include /etc/nginx/modules/*.conf; events { worker_connections 4096; ## Default: 1024 } http { include /etc/nginx/fastcgi.conf; include /etc/nginx/mime.types; index index.html index.htm index.php; default_type application/octet-stream; access_log /dev/stdout; sendfile on; tcp_nopush on; server { #This is updated via sed in ./scripts/run.sh at runtime listen $PORT; server_name _; root /BookStack-release/public; client_max_body_size 0; location / { index index.php; try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } # Mitigate https://httpoxy.org/ vulnerabilities fastcgi_param HTTP_PROXY ""; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # include the fastcgi_param setting include fastcgi_params; # SCRIPT_FILENAME parameter is used for PHP FPM determining # the script name. If it is not set in fastcgi_params file, # i.e. /etc/nginx/fastcgi_params or in the parent contexts, # please comment off following line: fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
#### config/bookstack.env APP_KEY=replaceme APP_URL=APPURL
Теперь это кажется многое, но давайте разберем некоторые из наиболее важных кусочков, которые составляют основную функциональность.
DockerFile имеет много линий, которые предназначены в первую очередь для установки самого приложения. Они были найдены в официальной документации BookStack и используются для вручную установить свой сервис вместе с несколькими дополнительными пакетами. Цель состоит в том, чтобы применить окружающую среду. Чтобы сделать сервис более динамичной, есть три конкретные линии:
... ENV PORT="80" ENV APP_URL="[http://localhost/](http://localhost/)" ... ENTRYPOINT ["./run.sh"]
Это устанавливает переменную среды по умолчанию и вызывает произвольный скрипт оболочки, чтобы заменить значения файла конфигурации NGINX со значениями среды во время выполнения. При этом мы можем настроить это приложение, как нам нравится. Вместо жестких переменных для запуска этой службы мы теперь можем создать экземпляр службы на локальном уровне:
docker run -it -d -e APP_URL=http://localhost:9876 -e PORT=8080 -p 9876:8080 bookstack-demo
Обратите внимание, как теперь мы можем объявить порт во время выполнения без какой -либо специальной конфигурации самого приложения — основного требования по разоблачению сервиса на веб -динациях Heroku. Чтобы пройти их, мы просто использовали SED, чтобы заменить переменные среды на жестко кодированные значения во время выполнения.
sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/nginx.conf; sed -i -e 's,APPURL,'${APP_URL}',g' /BookStack-release/.env;
В нашем скрипте run.sh, который инициирует первичную команду контейнера, мы можем использовать наш редактор потока/SED, чтобы заменить предварительно определенные переменные в файле конфигурации Nginx, а также файл выделенной среды приложения. Когда мы делаем это до нашей инициализации Nginx, мы гарантируем, что приложение начинается с порта, который Heroku определяет после того, как контейнер был введен в жизнь.
И одна окончательная команда развертывания:
heroku container:push web -a bookstack-demo && heroku container:release web -a bookstack-demo
Простая базовая аутентификация
Некоторые функции просто недоступны в нашей новой среде инфраструктуры без специальных плагинов. Но, возможно, мы хотим, чтобы простой пароль предотвращал доступ произвольных запросов, пока мы находимся на начальных этапах проекта. NGINX включает в себя большой набор возможностей автоматически, одним из которых является основная аутентификация на основе для каждого сервера или для каждого размещения. Это позволяет нам защищать наше приложение FOSS без какой -либо работы на конце Heroku’s или BookStack’s.
Со всем предыдущим работой, мы можем просто добавить несколько строк в наш проект, чтобы заставить базовую аутентификацию в нашем приложении. С помощью Auth_basic Module наряду с Апачем htpasswd Инструмент, мы можем добавить:
config/nginx.conf
... location / { auth_basic "Under Construction"; auth_basic_user_file /BookStack-release/.htpasswd; index index.php; try_files $uri $uri/ /index.php?$query_string; } ...
Не забудьте сгенерировать пароль и включить его в DockerFile:
bookstack-demo$ htpasswd config/nginx.htpasswd myuser New password: mypass Re-type new password: mypass Updating password for user myuser
Dockerfile
... COPY config/nginx.htpasswd /BookStack-release/.htpasswd ... RUN cd /BookStack-release && \ ... chmod 600 .htpasswd ...
Вот что мы теперь видим, когда пытаемся получить доступ к приложению:
Усовершенствованный тени для трафика
Наш последний пример — специальный модуль Nginx, который Зеркала трафик в любое место по вашему выбору (без влияния на пункт назначения исходного запроса). Это отличный инструмент для тестирования рефакторов кода, изменений макета и других изменений с реальным производственным трафиком.
config/nginx.conf
server { mirror /mirror; mirror_request_body on; ... location = /mirror { resolver 1.1.1.1 valid=30s; internal; proxy_pass https://bookstack-mirror-demo.herokuapp.com$request_uri; } ...
Инструмент Heroku Native
Мы упомянули Хероку Nginx buildpack ранее. Он может автоматизировать некоторые из этих функций управления портами, позволяя нам ударить по земле без каких -либо специально куриных функций от Nginx. Наш пример напрямую сравнивается с этим подходом, но нативный инструмент обеспечивает меньшую сторону между ресурсами документации.
Чтобы сгенерировать наш зеркальный сайт, мы собираемся использовать нативный пакет Heroku для добавления функциональности Nginx к произвольному проекту без всей пользовательской докеризации в примерах выше.
Просто породите новый репозиторий:
mkdir bookstack-mirror-demo; cd bookstack-mirror-demo; git init;
Добавьте файлы шаблонов:
config/nginx.conf.erb
daemon off; # Heroku dynos have at least 4 cores. worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>; events { use epoll; accept_mutex on; worker_connections <%= ENV['NGINX_WORKER_CONNECTIONS'] || 1024 %>; } http { gzip on; gzip_comp_level 2; gzip_min_length 512; server_tokens off; log_format l2met 'measure#nginx.service=$request_time request_id=$http_x_request_id'; access_log <%= ENV['NGINX_ACCESS_LOG_PATH'] || 'logs/nginx/access.log' %> l2met; error_log <%= ENV['NGINX_ERROR_LOG_PATH'] || 'logs/nginx/error.log' %>; include mime.types; default_type application/octet-stream; sendfile on; # Must read the body in 5 seconds. client_body_timeout <%= ENV['NGINX_CLIENT_BODY_TIMEOUT'] || 5 %>; server { listen <%= ENV["PORT"] %>; server_name _; keepalive_timeout 5; client_max_body_size <%= ENV['NGINX_CLIENT_MAX_BODY_SIZE'] || 1 %>M; root /app/public; # path to your app } }
Прозвать
web: bin/start-nginx-solo
Добавьте свои файлы в свой heroku git:
heroku git:remote -a bookstack-mirror-demo git add *; git commit -am "Initial commit" heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nginx -a bookstack-mirror-demo git push heroku master
Теперь вы можете начать отражать свой трафик и клонировать свой сервис!
Вывод
Бесплатное программное обеспечение с открытым исходным кодом является отличным строительным блоком для любого пользовательского набора приложений. Независимо от его родных ограничений на то, как его можно использовать, его можно настроить для работы в пределах вашей среды. Надеемся, что теперь у вас есть некоторые идеи о том, как абстрагировать ваше приложение из любой структуры, в которой оно находится, и как вы можете использовать огромную гибкость среднего уровня, как Nginx для расширения возможностей ваших приложений.
Оригинал: «https://dev.to/heroku/using-nginx-to-customize-control-of-your-hosted-app-25c1»