构建nginx1.26.1轻量级Docker镜像添加第三方模块nginx_upstream_check_module

embedded/2024/11/24 0:20:29/

文章目录

  • 1.构建自定义nginx镜像原因
  • 2.准备构建文件
  • 3.构建镜像
  • 4.验证第三方模块是否加载成功

nginx_2">1.构建自定义nginx镜像原因

  1. docker hub仓库里的nginx官方镜像太大了,足足188MB
  2. 不能重新引入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 builderARG NGINX_VERSION=1.26.1
ENV DEBIAND_FRONTEND=noninteractiveRUN 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 unzipRUN 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_moduleRUN 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 installFROM ${BASE_IMAGE}RUN addgroup --gid 999 nginx \&& adduser \--uid 999 \--gid 999 \--no-create-home \--shell /bin/bash \--disabled-password \--gecos "" \--quiet \nginxRUN mkdir -p /usr/share/nginxCOPY --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/htmlCOPY --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/nginxRUN mkdir -p /etc/nginx/conf.d \&& chown nginx:nginx /etc/nginx/conf.dRUN mkdir -p /var/log/nginx \&& chown nginx:nginx /var/log/nginxRUN 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.logRUN chown -R nginx:nginx /var/log/nginxRUN rm -f /etc/nginx/*.default \&& rm -f /etc/nginx/*-utf \&& rm -f /etc/nginx/*-win \&& rm -rf /etc/nginx/htmlENTRYPOINT /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首页:
在这里插入图片描述


访问健康检查界面:
在这里插入图片描述


http://www.ppmy.cn/embedded/139979.html

相关文章

el-table表头前几列固定,后面几列根据接口返回的值不同展示不同

在使用 Element UI 的 el-table 组件时&#xff0c;如果想要实现表头的前几列固定&#xff0c;而后面的列根据接口返回的数据动态展示&#xff0c;可以通过以下步骤来实现&#xff1a; 1. 固定表头前几列 在 el-table-column 中使用 fixed 属性来固定表头的前几列。例如&…

深度学习之目标检测的技巧汇总

1 Data Augmentation 介绍一篇发表在Big Data上的数据增强相关的文献综述。 Introduction 数据增强与过拟合 验证是否过拟合的方法&#xff1a;画出loss曲线&#xff0c;如果训练集loss持续减小但是验证集loss增大&#xff0c;就说明是过拟合了。 数据增强目的 通过数据增强…

【MySQL】避免执行SQl文件后自动转化表名为小写字母

在云端的MySQL数据库中有一部分表名为大写&#xff0c;导出sql文件其中表名也是大写&#xff0c;但是本地新建一个数据库后执行sql文件后对应的表名全部变成了小写。 解决方案&#xff1a; 因为MySQL在默认情况下会将表名转换为小写。可以通过修改MySQL配置文件中的lower_case…

机器学习周志华学习笔记-第3章<线性模型>

机器学习周志华学习笔记-第3章<线性模型> 3线性模型 意义&#xff1a;线性模型是机器学习中的基础模型&#xff0c;它通过属性的线性组合来进行预测。这种模型形式简单&#xff0c;易于理解和建模&#xff0c;并且具有良好的可解释性。原理&#xff1a;线性模型的基本形…

力扣 LeetCode 617. 合并二叉树(Day9:二叉树)

解题思路&#xff1a; 前序遍历 中左右&#xff0c;先有中间节点&#xff0c;才有左右节点 可以在原tree1的基础上操作&#xff0c;也可以重新定义一个新的树 class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if (root1 null) return root2…

elementui表格鼠标滑过不改变背景色——el-table背景色

elementui表格鼠标滑过不改变背景色 在Element UI中&#xff0c;要实现表格鼠标滑过时不改变背景色&#xff0c;可以通过CSS覆盖默认的样式。 以下是实现这一功能的CSS代码示例&#xff1a; /* 覆盖表格行鼠标滑过的背景色 */ .el-table .el-table__body tr:hover > td {…

华为IPD流程管理体系L1至L5最佳实践-解读

该文档主要介绍了华为IPD流程管理体系&#xff0c;包括流程体系架构、流程框架实施方法、各业务流程框架示例以及相关案例等内容&#xff0c;旨在帮助企业建立高效、规范的流程管理体系&#xff0c;实现业务的持续优化和发展。具体内容如下&#xff1a; 1. 华为流程体系概述 -…

Dockerfile复制目录进入镜像里

使用 ADD 复制目录进入镜像里 FROM ubuntu:22.04WORKDIR /rootRUN mkdir -p ./custom_nodes/ComfyUI-FluxTrainerADD ComfyUI-FluxTrainer ./custom_nodes/ComfyUI-FluxTrainerComfyUI-FluxTrainer 是一个目录&#xff0c;需要先 mkdir 创建这个目录&#xff0c;然后ADD 复制进…