微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

构建一个可以统计 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 仓库中

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐