Dockerfile编辑Nginx镜像(支持lua)

一.使用Dockerfile构建Nginx+lua

#注意,编写完Dockerfile多检查下语法;如果出现下面错误,肯定是语法错误;
#在执行文件之前docker build后会首先检查文件语法是否正确,正确才会执行;
[root@VM_0_15_centos nginx]# docker build -t nginx_colony .
Sending build context to Docker daemon 4.608 kB
Error response from daemon: Unknown instruction: &&

Dockerfile     命令:docker build -t nginx_colony .

#使用基础系统镜像
FROM centos:latest
MAINTAINER liuyu
RUN mkdir /data && mkdir /config && mkdir /nginx  && mkdir /lua  && mkdir /sock
RUN groupadd -r nginx && useradd  -r -g nginx nginx

#安装相关依赖
RUN yum -y update
RUN yum -y install  gcc gcc-c++ autoconf automake make zlib zlib-devel openssl* pcre* wget
RUN yum -y install unzip
#下载nginx的lua扩展包
RUN cd /data \
&& wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz \
&& tar -xzvf v0.10.13.tar.gz \
&& rm -rf  v0.10.13.tar.gz

RUN  cd /data \
&& wget https://codeload.github.com/simpl/ngx_devel_kit/tar.gz/v0.3.0rc1 \
&& tar -xzvf v0.3.0rc1 \
&& rm -rf v0.3.0rc1


RUN  cd /data \
&& wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz \
&& tar -xzvf ngx_cache_purge-2.3.tar.gz \
&& rm -rf ngx_cache_purge-2.3.tar.gz

#安装lua的解释器
RUN  cd /data \
&& wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz \
&& tar -xzvf LuaJIT-2.0.5.tar.gz \
&& cd ./LuaJIT-2.0.5 \
&& make PREFIX=/usr/local/ \
&& make install PREFIX=/usr/local/ \
&& cd .. \
&& export LUAJIT_LIB=/usr/local/lib \
&& export LUAJIT_INC=/usr/local/include/luajit-2.0

#安装nginx的消息推送模块
RUN cd /data \
&& wget https://github.com/wandenberg/nginx-push-stream-module/archive/master.zip \
&& unzip master.zip \
&& rm -rf master.zip

RUN  cd /data \
 && wget http://nginx.org/download/nginx-1.14.1.tar.gz \
 && tar -zxvf nginx-1.14.1.tar.gz \
 && cd nginx-1.14.1 \
 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
   --with-ld-opt="-Wl,-rpath,/usr/local/lib" \
   --with-http_stub_status_module \
   --with-http_ssl_module \
   --with-http_sub_module \
   --add-module=/data/ngx_devel_kit-0.3.0rc1 \
    --add-module=/data/lua-nginx-module-0.10.13 \
   --add-module=/data/ngx_cache_purge-2.3 \
   --add-module=/data/nginx-push-stream-module-master \
   && make && make install
#拷贝脚本文件
COPY ./nginx.sh    /usr/bin
#修改文件权限,添加软连接
RUN chmod 775 /usr/bin/nginx.sh && ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
EXPOSE 80 443
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"

二.使用docker-compose构建Nginx多容器

目录结构

MyAnswer博客

#template.lua内容
local template = require "resty.template"
template.render("index.html", { message = "Hello, World!" })
#index.html内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这是lua模板渲染出来的{{message}}</h1>
</body>
</html>

#nginx.sh脚本
#!/usr/bin/bash
nginx -c /nginx-test/nginx.conf

#lua目录是存放lua扩展包的
#nginx-lua目录是nginx的分发层,分发请求
#nginx-lua1目录是应用层,渲染模板,获取数据
#nginx-lua2目录是应用层,渲染模板,获取数据
#log目录是存放nginx日志文件


docker-compose文件 命令:docker-compose up -d

version: "3"
services:
  nginx:
        image: nginx_colony
        container_name: nginx_colony
        working_dir: /nginx-test
        ports:
          - "8001:80"
        stdin_open: true
        networks:
          nginx-master:
               ipv4_address: 172.50.0.5
        #开启伪终端,即命令行
        tty: true
        #运行容器运行特定的命令
        privileged: true
        volumes:
          - /docker/nginx/nginx-luad:/nginx-test
          - /docker/nginx/lua:/lua-packge
        entrypoint:
          - /bin/bash
          - nginx.sh
  nginx-lua1:
        image: nginx_colony
        container_name: nginx-lua1
        working_dir: /nginx-test
        ports:
          - "8002:80"
        stdin_open: true
        networks:
          nginx-slave:
               ipv4_address: 172.30.0.5
        #开启伪终端,即命令行
        tty: true
        #运行容器运行特定的命令
        privileged: true
        volumes:
          - /docker/nginx/nginx-lua1:/nginx-test
          - /docker/nginx/lua:/lua-packge
        entrypoint:
          - /bin/bash
          - nginx.sh
  nginx-lua2:
        image: nginx_colony
        container_name: nginx-lua2
        working_dir: /nginx-test
        ports:
          - "8003:80"
        stdin_open: true
        networks:
          nginx-slave:
               ipv4_address: 172.30.0.6
        #开启伪终端,即命令行
        tty: true
        #运行容器运行特定的命令
        privileged: true
        volumes:
          - /docker/nginx/nginx-lua2:/nginx-test
          - /docker/nginx/lua:/lua-packge
        entrypoint:
          - /bin/bash
          - nginx.sh
networks:
  nginx-master:
      external:
         #使用之前创建的桥接网络
         name: redis_redis-master
  nginx-slave:
      external:
          name: redis_redis-slave

访问下分发层是否能够访问

MyAnswer博客


直接访问应用层,测试环境是否ok

MyAnswer博客

MyAnswer博客

三.lua嵌入Nginx分发层,转发请求到应用层

分发层的 luastream.lua文件; 根据id的值通过一定的算法获取到服务器地址

local uri_args=ngx.req.get_uri_args() --获取get请求地址
local id=uri_args["id"] --获取id参数
local hash=ngx.crc32_long(id)
local  server={"http://45.40.207.143:8002","http://45.40.207.143:8003"} --应用层服务层
local  index=(hash % table.getn(server))+1 --更具id值计算,分配服务器
local url=server[index] --获取服务器的应用层IP地址
ngx.say(url);
local  http= require("resty.http")  --引入http模块
local  httpClient=http.new() --实例化
local  resp,err = httpClient:request_uri(url,{method="GET"}) --请求转发到应用服务器
if not resp then  --如果响应不true,输出错误信息
     ngx.say(err)
     return
end
ngx.say(resp.body)  --将应用服务器的结果输出
httpClient:close()  --关闭连接,释放资源



MyAnswer博客
请先登录后发表评论
  • 最新评论
  • 总共1条评论
MyAnswer博客

乖,摸摸头:和六星peter老师讲的一模一样

2019-10-20 09:33:12 回复