• 玩转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的简单纯文本文件,其中包含以下内容:

    1. worker_processes 1;
    2. error_log logs/error.log;
    3. events {
    4. worker_connections 1024;
    5. }
    6. http {
    7. server {
    8. listen 8080;
    9. location / {
    10. default_type text/html;
    11. content_by_lua_block {
    12. ngx.say("

      hello, world

      "
      )
    13. }
    14. }
    15. }
    16. }

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

    特性/方面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 安装。

    1. # 创建持久化目录,包含 静态资源 www, 证书目录 cert, 以及配置文件目录 conf.d
    2. mkdir -vp /share/Container/gateway-web/{www,cert,conf.d}
    3. # Nginx 基础配置文件
    4. tee /share/Container/gateway-web/nginx.conf << EOF
    5. # nginx.conf  --  docker-openresty
    6. # See https://github.com/openresty/docker-openresty/blob/master/README.md#nginx-config-files
    7. #user  nobody;
    8. #worker_processes 1;
    9. # Enables the use of JIT for regular expressions to speed-up their processing.
    10. pcre_jit on;
    11. #error_log  logs/error.log;
    12. #error_log  logs/error.log  notice;
    13. #error_log  logs/error.log  info;
    14. #pid  logs/nginx.pid;
    15. events {
    16. worker_connections  1024;
    17. }
    18. http {
    19.   include       mime.types;
    20.   default_type  application/octet-stream;
    21.   # Enables or disables the use of underscores in client request header fields.
    22.   # 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.
    23.   # underscores_in_headers off;
    24.   #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    25.   #                  '$status $body_bytes_sent "$http_referer" '
    26.   #                  '"$http_user_agent" "$http_x_forwarded_for"';
    27.   #access_log  logs/access.log  main;
    28.       # Log in JSON Format
    29.       # log_format nginxlog_json escape=json '{ "timestamp": "$time_iso8601", '
    30.       # '"remote_addr": "$remote_addr", '
    31.       #  '"body_bytes_sent": $body_bytes_sent, '
    32.       #  '"request_time": $request_time, '
    33.       #  '"response_status": $status, '
    34.       #  '"request": "$request", '
    35.       #  '"request_method": "$request_method", '
    36.       #  '"host": "$host",'
    37.       #  '"upstream_addr": "$upstream_addr",'
    38.       #  '"http_x_forwarded_for": "$http_x_forwarded_for",'
    39.       #  '"http_referrer": "$http_referer", '
    40.       #  '"http_user_agent": "$http_user_agent", '
    41.       #  '"http_version": "$server_protocol", '
    42.       #  '"nginx_access": true }';
    43.       # access_log /dev/stdout nginxlog_json;
    44.   # See Move default writable paths to a dedicated directory (#119)
    45.   # https://github.com/openresty/docker-openresty/issues/119
    46.   client_body_temp_path /var/run/openresty/nginx-client-body;
    47.   proxy_temp_path       /var/run/openresty/nginx-proxy;
    48.   fastcgi_temp_path     /var/run/openresty/nginx-fastcgi;
    49.   uwsgi_temp_path       /var/run/openresty/nginx-uwsgi;
    50.   scgi_temp_path        /var/run/openresty/nginx-scgi;
    51.   sendfile        on;
    52.   #tcp_nopush     on;
    53.   #keepalive_timeout  0;
    54.   keepalive_timeout  65;
    55.   #gzip  on;
    56.   include /etc/nginx/conf.d/*.conf;
    57.   # Don't reveal OpenResty version to clients.
    58.   # server_tokens off;
    59. }
    60. EOF

    Step 2.在NAS中创建默认Server配置文件不带SSL配置,配置文件内容如下所示。

    1. tee /share/Container/gateway-web/conf.d/default.conf <<'EOF'
    2. server {
    3. listen 80;
    4. server_name localhost;
    5. #charset koi8-r;
    6. #access_log /var/log/nginx/host.access.log main;
    7. location / {
    8. root /usr/local/openresty/nginx/html;
    9. index index.html index.htm;
    10. }
    11. error_page 500 502 503 504 /50x.html;
    12. location = /50x.html {
    13. root /usr/local/openresty/nginx/html;
    14. }
    15. }
    16. EOF
    17. # 创建一个测试页面,用于验证部署成功
    18. echo "docker openresty Test." >> /share/Container/gateway-web/www/index.html

    3e0794fb699bc0b48b0633abd770b303.png

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

    Step 3.在NAS中创建Docker-Compose资源清单文件,用于部署Openresty容器应用。

    1. # 建议创建一个 bridge 网络,避免容器间相互影响,后续需要OpenResty代理的,都安装部署的应用都加入到该网络中。
    2. docker network create --driver bridge --subnet 172.25.0.0/24 --gateway 172.25.0.1 appnet
    3.   # 7be4b7f26e819c17eb8ba8c19aeb3423d741d5003697f322907530cf898c7f82
    4. # 资源清单文件,根据实际物理目录修改映射目录哟!
    5. tee /share/Container/gateway-web/docker-compose.yaml  <<'EOF'
    6. version: '3.9'
    7. services:
    8.   gateway-web:
    9.     container_name: openresty
    10.     image: registry.cn-hangzhou.aliyuncs.com/weiyigeek/openresty:1.25.3.1-4-alpine-apk
    11.     ports:
    12.       - 80:80
    13.       - 443:443
    14.     environment:
    15.       - TZ=Asia/Shanghai
    16.     volumes:
    17.       - /share/Container/gateway-web/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf
    18.       - /share/Container/gateway-web/conf.d:/etc/nginx/conf.d
    19.       - /share/Container/gateway-web/cert:/etc/nginx/cert
    20.       - /share/Container/gateway-web/www:/usr/local/openresty/nginx/html
    21.     networks:
    22.       - appnet
    23. networks:
    24.   appnet:
    25.     external: true
    26. 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

    1. # 使用 ssh 或者 QNAP QTS 系统平台,上传证书到NAS中容器证书配置映射目录
    2. cp -a weiyigeek.top.* /share/Container/gateway-web/cert/
    3. # 增加 SSL 配置,
    4. tee /share/Container/gateway-web/default.conf <<'EOF'
    5. server {
    6.   listen       80;
    7.   listen       443 ssl;
    8.   http2 on;
    9.   server_name  nas.weiyigeek.top;
    10.   charset utf-8;
    11.   
    12.   # SSL
    13.   ssl_certificate      /etc/nginx/cert/weiyigeek.top.cer;
    14.   ssl_certificate_key  /etc/nginx/cert/weiyigeek.top.key;
    15.   ssl_session_cache    shared:MozSSL:10m;
    16.   ssl_session_timeout  1d;
    17.   ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    18.   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;
    19.   ssl_prefer_server_ciphers  on;
    20.   
    21.   # HSTS ( http 转 https )
    22.   # add_header Strict-Transport-Security "max-age=15768000;includeSubDomains;preload" always;
    23.   
    24.   # CORS
    25.   add_header Access-Control-Allow-Origin 'https://blog.weiyigeek.top';
    26.   add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
    27.   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';
    28.   
    29.   # XXS-Protection
    30.   add_header X-XSS-Protection "1; mode=block";
    31.    
    32.   #access_log  /var/log/nginx/host.access.log  main;
    33.   location / {
    34.     root   /usr/local/openresty/nginx/html;
    35.     index  index.html index.htm;
    36.   }
    37.   error_page  500 502 503 504  /50x.html;
    38.   location = /50x.html {
    39.     root   /usr/local/openresty/nginx/html;
    40.   }
    41. }
    42. EOF

    fe90262338f0071819664d00b3de1d82.png

    weiyigeek.top-Openresty容器SSL配置图

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

    1. / # nginx -s reload
    2. 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

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

  • 相关阅读:
    棒球训练的目的·棒球4号位
    MySQL面试题:用户金额充值面试题详解
    Todolist案例vue写法
    联邦学习概述与现状
    动态规划 DP专题
    java中stream常用api介绍
    网上复制代码的坑
    docker 启动镜像命令
    从中间件团队窃取了这个组件,见识到了编码能力的天花板!!
    【C++】初识类和对象
  • 原文地址:https://blog.csdn.net/u013072756/article/details/140002302