玩转NAS | 打造一个动态网关,部署OpenResty - Nginx与Lua的强强联合

ac14536d02adb6b035f18f96297c7e8e.gif

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]


0x00 前言简述

最近一个项目中用到 Openresty,作者使用后感觉其比 Nginx 更加强大,结合Lua脚本语言可以做更多的有趣的事情,例如,结合 Redis 缓存数据库做一个实时访问统计以及链路追踪,于是就想着在性价比超高的QNAP 464C2 NAS中安装一个 Openresty 用于后续在NAS中反代一些服务用作于动态Web网关。

原文地址(一定要关注作者,学习更多知识!):

玩转NAS | 打造一个动态网关,部署OpenResty - Nginx与Lua的强强联合最近一个项目中用到 Openresty,作者使用后感觉其比Nginx更加强大,结合Lua脚本语言可以做更多的有趣的事情,例如,结合Redis做个实时访问统计以及链路追踪,于是就在NAS中安装一个用于后续在NAS中反代服务用作于动态Web网关icon-default.png?t=N7T8https://mp.weixin.qq.com/s/jEHtDepQiiFIS-F6t4YQ9g

什么是 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 之间的一些关键联系和区别:

特性/方面OpenRestyNginx
基础基于 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/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 "<b>docker openresty Test.</b>" >> /share/Container/gateway-web/www/index.html

3e0794fb699bc0b48b0633abd770b303.png

weiyigeek.top-持久化目录文件结构图

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

8ef094a99ef63e193c74d9813cc23119.png

weiyigeek.top-使用QNAP中Container Station创建容器图

Step 4.部署成功后将看到创建的 Openresty 容器应用,如下图所示:

3ea2128c64d325b1d11bfd0fb20ab998.png

weiyigeek.top-在NAS中查看部署的 Openresty 容器图

Step 5.浏览器访问 NAS 地址 IP:80,可查看到网页中显示docker openresty Test.文字,则表示部署成功,由于此处我们还没有配置证书所以监听端口暂时只有80端口,如下图所示:

8c0ec1f7a1db629e960481663ed013df.png

weiyigeek.top-查看Openresty容器提供的服务是否正常工作图

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

fe90262338f0071819664d00b3de1d82.png

weiyigeek.top-Openresty容器SSL配置图

Step 7.修改完毕后在 QNAP QTS 平台下,重启 Openresty 容器应用,如下图所示:

/ # nginx -s reload
2024/06/26 01:31:39 [notice] 56#56: signal process started

85f714b3a657d4baf89c1d4816e52c80.png

weiyigeek.top-热重载Openresty服务图

Step 8.配置Windows本地DNS硬解析 C:\Windows\System32\drivers\etc\hosts ,末尾追加10.10.107.250 nas.weiyigeek.top保存退出,然后在浏览器中输入 nas.weiyigeek.top 访问,如下图所示则配置成功:

ec4c81b7b52741c3d4ad33755027887d.png

weiyigeek.top-验证Openresty容器SSL证书配置图

至此在QNAP中部署OpenResty容器,并配置SSL证书完成,实践完成,后续作者将发布更多 OpenResty 实用技巧,一定要关注作者哟!

温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!

0758008d5388eced595747b065936109.png


如果此篇文章对你有帮助,请你将它转发给更多的人!

 学习推荐 往期文章

b25c4912ecbbc4e67260ebc0c5afbb85.gif

c87c660316fdefa273f280e6dd456978.gif

感觉文章不错的童鞋,请帮忙转发,点 👍、在看,若有疑问的小伙伴,可在评论区留言你想法哟💬!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈工程师修炼指南

原创不易,赞赏鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值