[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
最近一个项目中用到 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("
hello, world
") - }
- }
- }
- }
运行 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 等都进行一致的高性能响应。
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/
这里作者主要针对在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/119
- client_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 "docker openresty Test." >> /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: openresty
- image: registry.cn-hangzhou.aliyuncs.com/weiyigeek/openresty:1.25.3.1-4-alpine-apk
- ports:
- - 80:80
- - 443:443
- environment:
- - TZ=Asia/Shanghai
- volumes:
- - /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/html
- networks:
- - appnet
-
- networks:
- 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;
-
- # SSL
- ssl_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;
-
- # CORS
- add_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-Protection
- add_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,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!
如果此篇文章对你有帮助,请你将它转发给更多的人!
学习推荐 往期文章
💡【相关】运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现
💡【相关】企业运维实践-Nginx使用geoip2模块并利用MaxMind的GeoIP2数据库实现处理不同国家或城市的访问最佳实践指南
感觉文章不错的童鞋,请帮忙转发,点 👍、在看,若有疑问的小伙伴,可在评论区留言你想法哟💬!