構建一個可以統計 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 倉庫中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM