如何在Ubuntu 16.04上使用Nginx的OpenResty Web框架

介绍

OpenResty是一个网络服务器,通过捆绑它与许多有用的Nginx模块和Lua库扩展Nginx。 OpenResty擅长扩展Web应用程序和服务。例如,它包含的一个模块使您能够编写将直接在Nginx工作线程中执行的Lua代码,从而实现高性能应用程序。 在本指南中,您将从源代码设置OpenResty;某些发行版的预构建包可能已过期。您还将使用OpenResty的独特功能探索一些简单的示例应用程序。

先决条件

要遵循本指南,您需要: 注意, 应该安装Nginx。它包含在OpenResty,并提前安装它会冲突。

第1步 - 下载OpenResty的源代码和依赖关系

在本节中,我们将从源代码安装OpenResty。 首先,从OpenResty网站的 下载页面找到最新的OpenResty源代码版本。下载tarball,确保如果更改了版本号,请使用最新版本号。
wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
下载PGP密钥文件,以便我们可以验证文件的内容。
wget https://openresty.org/download/openresty-1.11.2.2.tar.gz.asc
接下来,我们需要添加作者的公共密钥,如下载页面上所列。在撰写本文时,这是公钥 A0E98066 。但是,请检查它是否已更改;它被列在同一下载页面上。
gpg --keyserver pgpkeys.mit.edu --recv-key A0E98066
您应该看到以下输出(用您的用户名代替 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) <agentzh@gmail.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
检查公钥(在这种情况下,它是“Yichun Zhang”)上的名称与OpenResty网站上列出的名称匹配。 现在,检查签名文件是否与下载的 .tar.gz文件匹配。
gpg openresty-1.11.2.2.tar.gz.asc
您将看到以下输出:
Outputgpg: assuming signed data in `openresty-1.11.2.2.tar.gz'
gpg: Signature made Thu 17 Nov 2016 10:24:29 PM UTC using RSA key ID A0E98066
gpg: Good signature from "Yichun Zhang (agentzh) <agentzh@gmail.com>"
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-1.11.2.2.tar.gz
cd openresty-1.11.2.2
我们将需要安装必要的工具来编译OpenResty。有关从源代码编译程序的更多信息,请参阅 。
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
然后,您可以通过提供 -j2并行度标志来构建OpenResty。这将编译OpenResty本身。
make -j2
最后,您可以安装OpenResty。使用 sudo确保所有文件可以复制到系统上的正确位置,以便OpenResty可以在运行时找到它们。
sudo make install
您需要在防火墙中允许HTTP连接才能使Web服务器正常工作。
sudo ufw allow http
您也可以选择允许HTTPS与 sudo ufw allow https如果你要使用它。您可以通过检查防火墙的状态来验证防火墙的更改。
sudo ufw status
您应该看到显示的输出中允许HTTP流量(端口 80 ),以及如果您添加它的HTTPS(端口 443 )。
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
您现在可以检查安装是否有效。首先,启动OpenResty。
sudo /usr/local/openresty/bin/openresty
如果命令成功,它将立即完成而不输出文本。在这种情况下,您可以在浏览器中访问 http:// your_server_ip 。 你会看到一个页面,说 欢迎来到OpenResty!确认它已完全安装和工作。 您现在可以停止OpenResty服务器。
sudo /usr/local/openresty/bin/openresty -s quit
OpenResty已安装,但您仍需要配置OpenResty在启动时运行,所以服务器不必手动启动。

第3步 - 将OpenResty设置为服务

在这里,我们将OpenResty设置为一个服务,所以它在启动时自动启动。我们将使用 systemd init服务。 您可以阅读 此systemd基础教程了解更多信息,以及 本单元文件教程 ,了解单元文件的具体信息。 首先使用 nano或您喜欢的文本编辑器创建一个新的 systemd文件。
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中调用的ExecStart将在ExecStart启动服务,并且进程将在后台停止自身。
  • PIDFile=/run/openresty.pid告诉systemd在哪里可以找到OpenResty在启动时创建的PID文件。 这使得systemd知道OpenResty是否仍在运行。
  • ExecStartPre=/usr/local/openresty/bin/openresty -t -q -g 'daemon on; master_process on;' 调用OpenResty脚本而不启动它。 -t标志告诉OpenResty我们只想测试配置文件; -q标志告诉它我们想要抑制任何非错误输出; -g标志设置全局指令daemon on; master_process on daemon on; master_process on告诉OpenResty我们希望它在后台作为守护进程启动。 我们执行这个脚本作为ExecStartPre ,这样当配置文件无效时, systemd将不会尝试启动OpenResty,因为它将错误在这个命令。
  • ExecStart=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;' 实际上启动OpenReesty。 这与没有-t标志的ExecStartPre相同。
  • ExecReload=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;' -s reload ExecReload=/usr/local/openresty/bin/openresty -g 'daemon on; 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如何在5秒后没有停止时尝试停止OpenResty。
[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 { line,并将其替换为以下三行:
更新了/usr/local/openresty/nginx/conf/nginx.conf
user www-data;
worker_processes  auto;
pid /run/openresty.pid;

events {
    worker_connections  1024;
}

. . .
这个文件将确保我们作为 www-data用户运行,并且 systemd可以识别OpenResty何时运行,因为OpenResty一旦启动就创建了 pid行。 保存并关闭文件。 接下来,创建日志目录。
sudo mkdir /var/log/openresty
重新加载 systemd服务,以便它可以找到我们的文件。
sudo systemctl daemon-reload
现在,通过 systemd启动OpenResty。
sudo systemctl start openresty
您现在可以再次访问 http:// your_server_ip ,并查看与之前相同的网页。 区别是现在,进程已经由 systemd 。 最后一步是启用该服务,以确保OpenResty在启动时启动。
sudo systemctl enable openresty
您可以在我们的 服务和单元教程中了解有关管理 systemd服务和单元的更多信息。 现在我们已经配置了服务,我们可以进一步配置OpenResty,以便它将例如登录到公共位置。

第4步 - 配置OpenResty

要配置OpenResty,我们使用默认的Nginx配置作为参考,以便它大部分匹配你可能会熟悉的。 首先,再次打开OpenResty配置文件:
sudo nano /usr/local/openresty/nginx/conf/nginx.conf
这一次,我们将修改 http块并将此 http块中的 server块移动到一个新文件以具有更好的结构。 首先,找到 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仅在对HTTP请求使用keepalive选项时使用,这是通过Web浏览器连接到Web服务器,这将避免每次请求时启动HTTP连接的开销。
  • 添加和修改ssl_protocolsssl_prefer_server_ciphers行。这些选项配置OpenResty的SSL选项。我们删除了易受已知的HTTPS攻击的旧协议,例如POODLE攻击。
  • 添加access_logerror_log行,它们配置Web服务器的日志位置。 我们将日志存储在上一步中创建的/var/log/openresty目录中。
  • 取消注释gzip on并添加gzip_disable "msie6" 。这些选项将配置GZIP,这将压缩网页,以便有更少的数据传输。我们还添加了最后一个选项,因为Internet Explorer 6(及更早版本)并不总是正确处理GZIP内容。
  • 添加include ../sites/*; ,它告诉OpenResty在/usr/local/openresty/nginx/sites目录中查找额外的配置文件,稍后我们将创建它。
  • 删除所有server块,我们将在此步骤中稍后重新定位到新文件。
接下来,创建我们在 include行中指定的新 sites目录。
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:// your_server_ip ,并查看与之前相同的网页。 现在OpenResty是完全配置的,我们可以尝试一些由OpenResty介绍的,在Nginx默认情况下不可用的功能。

第5步 - 使用OpenResty Lua模块

在本节中,我们将看看OpenResty添加的不同模块的组合,这些模块都存在以适应Lua脚本。我们将在整个步骤中 /usr/local/openresty/nginx/sites/default.conf /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:// your_server_ip /example访问 http:// your_server_ip /example ,您会看到一个 http:// your_server_ip /example 您好,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并自定义问候消息。如果没有传递参数,则使用“匿名”。 再次重新加载配置。
sudo systemctl reload openresty
现在,在浏览器中访问 http:// your_server_ip /example?name= Sammy 。 这将显示 你好,Sammy! 。 您可以更改 name查询参数,或完全忽略它。
Hello, Sammy!
您还可以更改 name查询参数以显示任何其他名称。 警告:请勿将您要加载的Lua文件从Web访问到的位置。 如果这样做,如果有人访问此文件,则可能会包含应用程序代码。 将文件放在文档根目录之外,例如,将文档根目录更改为/usr/local/openresty/nginx/html/default/public ,并将Lua文件放在其上一个目录。

结论

在本文中,您设置了OpenResty,这将使您能够在Nginx工作中使用Lua脚本。可以创建更复杂的Lua脚本。例如,您还可以使用Lua脚本限制访问或使用Lua重写某些请求。你可以在 lua-nginx模块的GitHub页面上找到文档 。 甚至有完整的Web框架,使用Lua on OpenResty,如 Lapis 。 如果您想了解更多,可以访问 OpenResty网站 。 因为OpenResty只是一个扩展的Nginx安装,你还可以学习如何在 Nginx服务器块教程中设置 服务器块 ,但确保用本教程中使用的路径替换教程中使用的路径。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏