构建nginx1.26.1轻量级Docker镜像添加第三方模块nginx_upstream_check_module
文章目录
- 1.构建自定义nginx镜像原因
- 2.准备构建文件
- 3.构建镜像
- 4.验证第三方模块是否加载成功
1.构建自定义nginx镜像原因
- docker hub仓库里的nginx官方镜像太大了,足足188MB
- 不能重新引入nginx内部模块 并且也 不能静态方式 添加nginx的第三方模块。因为此过程需要涉及对nginx源代码重新编译(confgiure)&编译(make)。而官方的nginx镜像里面没有nginx源代码,显然不支持重新配置&重编译。
扩展知识:引入nginx第三方模块有两种方式,即 静态模块方式、动态模块方式。
静态模块方式:需要对原有nginx可执行文件进行替换。即重新对nginx源代码进行配置(./configure --add-module= Module PATH)和编译(make); 编译成功之后,第三方模块动态被集成在nginx可执行文件里面,然后使用编译后新生成的nginx可执行文件覆盖掉原有nginx可执行文件即可。
动态模块方式:无需对原有nginx可执行文件进行替换。主要过程是先编译生成第三方模块xx.so文件,然后在nginx配置文件中,使用load_module 命令对xx.so第三方模块文件进行进入。但需要注意的是不是所有第三方模块都能生成.so文件,例如nginx_upstream_check_module。因此 就只能采用静态模块方式进行集成。
.
生成第三方模块.so文件 的流程为:在nginx源代码进行配置(./configure–add-dynamic-module= Module PATH)和编译(make); 编译成功之后,将会生成一个.so文件。
扩展知识:关于nginx_upstream_check_module
nginx_upstream_check_module是Nginx的一个第三方模块,它实现了Nginx的主动健康检查功能。该模块可以定期向后端服务器发送健康检查包(如HTTP请求),检测后端服务器的健康状况,并根据检测结果动态地调整负载均衡策略。当检测到后端服务器出现故障或宕机时,该模块会自动将该服务器从负载均衡池中移除,直到该服务器恢复正常工作,从而提高了后端服务器的可用性和稳定性。
2.准备构建文件
构建nginx,需要使用这个这三个文件。
Dockerfile
ARG BASE_IMAGE=ubuntu:jammy
FROM ${BASE_IMAGE} as builder
ARG NGINX_VERSION=1.26.1
ENV DEBIAND_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y wget build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev libgd-dev libxml2 libxml2-dev uuid-dev unzip
RUN wget https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz \
&& tar xvfz nginx-$NGINX_VERSION.tar.gz \
&& rm -f nginx-$NGINX_VERSION.tar.get \
&& mv nginx-$NGINX_VERSION nginx \
&& wget -O nginx_upstream_check_module-master.zip https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/refs/heads/master \
&& unzip nginx_upstream_check_module-master.zip \
&& mv nginx_upstream_check_module-master /nginx_upstream_check_module
RUN cd /nginx \
&& patch -p1 < /nginx_upstream_check_module/check_1.20.1+.patch \
&& ./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/etc/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/tmp/nginx/client_temp \
--http-proxy-temp-path=/tmp/nginx/proxy_temp \
--http-fastcgi-temp-path=/tmp/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/tmp/nginx/uwsgi_temp \
--http-scgi-temp-path=/tmp/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-http_v3_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-cc-opt="-g -O2 -ffile-prefix-map=/data/builder/debuild/nginx-$NGINX_VERSION/debian/debuild-base/nginx-$NGINX_VERSION=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC" \
--with-ld-opt="-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie" \
--add-module=/nginx_upstream_check_module \
&& make \
&& make install
FROM ${BASE_IMAGE}
RUN addgroup --gid 999 nginx \
&& adduser \
--uid 999 \
--gid 999 \
--no-create-home \
--shell /bin/bash \
--disabled-password \
--gecos "" \
--quiet \
nginx
RUN mkdir -p /usr/share/nginx
COPY --from=builder --chown=nginx:nginx /etc/nginx /etc/nginx
COPY --from=builder /usr/sbin/nginx /usr/sbin/nginx
COPY --from=builder --chown=nginx:nginx /etc/nginx/html /usr/share/nginx/html
COPY --chown=nginx:nginx nginx.conf /etc/nginx/
COPY --chown=nginx:nginx default.conf /etc/nginx/conf.d/
RUN mkdir -p /tmp/nginx \
&& chown nginx:nginx /tmp/nginx
RUN mkdir -p /etc/nginx/conf.d \
&& chown nginx:nginx /etc/nginx/conf.d
RUN mkdir -p /var/log/nginx \
&& chown nginx:nginx /var/log/nginx
RUN touch /var/log/nginx/access.log \
&& touch /var/log/nginx/error.log \
&& ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
RUN chown -R nginx:nginx /var/log/nginx
RUN rm -f /etc/nginx/*.default \
&& rm -f /etc/nginx/*-utf \
&& rm -f /etc/nginx/*-win \
&& rm -rf /etc/nginx/html
ENTRYPOINT /usr/sbin/nginx -g 'daemon off;'
nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
default.conf
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
3.构建镜像
docker build -t das-nginx:1.26.1 .
注:构建过程需要联网下载文件、依赖等。故而可以选择能够连公网的服务器去构建镜像。倘若构建过程发现apt-get update更新失败,那么 检查服务器是否具备网络、或者更换为国内的安装源、又或者换成一台公有云服务器进行尝试。
坑:我这边使用本地虚拟机去构建镜像,虚拟机能连公网,但构建镜像过程中,apt-get update总是更新失败。这个过程各种怀疑,各种尝试都不行。最后找了一台 公有云服务器进行镜像构建,出乎意料的是,apt-get update马上就行执行成功了,也不需要换国内源。
4.验证第三方模块是否加载成功
启动容器
docker run -itd --name nginx -p 3333:3333 -p 80:80 -v /tmp/default.conf:/etc/nginx/conf.d/default.conf das-nginx:1.26.1
/tmp/default.conf (文件内容如下)
upstream myservers {
server 172.168.110.85:9003;
server 172.168.110.86:9003;
# 每5s(interval) 通过http方式(type)请求url地址(check_http_send)检查一次,如果请求超时(timeout=1000)或者响应状态码不在指定范围(check_http_expect_alive),则认为是失败。
# 一旦连续5次(fall)失败,则认为服务不可用,从可用服务列表中剔除。如果连续成功2次(rise),那么将服务重新添加回可用服务列表
check interval=5000 rise=2 fall=5 timeout=1000 type=http;
# 这里的/healthy配置的是你后台服务 用于健康检查的uri,需要结合实际而定。
check_http_send "HEAD /healthy HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 3333;
server_name localhost;
location /status {
# check_status是第三方插件自带的功能,用于展示服务列表的健康检查结果界面
check_status;
access_log off;
}
location / {
proxy_pass http://myservers/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}[
访问nginx首页:
访问健康检查界面: