From ee51062561f934a7767d24c3a085ed8c3c79f254 Mon Sep 17 00:00:00 2001 From: Mr Bot Date: Mon, 23 Sep 2019 16:21:49 +0300 Subject: [PATCH] nginx testing --- balancer/experemental/Dockerfile | 143 ++++++++++++++++++++ balancer/experemental/pre/ngninx.pre.tar.gz | Bin 9523 -> 9573 bytes 2 files changed, 143 insertions(+) diff --git a/balancer/experemental/Dockerfile b/balancer/experemental/Dockerfile index 6e6c36119..b2c733490 100644 --- a/balancer/experemental/Dockerfile +++ b/balancer/experemental/Dockerfile @@ -2,7 +2,150 @@ FROM epicmorg/devel LABEL maintainer="EpicMorg DevTeam, developer@epicm.org" ARG DEBIAN_FRONTEND=noninteractive +################################################################## +# ARGuments +################################################################## +ARG BUILDS_DIR=/builds +ARG SRC_DIR=${BUILDS_DIR}/src +ARG EXPORT_DIR=${BUILDS_DIR}/export +ARG PRE_DIR=${BUILDS_DIR}/pre +ARG NGINX_SRC_DIR=${SRC_DIR}/nginx +ARG NGINX_VERSION=1.17.3 +ARG NGINX_DOWNLOAD_URL=http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz +ARG LUAJIT_INC=/usr/local/include/luajit-2.1 +ARG LUAJIT_LIB=/usr/local/lib + +################################################################## +# Files and folders +################################################################## +RUN mkdir -p ${SRC_DIR} ${EXPORT_DIR} ${PRE_DIR} ${NGINX_SRC_DIR} /usr/lib/nginx ADD pre/ngninx.pre.tar.gz / +ADD pre/luajit2-description-pak ${PRE_DIR} +ADD pre/nginx-description-pak ${PRE_DIR} + +################################################################## +# luaJIT 2 compilling for nginx module +################################################################## +RUN cd ${SRC_DIR} && \ + git clone https://github.com/openresty/luajit2.git luajit2 && \ + cp -fv ${PRE_DIR}/luajit2-description-pak ${SRC_DIR}/luajit2/description-pak && \ + cd ${SRC_DIR}/luajit2 && \ + make && \ + make install && \ + fakeroot checkinstall -D --pakdir=${EXPORT_DIR} --maintainer="EpicMorg, developer@epicm.org" --pkgname=luajit2-custom --conflicts=luajit2 --install=no -y + +################################################################## +# nginx preparing +################################################################## +RUN wget -qO - ${NGINX_DOWNLOAD_URL} | tar -zxv --strip-components=1 -C ${NGINX_SRC_DIR} && \ + cd ${NGINX_SRC_DIR} && \ + git clone https://github.com/openresty/headers-more-nginx-module.git http-headers-more-filter && \ + git clone https://github.com/sto/ngx_http_auth_pam_module.git http-auth-pam && \ + git clone https://github.com/arut/nginx-dav-ext-module.git http-dav-ext && \ + git clone https://github.com/openresty/echo-nginx-module.git http-echo && \ + git clone https://github.com/aperezdc/ngx-fancyindex.git http-fancyindex && \ + git clone https://github.com/slact/nchan.git nchan && \ + git clone https://github.com/masterzen/nginx-upload-progress-module.git http-uploadprogress && \ + git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module http-subs-filter && \ + git clone https://github.com/grahamedgecombe/nginx-ct.git ssl-ct && \ + git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git spnego-http-auth-nginx-module && \ + git clone https://github.com/leev/ngx_http_geoip2_module http-geoip2 && \ + git clone https://github.com/flavioribeiro/nginx-audio-track-for-hls-module.git nginx-audio-track-for-hls-module && \ + git clone https://github.com/chrislim2888/ip2location-nginx.git ip2location-nginx && \ + git clone https://github.com/kaltura/nginx-vod-module.git nginx-vod-module && \ + git clone https://github.com/vozlt/nginx-module-vts.git nginx-module-vts && \ + git clone https://github.com/evanmiller/mod_zip.git mod-zip && \ + git clone https://github.com/alibaba/nginx-http-user-agent.git nginx-http-user-agent && \ + git clone https://github.com/youzee/nginx-unzip-module.git nginx-unzip-module && \ + git clone https://github.com/vladbondarenko/ngx_webp.git ngx-webp && \ + git clone https://github.com/openresty/xss-nginx-module.git xss-nginx-module && \ + git clone https://github.com/openresty/set-misc-nginx-module.git set-misc-nginx-module && \ + git clone https://github.com/arut/nginx-rtmp-module.git rtmp && \ + git clone https://github.com/kvspb/nginx-auth-ldap.git http-auth-ldap && \ + git clone https://github.com/simplresty/ngx_devel_kit.git http-ndk && \ + git clone https://github.com/chrislim2888/IP2Location-C-Library.git ip2location-c-7.0.0 && \ + git clone https://github.com/itoffshore/nginx-upstream-fair.git http-upstream-fair && \ + git clone https://github.com/yaoweibin/nginx_upstream_check_module.git nginx-upstream-check-module && \ + git clone https://github.com/openresty/lua-nginx-module http-lua + +################################################################## +# nginx compilling +################################################################## +RUN cd ${NGINX_SRC_DIR} && \ + ./configure \ + --sbin-path=/usr/sbin/nginx \ + --prefix=/usr/share/nginx \ + --conf-path=/etc/nginx/nginx.conf \ + --http-log-path=/var/log/nginx/access.log \ + --error-log-path=/var/log/nginx/error.log \ + --lock-path=/var/lock/nginx.lock \ + --pid-path=/run/nginx.pid \ + --modules-path=/usr/lib/nginx/modules \ + --http-client-body-temp-path=/var/lib/nginx/body \ + --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ + --http-proxy-temp-path=/var/lib/nginx/proxy \ + --http-scgi-temp-path=/var/lib/nginx/scgi \ + --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \ + --with-cc-opt='-I/usr/local/include/luajit-2.1 -g -O2 -lz -fstack-protector-strong -Wformat -Wno-error=date-time -Wno-error=implicit-fallthrough= -Wno-error=cast-function-type -Wno-error=format-security -Wno-error=implicit-function-declaration -Wno-error=deprecated-declarations -Wno-error=unused-result -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' \ + --with-ld-opt='-Wl,-z,relro -Wl,-z,now -lz -fPIC -L/usr/local/lib' \ + --with-file-aio \ + --with-compat \ + --with-debug \ + --with-threads \ + --with-pcre-jit \ + --with-http_ssl_module \ + --with-http_stub_status_module \ + --with-http_realip_module \ + --with-http_auth_request_module \ + --with-http_v2_module \ + --with-http_dav_module \ + --with-http_slice_module \ + --with-http_addition_module \ + --with-http_flv_module \ + --with-http_geoip_module=dynamic \ + --with-http_gunzip_module \ + --with-http_gzip_static_module \ + --with-http_image_filter_module=dynamic \ + --with-http_mp4_module \ + --with-http_perl_module=dynamic \ + --with-http_random_index_module \ + --with-http_secure_link_module \ + --with-http_sub_module \ + --with-http_xslt_module=dynamic \ + --with-mail=dynamic \ + --with-mail_ssl_module \ + --with-stream=dynamic \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --add-dynamic-module=http-headers-more-filter \ + --add-dynamic-module=http-auth-pam \ + --add-dynamic-module=http-dav-ext \ + --add-dynamic-module=http-ndk \ + --add-dynamic-module=http-echo \ + --add-dynamic-module=http-fancyindex \ + --add-dynamic-module=nchan \ + --add-dynamic-module=http-uploadprogress \ + --add-dynamic-module=http-subs-filter \ + --add-dynamic-module=ssl-ct \ + --add-dynamic-module=http-geoip2 \ + --add-dynamic-module=spnego-http-auth-nginx-module \ + --add-dynamic-module=http-auth-ldap \ + --add-dynamic-module=nginx-audio-track-for-hls-module \ + --add-dynamic-module=ip2location-nginx \ + --add-dynamic-module=nginx-vod-module \ + --add-dynamic-module=nginx-module-vts \ + --add-dynamic-module=mod-zip \ + --add-dynamic-module=nginx-http-user-agent \ + --add-dynamic-module=nginx-unzip-module \ + --add-dynamic-module=ngx-webp \ + --add-dynamic-module=set-misc-nginx-module \ + --add-dynamic-module=rtmp \ + --add-dynamic-module=http-upstream-fair \ + --add-dynamic-module=nginx-upstream-check-module \ + --add-dynamic-module=http-lua && \ + cp -fv ${PRE_DIR}/nginx-description-pak ${NGINX_SRC_DIR}/description-pak && \ + fakeroot checkinstall -D --pakdir=/builds/export --maintainer="EpicMorg, developer@epicm.org" --pkgname=nginx-custom --install=no -y + diff --git a/balancer/experemental/pre/ngninx.pre.tar.gz b/balancer/experemental/pre/ngninx.pre.tar.gz index d61ff23b206320f692cc8826d30d31f24603af0c..bf9c2735172faf460d34cb157f13291f42cdef88 100644 GIT binary patch delta 9133 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 delta 9098 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�n2HlZyicGdKlP(j%Op3td(JV!bcDEZywOssKR`xsIB0y(Wu3 z0zBdY<~$H57$9_AJ6>@-oM4DT43$xq&QHt;CqP7lDtFo`6LL5~h-pw&_=(iw1QV1; zyWS)9^FTFoe`Jy`oIoJKz+S+|gbWbVpo*#NjXy7_lrlorHE<4bv^Zn=>U48$<9bWgnnqWdTPMa5db6LKYT{O7=Y2fejq*i z4@OC@r*<**q4#zD=cGp`!t}uPUywe4KG5}Fl70&PRM&q+`Wf^yUH>)dL+FjMiMsO? z{lkxR{Tm9w3?UGIMhM=L9w87$2;Pw%ArM9gz9l_EAdC>u2slFsgb{*>^az14LhuE7 zdWH}PBLv^#$_RllLNG-N#6TD^cn1JM5WWe>G>C&R;!r>Eb!Lc%Fyir^^oWNr;!!{3 zc4ml+FycZDYlgT8BQEdZ9|T4ifq5?|G9e;!8m>;9Bqv0FTmr3w-;fqj33^=nKw88k z=yNTNHX$MsXgz*GTEyct20f9KoDk6nwDIi&&88t@5olfe18EV6V8XRD1cr!0;B)OA zX%T=xa4k&)A>4i%Y)(8RCxp|3Dc5GCg{y-Z*HQpNI6BZ~TpIsEcsYo;wjdWr9n9pK zi)p%yT`knv3_O9YCwO_?EOoXf+q#lP{wY)S8R&b(&}l zwdUeEtTDh(G#_Jm6Zug4x?0*}e4l83X3abbfNK7JB<&Ph&EKqvM>C+B->IQQAzKtZ zG3%TNbHGG%{9}xrsLB8RHTHjl-ud_cNY(EDUO--dHEsYaE^yP<@3irIg*EQcTWn)_ zQh4pWu}#}c5cVY_)@vstx%%BXR>Sreq6wwk!B17@_^(OKBhYGY(& zNMlR0b0XORe|J(0kTJ+{Bga4)i@YOD4_cVyv_Us(tUwi7bM9n}@{TYY1!tAh2Hrp! zv%DkBCZn^k!@c6yf$1XW{k~;XlqP!ma#Xh0p);yAm(| z{l89cbawt%Z!~V_|CbOIbKKuvB{9h9@~}TSa{q`Ak-UC&X7L~IZ4$4&>o>+AYB7xR z?Sb}H$pU}5e^wS`{p0b++Y^Mpo=N-$^HV+Z{MtTilRzaHlTIZHlTIZI3@yn20LO