构建一个可以统计 qps 的nginx服务的Dockerfile

 

github 项目地址: https://github.com/SilentCC/nginx_lua_qps_count

 

nginx 是经常会用到的web 服务器,它有出色的并发性能,因此尝尝被用来当做负载均衡服务器,反向代理服务器。

nginx 的安装很简单,我通常是使用docker 安装,在编写dockerfile 时加入自己想要的功能,这样的话就可以随时随地拿来用。

统计qps 功能的nginx 服务,我只是下面的将github上两个项目的内容组合在一起。

一个是:实时统计 nginx 状态的 lua 拓展

一个是:加上lua模块的nginx

感谢上面两个作者,给我们提供了方便。我在其中也修改了上面两个项目的内容。

其中Dockerfile:

FROM ubuntu:16.04

ENV VER_NGINX_DEVEL_KIT=0.2.19
ENV VER_LUA_NGINX_MODULE=0.10.7
ENV VER_NGINX=1.10.3
ENV VER_LUAJIT=2.0.5

ENV NGINX_DEVEL_KIT ngx_devel_kit-${VER_NGINX_DEVEL_KIT}
ENV LUA_NGINX_MODULE lua-nginx-module-${VER_LUA_NGINX_MODULE}
ENV NGINX_ROOT=/nginx
ENV WEB_DIR ${NGINX_ROOT}/html

ENV LUAJIT_LIB /usr/local/lib
ENV LUAJIT_INC /usr/local/include/luajit-2.0

RUN apt-get -qq update
#RUN apt-get install --assume-yes apt-utils
RUN apt-get -qq -y install wget

# ***** BUILD DEPENDENCIES *****

# Common dependencies (Nginx and LUAJit)
RUN apt-get -qq -y install make
# Nginx dependencies
RUN apt-get -qq -y install libpcre3
RUN apt-get -qq -y install libpcre3-dev
RUN apt-get -qq -y install zlib1g-dev
RUN apt-get -qq -y install libssl-dev
# LUAJit dependencies
RUN apt-get -qq -y install gcc
RUN apt-get install libluajit-5.1-dev --assume-yes

# ***** DOWNLOAD AND UNTAR *****

# Download
RUN wget http://nginx.org/download/nginx-${VER_NGINX}.tar.gz
RUN wget http://luajit.org/download/LuaJIT-${VER_LUAJIT}.tar.gz
RUN wget https://github.com/simpl/ngx_devel_kit/archive/v${VER_NGINX_DEVEL_KIT}.tar.gz -O ${NGINX_DEVEL_KIT}.tar.gz
RUN wget https://github.com/openresty/lua-nginx-module/archive/v${VER_LUA_NGINX_MODULE}.tar.gz -O ${LUA_NGINX_MODULE}.tar.gz
# Untar
RUN tar -xzvf nginx-${VER_NGINX}.tar.gz && rm nginx-${VER_NGINX}.tar.gz
RUN tar -xzvf LuaJIT-${VER_LUAJIT}.tar.gz && rm LuaJIT-${VER_LUAJIT}.tar.gz
RUN tar -xzvf ${NGINX_DEVEL_KIT}.tar.gz && rm ${NGINX_DEVEL_KIT}.tar.gz
RUN tar -xzvf ${LUA_NGINX_MODULE}.tar.gz && rm ${LUA_NGINX_MODULE}.tar.gz

# ***** BUILD FROM SOURCE *****

# LuaJIT
WORKDIR /LuaJIT-${VER_LUAJIT}
RUN make
RUN make install
# Nginx with LuaJIT
WORKDIR /nginx-${VER_NGINX}
RUN ./configure --prefix=${NGINX_ROOT} --with-ld-opt="-Wl,-rpath,${LUAJIT_LIB}" --add-module=/${NGINX_DEVEL_KIT} --add-module=/${LUA_NGINX_MODULE}
RUN make -j2
RUN make install
RUN ln -s ${NGINX_ROOT}/sbin/nginx /usr/local/sbin/nginx

# ***** MISC *****
WORKDIR ${WEB_DIR}
EXPOSE 4397
EXPOSE 80
EXPOSE 443

# ***** CLEANUP *****
RUN rm -rf /nginx-${VER_NGINX}
RUN rm -rf /LuaJIT-${VER_LUAJIT}
RUN rm -rf /${NGINX_DEVEL_KIT}
RUN rm -rf /${LUA_NGINX_MODULE}

COPY ngx_lua_reqstatus/ /nginx
COPY proxy_test.conf /nginx/conf/nginx.conf
# TODO: Uninstall build only dependencies?
# TODO: Remove env vars used only for build?

# This is the default CMD used by nginx:1.9.2 image
CMD ["nginx", "-g", "daemon off;"]

 

proxy_test.conf 的内容如下

worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;


    map $http_upgrade $connection_upgrade {
         default upgrade;
         ''      close;
    }

    lua_shared_dict statics_dict    1M; # 初始化变量
    lua_package_path "/nginx/?.lua";  #路径
    log_by_lua_file "/nginx/hook.lua"; #  添加此句


    server {
      listen 0.0.0.0:4397;
      location /{
         content_by_lua_file "/nginx/status.lua";
        }
     }

     server {
       listen 80 default_server;
       access_log  off;
       return 200 'Hello, World! - nginx\n';
     }

     server {
       listen 80;
       server_name recomm.cnblogs.com;
       access_log  off;
       location /{
         resolver 127.0.0.11;
         proxy_set_header Host $host;
         proxy_pass http://dev-recomm_web;
      }
    }
}

而 ngx_lua_reqstatus 文件夹里的内容则是第一个项目中的.lua 文件。没有添加可视化。

最后的效果,就是使用curl 命令:

curl http://127.0.0.1:4397/?domain=xxx.xxxx.xxx

Server Name key:    xxx.xxx.xxx
Seconds SinceLast:    1.0710000991821
Average Req Time Sec:    0.98439929089361
Request Count:    283
Requests Per Secs:    264.23900447452
5xx num:    0

 

qps 的统计原理是:每次获取qps时,会统计当前获取和上次获取之间的请求数和相差时间,从而算出qps.

 

最新版本镜像已经上传到dockerhub 仓库中

 

上一篇:Angular1.0路由的Hashbang和HTML5模式


下一篇:Windows系统版本判定那些事儿[转]