介绍
OpenResty是一个网络服务器,通过捆绑它与许多有用的Nginx模块和Lua库扩展Nginx。 OpenResty擅长扩展Web应用程序和服务。例如,它包含的一个模块使您能够编写将直接在Nginx工作线程中执行的Lua代码,从而实现高性能应用程序。 在本指南中,您将从源代码设置OpenResty;某些发行版的预构建包可能已过期。您还将使用OpenResty的独特功能探索一些简单的示例应用程序。先决条件
要遵循本指南,您需要:- 一个Ubuntu 16.04服务器通过使用Ubuntu 16.04教程的初始服务器安装程序设置 ,包括sudo非root用户和防火墙。
第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_protocols
和ssl_prefer_server_ciphers
行。这些选项配置OpenResty的SSL选项。我们删除了易受已知的HTTPS攻击的旧协议,例如POODLE攻击。 - 添加
access_log
和error_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文件放在其上一个目录。