前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu上使用Nginx web框架OpenResty

如何在Ubuntu上使用Nginx web框架OpenResty

原创
作者头像
林岑影
发布2018-08-07 14:35:25
1.4K1
发布2018-08-07 14:35:25
举报

介绍

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。 OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

在本教程中,你将从源代码设置OpenResty® , 一些发行版的软件包可能已经过时了。你还将探索一些具有OpenResty独特功能的简单示例应用程序。

准备

要遵循本教程,你需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

注意:服务器不能是已经安装了Nginx,因为OpenRsty带Nginx,如果安装了Nginx可能会出现问题。

第1步、下载OpenResty的源代码和依赖项

在本节中,我们将从源代码安装OpenResty。首先,从OpenResty网站的下载页面中找到最新的OpenResty源代码版本。下载tar包,确保将版本号替换为最新版本(1.11.2.2已经旧版本了,请务必替换成新版的下载链接)。

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):

gpg: 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

你将看到以下输出:

gpg: 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

我们将使用PCRE正则表达式和支持IPv6来配置OpenResty。我们还将通过提供-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允许HTTPS 。然后查看一下防火墙状态,看看是否生效:

sudo ufw status

你应该在显示的输出中看到允许的HTTP流量(80端口),以及添加它时的HTTPS(443端口)。

Status: 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。你将看到一个页面,显示Welcome to OpenResty!,这样就能确认它已完全安装并正常工作。

你现在可以停止OpenResty服务器。

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

已安装OpenResty,但你仍需要将OpenResty设置为开机启动。

第3步 - 将OpenResty设置为服务

在这里,我们将OpenResty设置开机启动。我们将使用systemd服务执行此操作。首先使用nano或者其他你喜欢的文本编辑器创建一个新systemd文件。

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

在本教程中,我们将从全新安装中复制默认的 systemd文件,并为OpenResty进行修改。完整的文件看起来像这样,粘贴到我们刚刚打开的文件中。我们将解释介绍每个部分正在做什么。

# 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告诉systemdOpenResty在启动时创建的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告诉OpenResty 的全局指令,我们希望它在后台作为守护进程启动。我们执行这个ExecStartPre脚本,这样systemd就不会在配置文件无效的时候尝试启动OpenResty,因为它会在此命令上出错。
  • ExecStart=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;'实际上启动了OpenReesty。这与ExecStartPre没有-t标志的情况相同。
  • 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指定当OpenResty在5秒后没有停止时,systemd应该如何尝试停止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

默认情况下,它将如下所示:

#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 {行前的所有内容,并将其替换为以下三行:

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启动penResty 。

sudo systemctl start openresty

你现在可以再次访问http://your_server_ip并且能看到跟之前一样的网页。跟之前不同的现在的OpenResty是由systemd启动。

最后一步是启用服务,以确保在启动时启动OpenResty。

sudo systemctl enable openresty

现在我们已经配置了服务,我们可以进一步配置OpenResty。

第4步 - 配置OpenResty

为了配置OpenResty,我们使用默认的Nginx配置作为参考。

首先,再次打开OpenResty配置文件:

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

这一次,我们将修改http块并将此http块内的服务器块移动到新文件。 首先,找到http {line,然后删除里面所有内容,除了}

user www-data;
worker_processes  auto;
pid /run/openresty.pid;
​
events {
    worker_connections  1024;
}
​
http {
    include       mime.types;
    default_type  application/octet-stream;
​
    . . .
}

然后,将以下内容复制到http块中,整个文件看起来像这样。我们再检查一次。

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只发送完整的数据包。这将允许OpenResty优化向客户端发送静态文件。
  • 添加tcp_nodelay;。此选项将尝试尽快发送数据包,这可能与上述选项相反,但它在不同的时间使用。 tcp_nodelay仅在HTTP请求上使用keepalive选项时使用,HTTP请求是Web浏览器与Web服务器的连接,可避免每次发出请求时启动HTTP连接的开销。
  • 添加和修改ssl_protocolsssl_prefer_server_ciphers行。这些选项配置OpenRestySSL选项。我们删除了易受已知的HTTPS攻击的旧协议,例如POODLE攻击。
  • 添加access_logerror_log行,用于配置Web服务器日志的位置。我们将日志存储在我们在上一步中创建的/var/log/openresty目录中。
  • 取消注释gzip并添加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,但具有内联注释以获取更多详细信息。

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

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

首先,我们将查看content_by_lua_block配置选项。从下面的示例配置中复制location块,并将其添加到server块中,在两个现有location块下面。

server {
    . . .

    location /example {
         default_type 'text/plain';

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

保存并关闭该文件,然后重新加载配置。

sudo systemctl reload openresty

如果你现在访问http://your_server_ip/example,你会看到一个页面上写着Hello,Sammy!。让我们解释一下这是如何工作的。

content_by_lua_block配置指令执行中的一切作为Lua代码。在这里,我们使用Lua函数ngx.say打印Hello,Sammy!到页面。

再举一个例子,用下面的内容这个替换location /example块的内容:

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

将以下内容添加到文件中,然后保存并关闭它。

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

这是一个简单的Lua,它读取URL中的查询参数name,并自定义问候消息。如果没有传递参数,则使用“Anonymous”代替。

再次重新加载配置。

sudo systemctl reload openresty

现在,用你的浏览器访问http://your_server_ip/example?name=Sammy 。这将显示Hello,Sammy!。你可以更改name查询参数,也可以完全忽略它。

Hello, Sammy!

你还可以更改name查询参数可以显示其他名称。

警告:不要将正在加载的Lua文件放在Web上的可访问位置。如果有人访问此文件,你的应用程序代码可能会暴露。将文件放在文档根目录之外,例如将文档根目录更改为/usr/local/openresty/nginx/html/default/public并将Lua文件放在其上一个目录中。

结论

在本文中,你设置了OpenResty,它将使你能够在Nginx中使用Lua脚本。可以创建更复杂的Lua脚本。例如,你还可以使用Lua脚本限制访问或使用Lua重写某些请求。你可以在lua-nginx-module的GitHub页面上找到该文档。甚至还有完整的Web框架在OpenResty上使用Lua,例如Lapis

由于OpenResty只是一个扩展的Nginx安装,你还可以学习如何设置服务器块,如果你想了解更多信息,可以访问OpenResty网站。更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Use the OpenResty Web Framework for Nginx on Ubuntu 16.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第1步、下载OpenResty的源代码和依赖项
  • 第2步 - 安装OpenResty
  • 第3步 - 将OpenResty设置为服务
  • 第4步 - 配置OpenResty
  • 第5步 - 使用OpenResty Lua模块
  • 结论
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档