Comment utiliser le framework Web OpenResty pour Nginx sur Ubuntu 16.04

introduction

OpenResty est un serveur Web qui étend Nginx en le regroupant avec de nombreux modules Nginx et bibliothèques Lua utiles. OpenResty excelle dans la mise à l’échelle d’applications et de services Web. Par exemple, un module inclus vous permet d’écrire du code Lua qui s’exécutera directement dans un serveur Nginx, permettant ainsi des applications hautes performances.

Dans ce guide, vous allez configurer OpenResty à partir des sources; les packages pré-construits pour certaines distributions peuvent être obsolètes. Vous explorerez également quelques exemples d’applications simples avec les fonctionnalités uniques d’OpenResty.

Conditions préalables

Pour suivre ce guide, vous aurez besoin de:

Notez que Nginx ne devrait * pas * être installé. Il est inclus dans OpenResty et son installation à l’avance sera conflictuel.

Étape 1 - Téléchargement du code source et des dépendances d’OpenResty

Dans cette section, nous installerons OpenResty à partir des sources.

Tout d’abord, recherchez la dernière version du code source OpenResty à partir de la page Download sur le site Web OpenResty. Téléchargez l’archive, en veillant à remplacer le numéro de version par la dernière version, si celle-ci a été modifiée.

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

Téléchargez également le fichier de clé PGP pour que nous puissions en vérifier le contenu.

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

Ensuite, nous devons ajouter la clé publique de l’auteur comme indiqué sur la page de téléchargement. Au moment de la rédaction, il s’agit de la clé publique + A0E98066 +. Cependant, vérifiez si cela a changé. il est répertorié sur la même page de téléchargements.

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

Vous devriez voir la sortie suivante (avec votre nom d’utilisateur à la place de * 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)

Vérifiez que le nom figurant sur la clé publique (dans ce cas, «Yichun Zhang») correspond au nom indiqué sur le site Web OpenResty.

Maintenant, vérifiez si le fichier de signature correspond au fichier + .tar.gz téléchargé.

gpg openresty-.tar.gz.asc

Vous verrez le résultat suivant:

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

L’avertissement que vous voyez est dû au fait que vous n’avez pas personnellement vérifié si cette clé appartient bien au propriétaire (c’est-à-dire que vous n’avez pas signé la clé publique avec votre propre clé privée). Il n’est pas facile de garantir complètement que cette clé publique appartient au propriétaire, ce qui n’est pas totalement fiable.

Cependant, dans ce cas, * Bonne signature * indique que ce fichier est bien le fichier que les auteurs d’OpenResty avaient l’intention de distribuer afin que nous puissions poursuivre l’installation.

Ensuite, extrayez le fichier téléchargé et déplacez-vous dans le répertoire nouvellement créé.

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

Nous devrons installer les outils nécessaires pour compiler OpenResty. Pour plus d’informations sur la compilation de programmes à partir des sources, voir https://www.digitalocean.com/community/tutorials/how-to-compile-and-install-packages-from-source-using-make-on-a-vps [ ce tutoriel sur l’utilisation de make pour installer les packages à partir des sources].

sudo apt-get install build-essential

Nous devrons également installer d’autres packages:

  • readline: OpenResty l’utilisera pour l’interface de ligne de commande.

  • ncurses: Il s’agit d’un autre logiciel que OpenResty utilisera pour son interface de ligne de commande.

  • PCRE: Ce logiciel fournira à OpenResty des capacités d’expression régulière.

  • OpenSSL: OpenSSL est utilisé pour les communications sécurisées, telles que TLS (HTTPS).

  • Perl: Perl est un langage de programmation utilisable dans OpenResty.

Pour installer ces packages, exécutez la commande suivante:

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

Nous avons maintenant tous les composants nécessaires pour construire et installer OpenResty.

Étape 2 - Installation d’OpenResty

Nous allons configurer OpenResty avec les expressions régulières PCRE et le support IPv6. Nous allons également mettre en parallèle une partie du processus de construction en fournissant le drapeau + -j2 +, qui indiquera + make + que 2 travaux peuvent être exécutés simultanément. Cette commande testera principalement si toutes les dépendances sont disponibles sur votre système et rassemblera les informations qui seront utilisées ultérieurement par l’étape de construction. Il va également déjà construire des dépendances, telles que LuaJIT.

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

Ensuite, vous pouvez créer OpenResty, encore une fois en fournissant les indicateurs + -j2 + pour le parallélisme. Cela compilera OpenResty lui-même.

make -j2

Enfin, vous pouvez installer OpenResty. En utilisant + sudo +, vous vous assurez que tous les fichiers peuvent être copiés aux emplacements appropriés sur le système afin qu’OpenResty puisse les trouver lorsqu’il est en cours d’exécution.

sudo make install

Pour que le serveur Web fonctionne, vous devez autoriser les connexions HTTP dans votre pare-feu.

sudo ufw allow http

Vous pouvez éventuellement aussi autoriser HTTPS avec + sudo ufw allow https + si vous comptez l’utiliser. Vous pouvez vérifier le changement dans le pare-feu en vérifiant son statut.

sudo ufw status

Vous devriez voir le trafic HTTP (port + 80 +) autorisé dans la sortie affichée, ainsi que HTTPS (port + 443 +) si vous l’avez ajouté.

OutputStatus: active

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


OpenSSH (v6)               ALLOW       Anywhere (v6)

Vous pouvez maintenant vérifier si l’installation a fonctionné. Commencez par ouvrir OpenResty.

sudo /usr/local/openresty/bin/openresty

Il se terminera immédiatement sans sortie de texte si la commande aboutit. Dans ce cas, vous pouvez visiter + http: // + dans votre navigateur. Vous verrez une page qui dit * Bienvenue à OpenResty! * Avec la confirmation de son installation et de son fonctionnement.

Vous pouvez maintenant arrêter le serveur OpenResty.

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

OpenResty est installé, mais vous devez toujours configurer OpenResty pour qu’il s’exécute au démarrage, de sorte que le serveur ne doit pas être démarré manuellement.

Étape 3 - Configurer OpenResty en tant que service

Ici, nous allons configurer OpenResty en tant que service afin qu’il démarre automatiquement au démarrage. Nous ferons cela en utilisant le service d’initialisation + systemd +. Vous pouvez lire cette tutoriel sur les bases de systemd pour plus d’informations, et https: // www. .digitalocean.com / community / tutorials / arrangement-systemd-unités-et-unités-fichiers [tutoriel de ce fichier unité] pour des informations spécifiques sur les fichiers unité.

Commencez par créer un nouveau fichier + systemd + avec + nano + ou votre éditeur de texte préféré.

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

Pour ce tutoriel, nous allons copier le fichier Nginx + systemd + par défaut d’une nouvelle installation et le modifier pour OpenResty. Le fichier complet ressemble à ceci et devrait être collé dans le fichier que nous venons d’ouvrir. Nous allons parcourir chaque partie du fichier pour expliquer ce qu’il fait.

/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

Dans la section + [Unit] +:

  • + After = network.target + permet à OpenResty de démarrer une fois le réseau mis en place afin qu’OpenResty puisse se lier et écouter les ports. Cela lui permet d’être atteint de l’extérieur.

Dans la section + [Service] +:

  • + Type = forking + indique + systemd + que le processus appelé dans + ExecStart + démarrera le service en arrière-plan et qu’il s’arrêtera après l’avoir fait.

  • + PIDFile = / run / openresty.pid + indique + systemd + où trouver le fichier PID créé par OpenResty à son démarrage. Cela permet à + ​​systemd + de savoir si OpenResty est toujours en cours d’exécution.

  • + ExecStartPre = / usr / local / openresty / bin / openresty -t -q -g 'daemon on; master_process on; '+ `appelle le script OpenResty sans le démarrer. L’indicateur `+ -t + indique à OpenResty que nous voulons seulement qu’il teste le fichier de configuration; le drapeau + -q + lui indique que nous voulons supprimer toute sortie non-erreur; l’indicateur + -g + active les directives globales + le démon; master_process on + `qui indique à OpenResty que nous voulons qu’il démarre en arrière-plan en tant que démon. Nous exécutons ce script sous la forme `+ ExecStartPre + afin que + systemd + n’essaie pas de démarrer OpenResty lorsque le fichier de configuration est invalide, car cette erreur entraînera une erreur.

  • + ExecStart = / usr / local / openresty / bin / openresty -g 'daemon on; master_process on; '+ `démarre réellement OpenReesty. Ceci est identique à `+ ​​ExecStartPre + sans l’indicateur + -t +.

  • + ExecReload = / usr / local / openresty / bin / openresty -g 'démon sur; master_process on; ' -s reload + `dit + systemd + pour exécuter cette commande lorsque nous exécutons + systemctl reload openresty + . L’indicateur `+ -s + indique à OpenResty de recharger son fichier de configuration.

  • + ExecStop = - / sbin / start-stop-daemon --quiet --stop --retry QUIT / 5 --pidfile / run / openresty.pid + indique à + + systemd + d’exécuter cette commande lorsque OpenResty est arrêté. Il envoie `+ SIGSTOP + au processus indiqué dans le fichier PID. S’il fonctionne toujours 5 secondes plus tard, + systemd + prendra le contrôle via les deux options suivantes.

  • + TimeoutStopSec = 5 + indique + systemd + nous voulons que le processus soit arrêté dans 5 secondes. Si cela ne s’arrête pas, + systemd + va forcer pour arrêter OpenRest.

  • + KillMode = mixed + spécifie comment + systemd + doit essayer d’arrêter OpenResty lorsqu’il ne s’est pas arrêté après 5 secondes.

Dans la section + [Install] +:

  • + WantedBy = multi-user.target + indique + systemd + quand nous voulons que le service soit démarré s’il est configuré pour être démarré au démarrage. + multi-user.target + signifie que le service ne sera démarré que lorsqu’un système multi-utilisateurs a été démarré, c’est-à-dire nous pouvons exécuter OpenResty en tant qu’utilisateur différent.

C’est tout pour le fichier + etc / systemd / system / openresty.service +. Ensuite, nous devons personnaliser le fichier de configuration OpenResty Nginx et activer le service.

Ouvrez d’abord le fichier de configuration.

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

Par défaut, cela ressemblera à ceci:

Par défaut /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;
}

. . .

Supprimez tout ce qui se trouve avant la ligne + events {+ et remplacez-le par les trois lignes suivantes:

Mise à jour /usr/local/openresty/nginx/conf/nginx.conf

events {
   worker_connections  1024;
}

. . .

Ce fichier garantit que nous sommes en train de fonctionner en tant qu’utilisateur * www-data * et que + systemd + peut reconnaître le moment où OpenResty est en cours d’exécution en raison de la ligne + pid + qui sera créée par OpenResty une fois démarré.

Enregistrez et fermez le fichier.

Ensuite, créez le répertoire du journal.

sudo mkdir /var/log/openresty

Rechargez le service + systemd afin qu’il puisse trouver votre fichier.

sudo systemctl daemon-reload

Maintenant, démarrez OpenResty via + systemd +.

sudo systemctl start openresty

Vous pouvez maintenant visiter + http: // + à nouveau et voir la même page Web qu’avant. La différence est que maintenant, le processus a été lancé par + systemd +.

La dernière étape consiste à activer le service afin de s’assurer que OpenResty est démarré au démarrage.

sudo systemctl enable openresty

Pour en savoir plus sur la gestion des services et des unités + systemd + dans notre services et tutoriel des unités.

Maintenant que nous avons configuré le service, nous pouvons configurer OpenResty de manière à ce qu’il soit possible, par exemple. connectez-vous à un emplacement commun.

Étape 4 - Configuration d’OpenResty

Pour configurer OpenResty, nous avons utilisé la configuration par défaut de Nginx comme référence, afin qu’elle corresponde généralement à ce que vous connaissez peut-être.

Commencez par ouvrir à nouveau le fichier de configuration OpenResty:

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

Cette fois, nous allons modifier le bloc + http et déplacer le bloc` + serveur` à l’intérieur de ce bloc + http vers un nouveau fichier afin d’améliorer la structure. Premièrement, localisez la ligne + http {+ et supprimez tout ce qui suit, à l’exception de la dernière ligne avec le +} + correspondant.

Current /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;

   . . .
}

Ensuite, copiez le texte suivant dans le bloc + http + afin que tout votre fichier ressemble à ceci. Nous allons passer en revue les modifications une par une.

/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/*;
}

Enregistrez et fermez le fichier.

Les modifications apportées au fichier par défaut sont les suivantes:

  • Sans commenter + tcp_nopush on; +, qui indique à OpenResty d’envoyer uniquement des paquets complets. Cette option est utile lorsque vous utilisez l’option + sendfile +, qui permettra à OpenResty d’optimiser l’envoi de fichiers statiques à un client.

  • Ajout de + tcp_nodelay on; +. Cette option essaiera d’envoyer les paquets dès que possible, ce qui peut sembler contraire à l’option ci-dessus, mais elle est utilisée à un moment différent. + tcp_nodelay + est utilisé uniquement lors de l’utilisation de l’option + keepalive + sur les demandes HTTP, qui est une connexion à un serveur Web par un navigateur Web qui évite la surcharge d’initier une connexion HTTP chaque fois qu’une demande est faite.

  • Ajouter et modifier les lignes + ssl_protocols + et + ssl_prefer_server_ciphers +. Ces options configurent les options SSL d’OpenResty. Nous avons supprimé les anciens protocoles vulnérables aux attaques connues sur HTTPS, tels que l’attaque POODLE.

  • Ajout des lignes + access_log + et + + error_log +, qui configure où se trouvent les journaux du serveur Web. Nous stockons les journaux dans le répertoire + / var / log / openresty +, que nous avons créé à l’étape précédente.

  • Décommenter + gzip sur + et ajouter + gzip_disable" msie6 "+. Ces options configureront GZIP, qui compressera les pages Web de manière à limiter le nombre de données à transférer. Nous ajoutons également la dernière option car Internet Explorer 6 (et versions antérieures) ne traite pas toujours le contenu GZIP correctement.

  • Ajout de + include ../ sites / *; +, qui indique à OpenResty de rechercher des fichiers de configuration supplémentaires dans le répertoire + / usr / local / openresty / nginx / sites +, qui seront créés dans un instant.

  • Suppression de tous les blocs + serveur +, que nous déplacerons dans un nouveau fichier ultérieurement dans cette étape.

Ensuite, créez le nouveau répertoire + sites + que nous avons spécifié dans la ligne + include +.

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

Créez le site + default +.

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

Ajoutez ce qui suit dans ce nouveau fichier. Il s’agit du déplacement du bloc de serveur d’origine de + nginx.conf +, mais comporte des commentaires en ligne pour plus de détails.

/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;
   }
}

Enregistrez et fermez le fichier.

Maintenant, créez un nouveau répertoire pour ce site.

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

Déplacez ensuite le + index.html d’origine de son emplacement d’origine vers le nouveau répertoire.

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

Enfin, redémarrez OpenResty pour utiliser ce nouveau site.

sudo systemctl restart openresty

Vous pouvez maintenant visiter à nouveau + http: // + et voir la même page Web que précédemment.

Maintenant que OpenResty est entièrement configuré, nous pouvons essayer certaines des fonctionnalités introduites par OpenResty qui ne sont pas disponibles par défaut dans Nginx.

Étape 5 - Utilisation du module OpenResty Lua

Dans cette section, nous examinerons une combinaison de différents modules ajoutés par OpenResty qui existent tous pour accueillir les scripts Lua. Nous allons modifier + / usr / local / openresty / nginx / sites / default.conf + tout au long de cette étape, ouvrez-le d’abord.

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

Tout d’abord, nous allons examiner l’option de configuration + content_by_lua_block +. Copiez le bloc + location + de l’exemple de configuration ci-dessous et ajoutez-le dans le bloc + serveur +, sous les deux blocs + emplacement + existants.

/usr/local/openresty/nginx/sites/default.conf exemple de content_by_lua_block

server {
   . . .

   location /example {
        default_type 'text/plain';

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

Enregistrez et fermez le fichier, puis rechargez la configuration.

sudo systemctl reload openresty

Si vous visitez + http: /// example + maintenant, vous verrez une page qui dit * Bonjour, Sammy! *. Expliquons comment cela fonctionne.

La directive de configuration + content_by_lua_block + exécute tout ce qu’elle contient en tant que code Lua. Ici, nous avons utilisé la fonction Lua + ngx.say + pour imprimer le message * Bonjour Sammy! * Sur la page.

Pour un autre exemple, remplacez le contenu du bloc + location / example + par ceci:

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

server {
   . . .

   location /example {
        default_type 'text/plain';

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

+ Content_by_lua_file + charge le contenu Lua depuis un fichier externe, créons donc celui que nous avons spécifié ci-dessus: + / usr / local / openresty / nginx / html / default / index.lua +.

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

Ajoutez les éléments suivants au fichier, puis enregistrez-le et fermez-le.

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

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

Il s’agit d’un simple morceau de Lua qui lit un paramètre de requête dans l’URL, + name +, et personnalise le message d’accueil. Si aucun paramètre n’est transmis, il utilise «Anonyme» à la place.

Rechargez à nouveau la configuration.

sudo systemctl reload openresty

Maintenant, visitez + http: /// example? Name = + dans votre navigateur. Ceci affichera * Bonjour, Sammy! *. Vous pouvez modifier le paramètre de requête + nom + ou bien l’omettre complètement.

Hello, Sammy!

Vous pouvez également modifier le paramètre de requête + name + pour afficher tout autre nom.

Conclusion

Dans cet article, vous configurez OpenResty, qui vous permettra d’utiliser des scripts Lua dans un serveur Nginx. Il est possible de créer des scripts Lua beaucoup plus complexes. Vous pouvez également, par exemple, limiter l’accès à l’aide de scripts Lua ou réécrire certaines demandes à l’aide de Lua. Vous trouverez la documentation sur la page lua-nginx-module. Il existe même des infrastructures Web complètes qui utilisent Lua sur OpenResty, telles que Lapis.

Si vous voulez en savoir plus, vous pouvez visiter le site Web OpenResty. Étant donné qu’OpenResty n’est qu’une installation étendue de Nginx, vous pouvez également apprendre à configurer des blocs de serveur dans la page https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual. -hosts-on-ubuntu-16-04 [Tutoriel sur les blocs de serveur Nginx], mais veillez à remplacer les chemins utilisés dans ce tutoriel par les chemins utilisés dans celui-ci.