Используйте njs 0.7.7, чтобы улучшить модульность и возможность повторного использования конфигурации NGINX.

Автор оригинала: Прабхат Дикшитоф F5

Исходная ссылка: Используйте njs 0.7.7 для улучшения модульности и возможности повторного использования конфигурации NGINX.

Источник перепечатки: официальный сайт NGINX.


Единственное официальное китайское сообщество NGINX, расположенное на  nginx.org.cn.

С момента  запуска модуля NGINX JavaScript (njs) (ранее известного как nginScript) в 2015 году и его официального выпуска в 2017 году  , мы постоянно добавляем новые функции и продолжаем улучшать реализацию нашего кода в десятках обновлений версий . Обычно мы ждем выхода NGINX Plus, прежде чем обсуждать возможности новой версии NGINX JavaScript, но на этот раз мы с нетерпением ждем версии 0.7.7 и не можем дождаться!

Важные улучшения в njs 0.7.7 делают вашу конфигурацию NGINX более модульной, организованной и простой в повторном использовании:

  • Теперь вы можете объявлять код njs в применимом контексте, а не глобально, сохраняя свой собственный код ближе к месту использования.

  • Хуки в самом коде njs позволяют изменять поведение в зависимости от контекста выполнения.

  • Новый объект fs.FileHandle делает операции с файлами более эффективными .

Чтобы узнать больше о njs и просмотреть список вариантов использования (с примером кода), прочтите нашу публикацию в блоге. Используйте мощь и удобство JavaScript для быстрой обработки каждого запроса с помощью модуля JavaScript NGINX.

Объявляйте код и переменные JavaScript в локальном контексте

В предыдущих версиях njs вам приходилось импортировать код JavaScript и объявлять соответствующие переменные в http или потоковом контексте верхнего уровня (используя директивы js_import, js_path, js_set и js_var), что было эквивалентно объявлению глобальных переменных вверху. основного файла.

Но инструкции, которые на самом деле вызывают функции и переменные JavaScript, появляются в подконтекстах — например,  директива js_content  в  блоке HTTP location{}  ,  директива js_access  в  блоке Stream server{}  . Это создает две проблемы:

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

2. В подконтексте также невозможно четко увидеть, где импортируется и объявляется код и переменные. Хотя мы рекомендуем добавлять только блоки http{} иstream{} в основной файл конфигурации ( nginx.conf ) и использовать  директивы include  для чтения из  каталогов /etc/nginx/conf.d  и  /etc/nginx/stream.d  . Меньше файлы конфигурации для конкретных функций. Но конфигурация NGINX очень гибкая — вы можете добавлять блоки http{} иstream{} в несколько файлов. Это будет проблемой в среде, где над вашей конфигурацией NGINX работают несколько человек и установленные правила не всегда соблюдаются.

В njs 0.7.7 и более поздних версиях вы можете импортировать код и объявлять переменные в том контексте, где они используются:

HTTP —

Следующие директивы могут появляться в  контекстах сервера  и  местоположения  , а также в контексте http:

  • js_import

  • js_path

  • js_set

  • js_var

Следующие директивы могут появляться в контексте if, а также в  контексте location  и limit_Exception :

  • **js_body_filter **

  • js_content

  • js_header_filter

Поток . Эти директивы могут появляться как в контексте сервера  , так и в контексте потока  :

  • js_import

  • js_path

  • js_set

  • js_var

Помещение всей конфигурации njs для конкретного варианта использования в один файл также улучшает модульность и переносимость вашего кода.

Например, в предыдущих версиях njs при добавлении нового скрипта приходилось менять как nginx.conf (добавив js_import и, возможно, js_path, js_set и js_var), так и файл, вызывающий функцию JavaScript (здесь jscode_local.conf).

Вы можете нажать на статью «Использование njs 0.7.7 для улучшения модульности и возможности повторного использования конфигурации NGINX», чтобы просмотреть код здесь .

В njs 0.7.7 или выше все конфигурации, связанные с функцией util, находятся в файле jscode_integrated.conf:

Вы можете нажать на статью «Использование njs 0.7.7 для улучшения модульности и возможности повторного использования конфигурации NGINX», чтобы просмотреть код здесь .

Изменение поведения в зависимости от контекста выполнения

Несколько новых функций в njs 0.7.7 позволяют вам изменять поведение кода JavaScript в зависимости от контекста (фазы обработки), в котором он выполняется.

Атрибут HTTP r.internal

Атрибут HTTP r.internal  — это логический флаг,   для внутренних запросов которого установлено значение «true» (обрабатывается блоком location{} с добавленной внутренней директивой). Когда сценарий использует общие обработчики событий, которые можно вызывать как во внутреннем, так и во внутреннем контекстах, вы можете использовать флаг r.internal для разветвления логики.

Ниже приведен внутренний запрос:

  •  Запросы, перенаправленные с помощью  инструкций error_page , index , random_index  и  try_files

  • Запросы, перенаправленные через заголовок ответа X-Accel-Redirect с вышестоящего сервера

  •  Подзапросы, вызываемые через   директивы auth_request  и  Mirror ,  директивы в  модуле ngx_http_addition_module или ссылки на стороне сервера (SSI), ссылаются на виртуальные команды (на базе модуля ngx_http_ssi_module )

  •  Запросы, измененные директивой  перезаписи

Улучшен метод потока s.send().

В более ранних версиях njs метод Stream  s.send()  был контекстно-зависимым, поскольку направление отправки данных зависело от местоположения обратного вызова (восходящего или нисходящего), из которого вызывался метод. Это подходит для синхронных обратных вызовов (s.send() изначально был разработан для синхронных обратных вызовов), но не для асинхронных функций, таких как ngx.fetch().

В njs 0.7.7 и более поздних версиях направление отправки данных хранится в отдельном внутреннем флаге, доступном для s.send().

Используйте новый объект fs.FileHandle() для более эффективных операций с файлами.

Модуль файловой системы (fs) реализует операции с файлами. Новый объект FileHandle в модуле fs — это объектная оболочка для числового дескриптора файла. Экземпляры объектов FileHandle создаются с помощью метода fs.promises.open().

Используйте объект FileHandle для получения дескриптора файла, который можно использовать для:

  • Выполнять в файле такие функции, как read() и write().

  • Откройте файл и выполните чтение и запись в указанном месте, не читая весь файл.

Реализованы следующие свойства FileHandle (информацию об обязательных и необязательных параметрах каждого свойства см. в документации):

  • дескриптор файла.fd

  • дескриптор файла.читать()

  • дескриптор файла.stat()

  • дескриптор файла.write()

  • дескриптор файла.write()

  • дескриптор файла.закрыть()

Следующие методы были обновлены для поддержки FileHandle (информацию о параметрах каждого метода см. в связанной документации):

  • фс.openSync()

  • фс.обещания.open()

  • фс.fstatSync()

  • фс.readSync()

  • fs.writeSync() (буфер)

  • fs.writeSync() (строка)

Улучшите свою конфигурацию с помощью nj

Благодаря njs 0.7.7 вашей команде будет проще работать с кодом njs и делиться им. Расширенный контекст директивы njs упрощает расширение конфигураций NGINX с помощью специального кода JavaScript.

Вы можете использовать его со шлюзом API, обратным прокси-сервером или веб-сервером, а не только с промежуточным программным обеспечением или пограничными компонентами. Вы можете сделать его частью своего приложения с помощью JavaScript, TypeScript  или сторонних модулей узлов , не добавляя в стек дополнительных компонентов. Просто используйте NGINX!


Единственное официальное китайское сообщество NGINX, расположенное на nginx.org.cn.

Дополнительная техническая информация о NGINX, интерактивные вопросы и ответы, серии курсов и ресурсы для мероприятий:

Ежегодное обновление основной версии IntelliJ IDEA 2023.3 и JetBrains Family Bucket. Новая концепция «защитного программирования»: обеспечьте себе стабильную работу. GitHub.com поддерживает более 1200 хостов MySQL. Как плавно перейти на версию 8.0? Команда Стивена Чоу по Web3 запустит независимое приложение в следующем месяце. Будет ли Firefox ликвидирован? Выпущен Visual Studio Code 1.85, плавающее окно США CISA рекомендует отказаться от C/C++ для устранения уязвимостей безопасности памяти Ю Чэндун : Huawei выпустит революционные продукты в следующем году и перепишет историю отрасли TIOBE Декабрь: Ожидается, что C# станет языком программирования года написано Лэй Цзюнем 30 лет назад: «Принцип и конструкция экспертной системы обнаружения компьютерных вирусов»
{{o.name}}
{{м.имя}}

Supongo que te gusta

Origin my.oschina.net/u/5246775/blog/10091011
Recomendado
Clasificación