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

介绍

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》

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

Python:Scrapy框架的安装和基本使用

本篇文章我们来看一下强大的Python爬虫框架Scrapy。Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装。

9720
来自专栏向治洪

如何让service不被杀死

1.在service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建 @Override    ...

18470
来自专栏崔庆才的专栏

腾讯云主机Python3环境安装Scrapy爬虫框架过程及常见错误

Scrapy安装介绍Scrapy的安装有多种方式,它支持Python2.7版本及以上或Python3.3版本及以上。下面说明Python3环境下的安装过程。Sc...

2.5K10
来自专栏IT派

Python爬虫-- Scrapy入门

转行做python程序员已经有三个月了,这三个月用Scrapy爬虫框架写了两百多个爬虫,不能说精通了Scrapy,但是已经对Scrapy有了一定的熟悉。准备写一...

12550
来自专栏weixuqin 的专栏

Nginx 安装配置教程

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545 }...

20210
来自专栏Debian社区

Scrapy 架构及数据流图简介

Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘、信息处理或存储历史数据等一系列的程序中。本文着重介绍 Scrap...

14040
来自专栏hotqin888的专栏

MeritMS—利用beego实现数据库自动备份

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

20610
来自专栏Python入门

Python爬虫:Scrapy框架的安装和基本使用

大家好,本篇文章我们来看一下强大的Python爬虫框架Scrapy。Scrapy是一个使用简单,功能强大的异步爬虫框架,我们先来看看他的安装。

10800
来自专栏乐百川的学习频道

scrapy 进阶使用

前段时间我写了一篇《scrapy快速入门》,简单介绍了一点scrapy的知识。最近我的搬瓦工让墙了,而且我又学了一点mongodb的知识,所以这次就来介绍一些s...

66270
来自专栏运维

OpenResty Redis 安装部署测试SET GET功能

https://openresty.org/cn/installation.html

13020

扫码关注云+社区

领取腾讯云代金券