写点什么

Docker 下的 OpenResty 三部曲之二:细说开发

作者:程序员欣宸
  • 2022 年 5 月 13 日
  • 本文字数:5393 字

    阅读完需:约 18 分钟

Docker下的OpenResty三部曲之二:细说开发

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

实战环境

  • 操作系统:Ubuntu16;

  • Docker 版本:17.03.2-ce;

步骤列举

  • 此镜像的准备工作如下:


  1. 提前下载必要的资源:ngx_openresty、ngx_cache_purge、nginx_upstream_check_module;

  2. 定制 nginx.conf;

  3. 开发用于 demo 演示的配置文件和 lua 脚本;


  • 镜像的 Dockerfile 脚本中要做以下事情:


  1. 源镜像为 Ubuntu 16;

  2. 准备两个目录:nginx 工作目录/usr/servers ,lua 脚本的存放目录/usr/local/work

  3. apt 换源,用阿里云的源;

  4. apt 更新;

  5. 安装必要的应用,如 gcc、libreadline-dev 等;

  6. 安装 ngx_cache_purge、nginx_upstream_check_module、ngx_openresty;

  7. 将定制好的 nginx.conf 放入镜像;

  8. 将用于 demo 演示的配置文件和 lua 脚本放入镜像;

  9. 暴露 80 端口;

  10. 配置容器启动命令,启动 nginx;

准备材料

  • 本次构建镜像所需的材料我已准备齐全,您可以在 github 下载到:



  • 这个 git 项目中有多个目录,本次所需的资源放在 nginx_lua_docker_image_files,如下图红框所示:


Dockerfile 文件

  • 下载了上述所有材料后,我们就可以进行构建了,Dockerfile 也在上述材料中,内容如下,将我们前面列举的工作逐个完成:


# Docker image for OpenResty study# VERSION 0.0.1# Author: bolingcavalry
#基础镜像使用ubuntu:16.04FROM ubuntu:16.04
#作者MAINTAINER BolingCavalry <zq2599@gmail.com>
#定义工作目录ENV WORK_PATH /usr/local/work
#定义安装目录ENV INSTALL_PATH /usr/servers
#定义nginx-openresty文件夹名称ENV NGX_OPENRESTY_PACKAGE_NAME ngx_openresty-1.7.7.2
#定义ngx_cache_purge文件夹名称,该模块用于清理nginx缓存ENV NGX_CACHE_PURGE_PACKAGE_NAME ngx_cache_purge-2.3
#定义nginx_upstream_check_module文件夹名称,该模块用于ustream健康检查ENV NGX_UPSTREAM_CHECK_PACKAGE_NAME nginx_upstream_check_module-0.3.0
#创建工作目录RUN mkdir -p $WORK_PATH
#创建安装目录RUN mkdir -p $INSTALL_PATH
#apt换源,用阿里云的源,删除原有的源RUN rm /etc/apt/sources.list
#apt换源,用阿里云的源,复制新的源COPY ./sources.list /etc/apt/sources.list
#apt更新RUN apt-get update
#创建安装目录RUN apt-get install -y make gcc libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl
#把nginx-openresty文件夹复制到工作目录COPY ./$NGX_OPENRESTY_PACKAGE_NAME $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME
######luajit start#######进入make目录,执行编译luajitRUN cd $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME/bundle/LuaJIT-2.1-20150120/ && make clean && make && make install
#软连接RUN ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit######luajit end######

######module start#######把ngx_cache_purge文件夹复制到工作目录COPY ./$NGX_CACHE_PURGE_PACKAGE_NAME $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME/bundle/$NGX_CACHE_PURGE_PACKAGE_NAME
#把nginx_upstream_check_module文件夹复制到工作目录COPY ./$NGX_UPSTREAM_CHECK_PACKAGE_NAME $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME/bundle/$NGX_UPSTREAM_CHECK_PACKAGE_NAME######module end######

######ngx_openresty start#######进入ngx_openresty目录,执行configure,执行构建RUN cd $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME && ./configure --prefix=$INSTALL_PATH --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/$NGX_CACHE_PURGE_PACKAGE_NAME/ --add-module=./bundle/$NGX_UPSTREAM_CHECK_PACKAGE_NAME/ -j2 && make && make install ######ngx_openresty end######

######复制配置文件 start#######删除原有的nginx.confRUN rm $INSTALL_PATH/nginx/conf/nginx.conf#用定制的nginx.confCOPY ./nginx.conf $INSTALL_PATH/nginx/conf/ #将新的conf文件放入指定位置,nginx.conf中对此文件有includeCOPY ./boling_cavalry.conf $WORK_PATH/#创建放置lua库的目录RUN mkdir $WORK_PATH/lualib#复制一个lua库文件COPY ./sequare.lua $WORK_PATH/lualib#创建放置lua脚本的目录RUN mkdir $WORK_PATH/lua#复制一个lua的demo脚本COPY ./test_request.lua $WORK_PATH/luaCOPY ./get_sequare.lua $WORK_PATH/lua######复制配置文件 end######

#暴露8080端口EXPOSE 80
#启动NGINXCMD ["/usr/servers/nginx/sbin/nginx", "-g", "daemon off;"]
复制代码


  • 以上脚本都有注释,就不再赘述太多了,有几个关键点需要注意:


  1. Nginx 和 OpenResty 等安装在/usr/servers 目录,而我们实战的时候配置的 conf 文件以及编写的 lua 脚本都存放在/usr/local/work 目录;

  2. 记得安装 make、gcc 等工具,否则无法编译构建 Nginx;

  3. 虽然/usr/servers/nginx/sbin/nginx 可以启动 nginx,但是会在后台运行,在 docker 容器中如果最后一个启动的进程不再占有终端,docker 服务就会停止该容器,所以需要添加"-g daemon off"参数,使得 nginx 进程不要以后台服务的方式运行,这样容器就不会退出了;

定制的 nginx.conf

  • 从 Dockerfile 中我们看见原有的 nginx.conf 被我们定制的同名文件替换了,新的 nginx.conf 相比而言做了以下改动:


  • 添加自定义模块所在目录:


lua_package_path "/usr/local/work/lualib/?.lua;;";  #lua 模块  lua_package_cpath "/usr/local/work/lualib/?.so;;";  #c模块
复制代码


  • 添加自定义配置文件:


include /usr/local/work/boling_cavalry.conf;
复制代码

自定义配置文件 boling_cavalry.conf

  • 我们将 lua 相关实战的配置都放在 boling_cavalry.conf,避免频繁修改 nginx.conf:


server {      listen       80;      server_name  _;        location ~ /lua_request/(\d+)/(\d+) {          #设置nginx变量          set $a $1;           set $b $host;          default_type "text/html";          #nginx内容处理          content_by_lua_file /usr/local/work/lua/test_request.lua;          #内容体处理完成后调用          echo_after_body "ngx.var.b $b";      }  
location ~ /lua_sequare/(\d+)/(\d+) { set $a $1; set $b $2; default_type "text/html"; set_by_lua_file $num /usr/local/work/lua/get_sequare.lua; echo "长 : $a , 宽 : $b , 面积 : $num"; }}
复制代码


  • 如上所示,定义了两个二级域名的入口逻辑:lua_request 和 lua_sequare,lua_request 用 content_by_lua_file 命令委托 test_request.lua 生成页面内容,lua_sequare 用 set_by_lua_file 给 num 变量赋值;

脚本 test_request.lua

脚本 get_sequare.lua

  • 这个脚本演示了如何使用自定义 module,有个根据长和宽计算长方形面积的 module:sequare.lua,如下所示:


-- square.lua 长方形模块local _M = {}           -- 局部的变量_M._VERSION = '1.0'     -- 模块版本
local mt = { __index = _M }
function _M.new(self, width, height) return setmetatable({ width=width, height=height }, mt)end
function _M.get_square(self) return self.width * self.heightend
function _M.get_circumference(self) return (self.width + self.height) * 2end
return _M
复制代码


  • square 可以接收长和宽两个参数,然后返回计算结果,调用该 module 的代码在 get_sequare.lua,如下:


local var = ngx.varlocal i = var.alocal j = var.blocal sequare = require("sequare")local s1 = sequare:new(i, j)
return s1:get_square()
复制代码


  • 如上所示,接收 boling_cavalry.conf 中的配置传来的长和宽两个参数,调用 sequare 计算,返回结果;

构建镜像

  • 将上述材料全部准备完毕后,在 Dockerfile 文件所在目录执行以下命令即可构建 Docker 镜像:


docker build -t bolingcavalry/ubuntu16-openresty:0.0.1 .
复制代码


  • 输出信息如下:


root@lua:~/work# docker build -t bolingcavalry/ubuntu16-openresty:0.0.1 .Sending build context to Docker daemon 24.14 MBStep 1/29 : FROM ubuntu:16.04 ---> 0458a4468cbcStep 2/29 : MAINTAINER BolingCavalry <zq2599@gmail.com> ---> Using cache ---> 16f3fb4a718eStep 3/29 : ENV WORK_PATH /usr/local/work ---> Using cache ---> 921914bc99f0Step 4/29 : ENV INSTALL_PATH /usr/servers ---> Using cache ---> d9b43a681758Step 5/29 : ENV NGX_OPENRESTY_PACKAGE_NAME ngx_openresty-1.7.7.2 ---> Using cache ---> 54b1aa1a7185Step 6/29 : ENV NGX_CACHE_PURGE_PACKAGE_NAME ngx_cache_purge-2.3 ---> Using cache ---> de9f34f26719Step 7/29 : ENV NGX_UPSTREAM_CHECK_PACKAGE_NAME nginx_upstream_check_module-0.3.0 ---> Using cache ---> 343a711f2ec7Step 8/29 : RUN mkdir -p $WORK_PATH ---> Using cache ---> 7737165f680eStep 9/29 : RUN mkdir -p $INSTALL_PATH ---> Using cache ---> f11bbb0c557dStep 10/29 : RUN rm /etc/apt/sources.list ---> Using cache ---> 862747a9c96fStep 11/29 : COPY ./sources.list /etc/apt/sources.list ---> Using cache ---> 3ca0839fc2ecStep 12/29 : RUN apt-get update ---> Using cache ---> 81f808e0748bStep 13/29 : RUN apt-get install -y make gcc libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl ---> Using cache ---> f4b9ff74e25dStep 14/29 : COPY ./$NGX_OPENRESTY_PACKAGE_NAME $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME ---> Using cache ---> 6877069f83e7Step 15/29 : RUN cd $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME/bundle/LuaJIT-2.1-20150120/ && make clean && make && make install ---> Using cache ---> b2a7f42a08b6Step 16/29 : RUN ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit ---> Using cache ---> c5cf9ba881aaStep 17/29 : COPY ./$NGX_CACHE_PURGE_PACKAGE_NAME $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME/bundle/$NGX_CACHE_PURGE_PACKAGE_NAME ---> Using cache ---> c49c78734c6dStep 18/29 : COPY ./$NGX_UPSTREAM_CHECK_PACKAGE_NAME $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME/bundle/$NGX_UPSTREAM_CHECK_PACKAGE_NAME ---> Using cache ---> b2257e5816d1Step 19/29 : RUN cd $INSTALL_PATH/$NGX_OPENRESTY_PACKAGE_NAME && ./configure --prefix=$INSTALL_PATH --with-http_realip_module  --with-pcre  --with-luajit --add-module=./bundle/$NGX_CACHE_PURGE_PACKAGE_NAME/ --add-module=./bundle/$NGX_UPSTREAM_CHECK_PACKAGE_NAME/ -j2 && make && make install ---> Using cache ---> 84959b5d75d4Step 20/29 : RUN rm $INSTALL_PATH/nginx/conf/nginx.conf ---> Using cache ---> 23c01dded8c4Step 21/29 : COPY ./nginx.conf $INSTALL_PATH/nginx/conf/ ---> Using cache ---> 776be05466acStep 22/29 : COPY ./boling_cavalry.conf $WORK_PATH/ ---> 4aa8b7334045Removing intermediate container f7e28f9fefbaStep 23/29 : RUN mkdir $WORK_PATH/lualib ---> Running in 053c920c4881 ---> 90a35711cb82Removing intermediate container 053c920c4881Step 24/29 : COPY ./sequare.lua $WORK_PATH/lualib ---> 7d5ddc4a2896Removing intermediate container ab8f06369aaaStep 25/29 : RUN mkdir $WORK_PATH/lua ---> Running in 82739117102b ---> 440da8a1d071Removing intermediate container 82739117102bStep 26/29 : COPY ./test_request.lua $WORK_PATH/lua ---> adbce564c888Removing intermediate container 1814b85953a4Step 27/29 : COPY ./get_sequare.lua $WORK_PATH/lua ---> 7dd1d9c25b56Removing intermediate container d7f97d15993aStep 28/29 : EXPOSE 80 ---> Running in 236bf062b73c ---> 3df5b6bbf8e7Removing intermediate container 236bf062b73cStep 29/29 : CMD /usr/servers/nginx/sbin/nginx -g daemon off; ---> Running in 20e3d9ce31de ---> 98b44edabb60Removing intermediate container 20e3d9ce31deSuccessfully built 98b44edabb60
复制代码

实战 OpenResty

  • 镜像构建成功后,就可以像上一章那样运行和体验 Nginx+Lua 服务了,您也可以在容器中自己去修改或者添加 Lua 脚本,实现更多的功能,修改完毕 conf 或者 Lua 脚本后,记得执行以下两个命令:


  1. 测试 Nginx 配置:/usr/servers/nginx/sbin/nginx -t

  2. Nginx 重新加载配置:/usr/servers/nginx/sbin/nginx -c /usr/servers/nginx/conf/nginx.conf -s reload


  • 至此,整个镜像的制作过程就完成了,接下来的章节,我们去 kubernetes 实战,搭建 Nginx+Lua+Tomcat 的综合服务;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 刚刚阅读数: 2
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
Docker下的OpenResty三部曲之二:细说开发_Docker_程序员欣宸_InfoQ写作社区