Как использовать OpenResty Web Framework для Nginx в Ubuntu 16.04

Вступление

OpenResty - веб-сервер, который расширяет Nginx, связывая его со многими полезными модулями Nginx и библиотеками Lua. OpenResty отлично справляется с масштабированием веб-приложений и сервисов. Например, один модуль, который он включает, позволяет вам писать код Lua, который будет выполняться непосредственно на рабочем месте Nginx, обеспечивая высокопроизводительные приложения.

В этом руководстве вы настроите OpenResty из исходного кода; готовые пакеты для некоторых дистрибутивов могут быть устаревшими. Вы также изучите несколько простых примеров приложений с уникальными функциями OpenResty.

Предпосылки

Чтобы следовать этому руководству, вам потребуется:

  • Один сервер Ubuntu 16.04, настроенный с помощью учебника Initial Server Setup с Ubuntu 16.04, включая sudo non -руткит и брандмауэр.

Обратите внимание, что Nginx * не * должен быть установлен. Он включен в OpenResty, и его преждевременная установка будет конфликтовать.

Шаг 1 - Загрузка исходного кода и зависимостей OpenResty

В этом разделе мы установим OpenResty из исходного кода.

Сначала найдите последнюю версию исходного кода OpenResty со страницы Download на веб-сайте OpenResty. Загрузите tarball, убедившись, что номер версии заменяется последней версией, если она изменилась.

wget https://openresty.org/download/openresty-.tar.gz

Загрузите файл ключа PGP, чтобы мы могли проверить его содержимое.

wget https://openresty.org/download/openresty-.tar.gz.asc

Далее нам нужно добавить открытый ключ автора, как указано на странице загрузки. На момент написания, это открытый ключ + A0E98066 +. Однако, проверьте, изменилось ли оно; он указан на той же странице загрузок.

gpg --keyserver pgpkeys.mit.edu --recv-key

Вы должны увидеть следующий вывод (с вашим именем пользователя вместо * sammy *):

Outputgpg: directory `/home/sammy/.gnupg' created
gpg: new configuration file `/home/sammy/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/sammy/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/sammy/.gnupg/secring.gpg' created
gpg: keyring `/home/sammy/.gnupg/pubring.gpg' created
gpg: requesting key A0E98066 from hkp server pgpkeys.mit.edu
gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
gpg: key A0E98066: public key "Yichun Zhang (agentzh) <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Убедитесь, что имя в открытом ключе (в данном случае это «Yichun Zhang») соответствует имени, указанному на веб-сайте OpenResty.

Теперь проверьте, совпадает ли файл подписи с загруженным файлом + .tar.gz.

gpg openresty-.tar.gz.asc

Вы увидите следующий вывод:

Outputgpg: assuming signed data in `openresty-.tar.gz'
gpg: Signature made Thu 17 Nov 2016 10:24:29 PM UTC using RSA key ID A0E98066
gpg:  from "Yichun Zhang (agentzh) <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 2545 1EB0 8846 0026 195B  D62C B550 E09E A0E9 8066

Вы видите предупреждение, потому что вы лично не проверили, принадлежит ли этот ключ владельцу (то есть вы не подписали открытый ключ своим собственным закрытым ключом). Не существует простого способа полностью гарантировать, что этот открытый ключ принадлежит владельцу, которому он не полностью доверяет.

Однако в этом случае «Хорошая подпись» означает, что этот файл действительно является файлом, который авторы OpenResty намеревались распространить, поэтому мы можем продолжить установку.

Затем распакуйте загруженный файл и перейдите во вновь созданный каталог.

tar -xvf openresty-.tar.gz
cd openresty-

Нам нужно будет установить необходимые инструменты для компиляции OpenResty. Для получения дополнительной информации о компиляции программ из исходного кода см. Https://www.digitalocean.com/community/tutorials/how-to-compile-and-install-packages-from-source-using-make-on-a-vps [ это руководство по использованию make для установки пакетов из исходного кода].

sudo apt-get install build-essential

Нам также нужно будет установить некоторые другие пакеты:

  • readline: это будет использоваться OpenResty для интерфейса командной строки.

  • ncurses: это еще одна часть программного обеспечения, которая будет использоваться OpenResty для интерфейса командной строки.

  • PCRE: Это программное обеспечение обеспечит OpenResty возможностями регулярных выражений.

  • OpenSSL: OpenSSL используется для безопасной связи, такой как TLS (HTTPS).

  • Perl: Perl - это язык программирования, который можно использовать в OpenResty.

Чтобы установить эти пакеты, выполните следующую команду:

sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl

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

Шаг 2 - Установка OpenResty

Мы настроим OpenResty с регулярным выражением PCRE и поддержкой IPv6. Мы также распараллелим часть процесса сборки, предоставив флаг + -j2 +, который сообщит + make +, что 2 задания могут быть запущены одновременно. Эта команда в основном проверяет, доступны ли все зависимости в вашей системе, и собирает информацию, которая будет использоваться на этапе сборки позже. Он также будет создавать некоторые зависимости, такие как LuaJIT.

./configure -j2 --with-pcre-jit --with-ipv6

Затем вы можете собрать OpenResty, снова предоставив флаги + -j2 + для параллелизма. Это скомпилирует сам OpenResty.

make -j2

Наконец, вы можете установить OpenResty. Использование + sudo + гарантирует, что все файлы могут быть скопированы в правильные места в системе, чтобы OpenResty мог найти их во время работы.

sudo make install

Вам нужно будет разрешить HTTP-соединения в брандмауэре, чтобы веб-сервер работал.

sudo ufw allow http

При желании вы также можете разрешить HTTPS с помощью + sudo ufw allow https +, если вы собираетесь его использовать. Вы можете проверить изменения в брандмауэре, проверив его состояние.

sudo ufw status

В отображаемом выводе вы должны увидеть HTTP-трафик (порт + 80 +), а также HTTPS (порт + 443 +), если вы его добавили.

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere


OpenSSH (v6)               ALLOW       Anywhere (v6)

Теперь вы можете проверить, работает ли установка. Сначала запустите OpenResty.

sudo /usr/local/openresty/bin/openresty

Если команда выполнена успешно, она сразу завершится без вывода текста. В этом случае вы можете зайти в браузер + http: // +. Вы увидите страницу с надписью * Добро пожаловать в OpenResty! * С подтверждением того, что она полностью установлена ​​и работает.

Теперь вы можете остановить сервер OpenResty.

sudo /usr/local/openresty/bin/openresty -s quit

OpenResty установлен, но вам все равно нужно настроить OpenResty для запуска при запуске, чтобы не нужно было запускать сервер вручную.

Шаг 3 - Настройка OpenResty как сервиса

Здесь мы собираемся настроить OpenResty как сервис, чтобы он автоматически запускался при загрузке. Мы сделаем это с помощью службы + systemd + init. Вы можете прочитать this Учебник по основам systemd для получения дополнительной информации, и https: // www .digitalocean.com / community / tutorials / понимание-systemd-unit-and-unit-files [это руководство по файлам модулей] для конкретной информации о файлах модулей.

Начните с создания нового файла + systemd + с помощью + nano + или вашего любимого текстового редактора.

sudo nano /etc/systemd/system/openresty.service

Для этого руководства мы скопируем файл Nginx + systemd + по умолчанию из новой установки и изменим его для OpenResty. Полный файл выглядит следующим образом и должен быть вставлен в файл, который мы только что открыли. Мы пройдемся по каждой части файла, чтобы объяснить, что он делает.

/etc/systemd/system/openresty.service

# Stop dance for OpenResty
# A modification of the Nginx systemd script
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the Nginx process.
# If, after 5s (--retry QUIT/5) OpenResty is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if OpenResty is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# Nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A dynamic web platform based on Nginx and LuaJIT.
After=network.target

[Service]
Type=forking
PIDFile=/run/openresty.pid
ExecStartPre=/usr/local/openresty/bin/openresty -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;'
ExecReload=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/openresty.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

В разделе + [Unit] +:

  • + After = network.target + запускает OpenResty после запуска сети, так что OpenResty может связывать и прослушивать порты. Это позволяет достичь его снаружи.

В разделе + [Service] +:

  • + Type = forking + сообщает + systemd +, что процесс, который мы вызываем в + ExecStart +, запустит службу в фоновом режиме и что процесс остановится сам после того, как это будет сделано.

  • + PIDFile = / run / openresty.pid + сообщает + systemd +, где найти PID-файл, который OpenResty создает при запуске. Это позволяет + systemd + знать, работает ли OpenResty.

  • + ExecStartPre = / usr / local / openresty / bin / openresty -t -q -g 'демон включен; master_process on; '+ `вызывает скрипт OpenResty без его запуска. Флаг `+ -t + сообщает OpenResty, что мы хотим, чтобы он только тестировал файл конфигурации; флаг + -q + говорит нам, что мы хотим подавить любой вывод без ошибок; флаг + -g + устанавливает глобальные директивы + daemon; master_process в + `, который сообщает OpenResty, что мы хотим, чтобы он запускался в фоновом режиме как демон. Мы выполняем этот скрипт как `+ ExecStartPre +, так что + systemd + не будет пытаться запустить OpenResty, когда файл конфигурации недействителен, так как это приведет к ошибке в этой команде.

  • + ExecStart = / usr / local / openresty / bin / openresty -g 'включен; master_process on; '+ `фактически запускает OpenReesty. Это то же самое, что `+ ExecStartPre + без флага + -t +.

  • + ExecReload = / usr / local / openresty / bin / openresty -g 'включен; master_process on; ' -s reload + `говорит + systemd + выполнить эту команду, когда мы запустим + systemctl reload openresty + . Флаг `+ -s + указывает OpenResty перезагрузить свой файл конфигурации.

  • + ExecStop = - / sbin / start-stop-daemon --quiet --stop --retry QUIT / 5 --pidfile / run / openresty.pid + говорит + systemd + запустить эту команду, когда OpenResty остановлен. Он отправляет + SIGSTOP + процессу, указанному в файле PID. Если он по-прежнему работает через 5 секунд, + systemd + получит контроль с помощью следующих двух опций.

  • + TimeoutStopSec = 5 + говорит + systemd +, что мы хотим остановить процесс через 5 секунд. Если это не остановит, + systemd + принудительно попытается остановить OpenRest.

  • + KillMode = mixed + указывает, как + systemd + должен пытаться остановить OpenResty, если он не остановился через 5 секунд.

В разделе + [Install] +:

  • + WantedBy = multi-user.target + сообщает + systemd +, когда мы хотим, чтобы служба запускалась, если она настроена на запуск при загрузке. + multi-user.target + означает, что служба будет запущена только тогда, когда запущена многопользовательская система, т.е. мы можем запустить OpenResty от имени другого пользователя.

Это все для файла + etc / systemd / system / openresty.service +. Далее нам нужно настроить файл конфигурации OpenResty Nginx и включить сервис.

Сначала откройте файл конфигурации.

sudo nano /usr/local/openresty/nginx/conf/nginx.conf

По умолчанию это будет выглядеть так:

По умолчанию /usr/local/openresty/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
   worker_connections  1024;
}

. . .

Удалите все до строки + events {+ и замените ее следующими тремя строками:

Обновлен /usr/local/openresty/nginx/conf/nginx.conf

events {
   worker_connections  1024;
}

. . .

Этот файл гарантирует, что мы работаем как пользователь * www-data * и что + systemd + может распознать, когда OpenResty работает, из-за строки + pid +, которая будет создана OpenResty после ее запуска.

Сохраните и закройте файл.

Далее создайте каталог журналов.

sudo mkdir /var/log/openresty

Перезагрузите сервис + systemd, чтобы он мог найти ваш файл.

sudo systemctl daemon-reload

Теперь запустите OpenResty через + systemd +.

sudo systemctl start openresty

Теперь вы можете снова посетить + http: // + и увидеть ту же веб-страницу, что и раньше. Разница в том, что теперь процесс был запущен + systemd +.

Последний шаг - включить службу, которая будет гарантировать, что OpenResty запускается при загрузке.

sudo systemctl enable openresty

Вы можете узнать больше об управлении + systemd + службами и модулями в наших https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units[services и юниты учебник.

Теперь, когда мы настроили службу, мы можем дополнительно настроить OpenResty, чтобы он, например, войти в общее местоположение.

Шаг 4 - Настройка OpenResty

Чтобы настроить OpenResty, мы использовали конфигурацию Nginx по умолчанию в качестве ссылки, так что она будет в основном соответствовать тому, с чем вы, возможно, знакомы.

Сначала снова откройте файл конфигурации OpenResty:

sudo nano /usr/local/openresty/nginx/conf/nginx.conf

На этот раз мы собираемся изменить блок + http и переместить блок` + server` внутри этого блока + http в новый файл, чтобы иметь лучшую структуру. Во-первых, найдите строку + http {+ и удалите все после нее, кроме последней строки с соответствующим +} +.

Текущий /usr/local/openresty/nginx/conf/nginx.conf

user www-data;
worker_processes  auto;
pid /run/openresty.pid;

events {
   worker_connections  1024;
}

http {
   include       mime.types;
   default_type  application/octet-stream;

   . . .
}

Затем скопируйте следующее в блок + http +, чтобы весь ваш файл выглядел следующим образом. Мы рассмотрим изменения по одному.

/usr/local/openresty/nginx/conf/nginx.conf

user www-data;
worker_processes  auto;
pid /run/openresty.pid;

events {
   worker_connections  1024;
}

http {
   include       mime.types;
   default_type  application/octet-stream;

   sendfile        on;
   tcp_nopush      on;
   tcp_nodelay     on;

   keepalive_timeout  65;

   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
   ssl_prefer_server_ciphers on;

   access_log /var/log/openresty/access.log;
   error_log /var/log/openresty/error.log;

   gzip  on;
   gzip_disable "msie6";

   include ../sites/*;
}

Сохраните и закройте файл.

Изменения, которые мы внесли в файл по умолчанию:

  • Раскомментируйте + tcp_nopush on; +, который говорит OpenResty отправлять только полные пакеты. Эта опция полезна при использовании опции + sendfile +, которая позволит OpenResty оптимизировать отправку статических файлов клиенту.

  • Добавление + tcp_nodelay on; +. Эта опция попытается отправить пакеты как можно скорее, что может показаться противоречащим вышеупомянутой опции, но она используется в другое время. + tcp_nodelay + используется только при использовании опции + keepalive + в HTTP-запросах, которая представляет собой соединение с веб-сервером через веб-браузер, что позволяет избежать накладных расходов на инициирование HTTP-соединения каждый раз, когда выполняется запрос.

  • Добавление и изменение строк + ssl_protocols + и + ssl_prefer_server_ciphers +. Эти параметры настраивают параметры SSL OpenResty. Мы удалили старые протоколы, которые уязвимы для известных атак на HTTPS, таких как атака POODLE.

  • Добавление строк + access_log + и + error_log +, которое определяет, где журналы веб-сервера. Мы храним журналы в каталоге + / var / log / openresty +, который мы создали на предыдущем шаге.

  • Раскомментируйте + gzip на + и добавьте + gzip_disable" msie6 "+. Эти параметры будут настраивать GZIP, который будет сжимать веб-страницы так, чтобы было меньше данных для передачи. Мы также добавляем последний параметр, поскольку Internet Explorer 6 (и более ранние версии) не всегда правильно обрабатывает содержимое GZIP.

  • Добавление + include ../ sites / *; +, которое говорит OpenResty о необходимости поиска дополнительных файлов конфигурации в каталоге + / usr / local / openresty / nginx / sites +, который мы создадим в ближайшее время.

  • Удаление всех блоков + server +, которые мы переместим в новый файл позже на этом шаге.

Затем создайте новый каталог + sites +, который мы указали в строке + include +.

sudo mkdir /usr/local/openresty/nginx/sites

Создайте сайт + default +.

sudo nano /usr/local/openresty/nginx/sites/default.conf

Добавьте следующее в этот новый файл. Это перемещение исходного блока сервера из + nginx.conf +, но содержит встроенные комментарии для более подробной информации.

/usr/local/openresty/nginx/sites/default.conf

server {
   # Listen on port 80.
   listen 80 default_server;
   listen [::]:80 default_server;

   # The document root.
   root /usr/local/openresty/nginx/html/default;

   # Add index.php if you are using PHP.
   index index.html index.htm;

   # The server name, which isn't relevant in this case, because we only have one.
   server_name _;

   # When we try to access this site...
   location / {
       # ... first attempt to serve request as file, then as a directory,
       # then fall back to displaying a 404.
       try_files $uri $uri/ =404;
   }

   # Redirect server error pages to the static page /50x.html.
   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root /usr/local/openresty/nginx/html;
   }
}

Сохраните и закройте файл.

Теперь создайте новый каталог для этого сайта.

sudo mkdir /usr/local/openresty/nginx/html/default

Затем переместите исходный файл + index.html из исходного местоположения в новый каталог.

sudo mv /usr/local/openresty/nginx/html/index.html /usr/local/openresty/nginx/html/default

Наконец, перезапустите OpenResty, чтобы использовать этот новый сайт.

sudo systemctl restart openresty

Теперь вы можете снова посетить + http: // + и увидеть ту же веб-страницу, что и раньше.

Теперь, когда OpenResty полностью настроен, мы можем попробовать некоторые функции, представленные OpenResty, которые по умолчанию недоступны в Nginx.

Шаг 5 - Использование OpenResty Lua Module

В этом разделе мы рассмотрим комбинацию различных модулей, добавленных OpenResty, которые существуют для поддержки сценариев Lua. Мы будем изменять + / usr / local / openresty / nginx / sites / default.conf + на этом этапе, поэтому сначала откройте его.

sudo nano /usr/local/openresty/nginx/sites/default.conf

Сначала мы рассмотрим параметр конфигурации + content_by_lua_block +. Скопируйте блок + location + из примера конфигурации ниже и добавьте его в блок + server +, под двумя существующими блоками + location +.

/usr/local/openresty/nginx/sites/default.conf content_by_lua_block пример

server {
   . . .

   location /example {
        default_type 'text/plain';

        content_by_lua_block {
            ngx.say('Hello, Sammy!')
        }
   }
}

Сохраните и закройте файл, затем перезагрузите конфигурацию.

sudo systemctl reload openresty

Если вы посетите + http: /// пример + сейчас, вы увидите страницу с текстом * Hello, Sammy! *. Давайте объясним, как это работает.

Директива конфигурации + content_by_lua_block + выполняет все внутри нее как код Lua. Здесь мы использовали функцию Lua + ngx.say +, чтобы напечатать сообщение * Hello, Sammy! * На страницу.

Для другого примера замените содержимое блока + location / example + следующим образом:

/usr/local/openresty/nginx/sites/default.conf content_by_lua_file пример

server {
   . . .

   location /example {
        default_type 'text/plain';

        content_by_lua_file /usr/local/openresty/nginx/html/default/index.lua;
   }
}

+ Content_by_lua_file + загружает содержимое Lua из внешнего файла, поэтому давайте создадим тот, который мы указали выше: + / usr / local / openresty / nginx / html / default / index.lua +.

sudo nano /usr/local/openresty/nginx/html/default/index.lua

Добавьте следующее в файл, затем сохраните и закройте его.

/usr/local/openresty/nginx/html/default/index.lua

local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name, "!")

Это простая часть Lua, которая читает параметр запроса в URL + name + и настраивает приветственное сообщение. Если параметр не передан, вместо него используется «Anonymous».

Перезагрузите конфигурацию снова.

sudo systemctl reload openresty

Теперь посетите + http: /// пример? Name = + в вашем браузере. Это покажет * Привет, Сэмми! *. Вы можете изменить параметр запроса + name + или полностью его опустить.

Hello, Sammy!

Вы также можете изменить параметр запроса + name +, чтобы показать любое другое имя.

Заключение

В этой статье вы настроили OpenResty, который позволит вам использовать сценарии Lua в Nginx. Можно создавать гораздо более сложные сценарии Lua. Вы также можете, например, ограничить доступ с помощью сценариев Lua или переписать определенные запросы с помощью Lua. Вы можете найти документацию на странице GitHub lua-nginx-module. Есть даже полные веб-фреймворки, которые используют Lua на OpenResty, такие как Lapis.

Если вы хотите узнать больше, вы можете посетить OpenResty веб-сайт. Поскольку OpenResty - это просто расширенная установка Nginx, вы также можете узнать, как настроить серверные блоки, в https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual. -hosts-on-ubuntu-16-04 [учебник по блокировке серверов Nginx], но не забудьте заменить пути, используемые в этом учебнике, на пути, используемые в этом.

Related