[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
0x00 前言简述
最近一个项目中用到 Openresty,作者使用后感觉其比 Nginx 更加强大,结合Lua脚本语言可以做更多的有趣的事情,例如,结合 Redis 缓存数据库做一个实时访问统计以及链路追踪,于是就想着在性价比超高的QNAP 464C2 NAS中安装一个 Openresty 用于后续在NAS中反代一些服务用作于动态Web网关。
什么是 Openresty?
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关, 简单的说:它是一个通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台。
例如,我们先来看一个简答的OpenResty的Hello World示例,创建一个名为conf/nginix.conf
的简单纯文本文件,其中包含以下内容:
worker_processes 1;
error_log logs/error.log;
events {worker_connections 1024;
}
http {server {listen 8080;location / {default_type text/html;content_by_lua_block {ngx.say("<p>hello, world</p>")}}}
}
运行 OpenResty 后使用浏览器访问http://OpenRestyIP:8080/
,将看到返回的hello, world
文本内容,而不再是在Nginx中常常使用的return
指令来返回响应数据。
为啥要用 Openresty?
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
<br./>
OpenResty & Nginx 有啥关系?
OpenResty 和 Nginx 之间有着紧密的关系。OpenResty 可以看做是基于 Nginx 的一个分支(PS: 实际上是一个独立的软件包),它将 LuaJIT 虚拟机嵌入到 Nginx 中,从而提供了一个强大的 Web 平台,使得开发者可以使用 Lua 脚本来扩展 Nginx 的功能。
以下是 OpenResty 和 Nginx 之间的一些关键联系和区别:
特性/方面 | OpenResty | Nginx |
---|---|---|
基础 | 基于 Nginx 高性能 Web 服务器 | 高性能 Web 服务器 |
Lua 支持 | 集成 LuaJIT VM,支持 Lua 脚本 | 不直接支持 Lua,可通过第三方模块实现 |
第三方模块 | 包含额外的第三方 C 模块 | 可编译时添加第三方模块 |
版本 | 通常使用 Nginx 的 Mainline 版本 | 提供 Mainline、Stable 和 Legacy 版本 |
配置指令 | 增加了 Lua 相关的配置指令 | 标准 Nginx 配置指令 |
默认模块 | 默认包含四层负载均衡和 TLS 协议处理功能 | 可能需要手动配置这些功能 |
性能优化 | 使用 -O2 优化参数 | 使用 -O1 优化参数 |
社区和生态 | 活跃的社区,提供大量 Lua 模块和文档 | 广泛的用户基础和插件生态 |
使用场景 | 适合需要高性能和可扩展性的 Web 应用和微服务 | 适用于各种 Web 服务和反向代理场景 |
稳定性 | 可能包含最新的特性和改进,但可能相对不稳定 | Stable 版本更稳定 |
总的来说,OpenResty 是 Nginx 的一个增强版,它通过集成 LuaJIT 和其他模块,提供了更多的功能和灵活性,特别适合需要高性能和可扩展性的 Web 应用和微服务架构。
参考来源
openresty 中文官网:http://openresty.org/cn/
0x01 部署实践
这里作者主要针对在NAS中进行搭建部署的 Openresty 应用,若需要在其他Linux发行版中进行源码编译安装或者是二进制安装的,可参考其快速上路稳定 http://openresty.org/cn/getting-started.html
Step 1.在QNAP NAS中部署 Openresty
主要有两种方式, 一种是通过 docker run
进行安装,另一种则是通过 docker-compose
安装。
# 创建持久化目录,包含 静态资源 www, 证书目录 cert, 以及配置文件目录 conf.d
mkdir -vp /share/Container/gateway-web/{www,cert,conf.d}# Nginx 基础配置文件
tee /share/Container/gateway-web/nginx.conf << EOF
# nginx.conf -- docker-openresty
# See https://github.com/openresty/docker-openresty/blob/master/README.md#nginx-config-files#user nobody;
#worker_processes 1;# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;#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;
}http {include mime.types;default_type application/octet-stream;# Enables or disables the use of underscores in client request header fields.# When the use of underscores is disabled, request header fields whose names contain underscores are marked as invalid and become subject to the ignore_invalid_headers directive.# underscores_in_headers off;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;# Log in JSON Format# log_format nginxlog_json escape=json '{ "timestamp": "$time_iso8601", '# '"remote_addr": "$remote_addr", '# '"body_bytes_sent": $body_bytes_sent, '# '"request_time": $request_time, '# '"response_status": $status, '# '"request": "$request", '# '"request_method": "$request_method", '# '"host": "$host",'# '"upstream_addr": "$upstream_addr",'# '"http_x_forwarded_for": "$http_x_forwarded_for",'# '"http_referrer": "$http_referer", '# '"http_user_agent": "$http_user_agent", '# '"http_version": "$server_protocol", '# '"nginx_access": true }';# access_log /dev/stdout nginxlog_json;# See Move default writable paths to a dedicated directory (#119)# https://github.com/openresty/docker-openresty/issues/119client_body_temp_path /var/run/openresty/nginx-client-body;proxy_temp_path /var/run/openresty/nginx-proxy;fastcgi_temp_path /var/run/openresty/nginx-fastcgi;uwsgi_temp_path /var/run/openresty/nginx-uwsgi;scgi_temp_path /var/run/openresty/nginx-scgi;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;# Don't reveal OpenResty version to clients.# server_tokens off;
}
EOF
Step 2.在NAS中创建默认Server配置文件不带SSL配置,配置文件内容如下所示。
tee /share/Container/gateway-web/conf.d/default.conf <<'EOF'
server {listen 80;server_name localhost;#charset koi8-r;#access_log /var/log/nginx/host.access.log main;location / {root /usr/local/openresty/nginx/html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/local/openresty/nginx/html;}
}
EOF# 创建一个测试页面,用于验证部署成功
echo "<b>docker openresty Test.</b>" >> /share/Container/gateway-web/www/index.html
Step 3.在NAS中创建Docker-Compose资源清单文件,用于部署Openresty容器应用。
# 建议创建一个 bridge 网络,避免容器间相互影响,后续需要OpenResty代理的,都安装部署的应用都加入到该网络中。
docker network create --driver bridge --subnet 172.25.0.0/24 --gateway 172.25.0.1 appnet# 7be4b7f26e819c17eb8ba8c19aeb3423d741d5003697f322907530cf898c7f82# 资源清单文件,根据实际物理目录修改映射目录哟!
tee /share/Container/gateway-web/docker-compose.yaml <<'EOF'
version: '3.9'
services:gateway-web:container_name: openrestyimage: registry.cn-hangzhou.aliyuncs.com/weiyigeek/openresty:1.25.3.1-4-alpine-apkports:- 80:80- 443:443environment:- TZ=Asia/Shanghaivolumes:- /share/Container/gateway-web/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf- /share/Container/gateway-web/conf.d:/etc/nginx/conf.d- /share/Container/gateway-web/cert:/etc/nginx/cert- /share/Container/gateway-web/www:/usr/local/openresty/nginx/htmlnetworks:- appnetnetworks:appnet:external: true
EOF
Step 4.部署成功后将看到创建的 Openresty 容器应用,如下图所示:
Step 5.浏览器访问 NAS 地址 IP:80,可查看到网页中显示docker openresty Test.
文字,则表示部署成功,由于此处我们还没有配置证书所以监听端口暂时只有80端口,如下图所示:
Step 6.下面我们继续来为 Openresty 容器配置 SSL 证书,首先你需要有一个域名,然后通过阿里云、腾讯云或者Let's Encrypt等域名服务商购生成免费的证书,这里我使用的是 letsencrypt
免费证书,配置如下图所示:
阿里云免费SSL申请地址: https://www.aliyun.com/product/cas?source=5176.11533457&userCode=uelj47qf
腾讯云免费SSL申请地址: https://cloud.tencent.com/act/cps/redirect?redirect=10019&cps_key=b33075ae5a2baf3b47e7456ee5821502
若没有域名,可以参考作者此篇《资源分享|免费注册申请永久的eu.org顶级域名创建属于自己的域名,再也不用给博客域名续费了!》文章申请免费域名,或者在腾讯、阿里进行购买,连接直达https://help.aliyun.com/zh/dws/?source=5176.11533457&userCode=uelj47qf
# 使用 ssh 或者 QNAP QTS 系统平台,上传证书到NAS中容器证书配置映射目录
cp -a weiyigeek.top.* /share/Container/gateway-web/cert/# 增加 SSL 配置,
tee /share/Container/gateway-web/default.conf <<'EOF'
server {listen 80;listen 443 ssl;http2 on;server_name nas.weiyigeek.top;charset utf-8;# SSLssl_certificate /etc/nginx/cert/weiyigeek.top.cer;ssl_certificate_key /etc/nginx/cert/weiyigeek.top.key;ssl_session_cache shared:MozSSL:10m;ssl_session_timeout 1d;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;ssl_prefer_server_ciphers on;# HSTS ( http 转 https )# add_header Strict-Transport-Security "max-age=15768000;includeSubDomains;preload" always;# CORSadd_header Access-Control-Allow-Origin 'https://blog.weiyigeek.top';add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';# XXS-Protectionadd_header X-XSS-Protection "1; mode=block";#access_log /var/log/nginx/host.access.log main;location / {root /usr/local/openresty/nginx/html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/local/openresty/nginx/html;}
}
EOF
Step 7.修改完毕后在 QNAP QTS
平台下,重启 Openresty
容器应用,如下图所示:
/ # nginx -s reload
2024/06/26 01:31:39 [notice] 56#56: signal process started
Step 8.配置Windows本地DNS硬解析 C:\Windows\System32\drivers\etc\hosts
,末尾追加10.10.107.250 nas.weiyigeek.top
保存退出,然后在浏览器中输入 nas.weiyigeek.top
访问,如下图所示则配置成功:
至此在QNAP中部署OpenResty容器,并配置SSL证书完成,实践完成,后续作者将发布更多 OpenResty 实用技巧,一定要关注作者哟!
温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!
如果此篇文章对你有帮助,请你将它转发给更多的人!
学习推荐 往期文章
🔥【最新】运维 Tips | IT工程师常用的8个USB引导启动器工具
💡【相关】Ops实践 | 企业云原生之Ingress-Nginx资源监控与可视化仪表盘
💡【相关】运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现
💡【相关】企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳实践指南
感觉文章不错的童鞋,请帮忙转发,点 👍、在看,若有疑问的小伙伴,可在评论区留言你想法哟💬!