使用 Dockerfile 构建自定义 Nginx 镜像并集成 nginx_upstream_check_module

目录

1. 为什么需要自定义 Nginx 镜像?

2. Dockerfile 解析

2.1 基础镜像选择

2.2 安装依赖

2.3 下载并解压 Nginx 源码

2.4 应用补丁并编译 Nginx

2.5 暴露端口并设置启动命令

3. 构建并运行自定义 Nginx 镜像

3.1 构建镜像

3.2 运行容器

3.3 健康检测配置

4. 验证

5. 总结


1. 为什么需要自定义 Nginx 镜像?

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛应用于生产环境中。然而,默认的 Nginx 镜像可能不包含我们所需的特定模块或配置。通过自定义 Nginx 镜像,我们可以:

  • 集成第三方模块(如 nginx_upstream_check_module)。

  • 优化配置以满足特定需求。

  • 减少镜像大小,提高部署效率。

2. Dockerfile 解析

下面是我们将要使用的 Dockerfile,它基于 Alpine Linux 构建,并集成了 nginx_upstream_check_module 模块。

# 使用构建基础镜像,例如 Alpine Linux,并标记为构建阶段
FROM alpine:3.21.2

# 安装必要的依赖包,并清理缓存以减少镜像大小
RUN apk add --no-cache \
    build-base \
    pcre2-dev \
    openssl-dev \
    zlib-dev \
    linux-headers \
    && rm -rf /var/cache/apk/*

# 创建工作目录
WORKDIR /usr/local/src

# 下载 Nginx 源码和 nginx_upstream_check_module 源码,并解压
RUN wget http://nginx.org/download/nginx-1.25.3.tar.gz && \
    tar -zxvf nginx-1.25.3.tar.gz && \
    wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master && \
    unzip master

# 切换到 Nginx 源码目录,配置、编译并安装 Nginx
WORKDIR nginx-1.25.3

RUN patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch

RUN ./configure --prefix=/usr/local/nginx \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --add-module=../nginx_upstream_check_module-master \
    && make \
    && make install \
    && rm -rf /usr/local/src/*  # 清理源码和临时文件,减少最终镜像大小

# 暴露 Nginx 常用的端口
EXPOSE 80 443 8080 8000

WORKDIR /usr/local/nginx/sbin
# 设置 Nginx 为容器启动时执行的命令
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

2.1 基础镜像选择

我们选择了 alpine:3.21.2 作为基础镜像。Alpine Linux 是一个轻量级的 Linux 发行版,镜像体积小,适合构建最小化的 Docker 镜像。

2.2 安装依赖

在构建 Nginx 之前,我们需要安装一些必要的依赖包,如 build-basepcre2-devopenssl-dev 等。这些依赖包是编译 Nginx 所必需的。 

RUN apk add --no-cache \
    build-base \
    pcre2-dev \
    pcre2 \
    openssl-dev \
    zlib-dev \
    linux-headers \
    && rm -rf /var/cache/apk/*

2.3 下载并解压 Nginx 源码

接下来,我们下载 Nginx 的源码和 nginx_upstream_check_module 模块的源码,并解压它们。

RUN wget http://nginx.org/download/nginx-1.25.3.tar.gz && \
    tar -zxvf nginx-1.25.3.tar.gz && \
    wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master && \
    unzip master

2.4 应用补丁并编译 Nginx

nginx_upstream_check_module 模块需要打补丁才能与 Nginx 1.20.1+ 版本兼容。我们使用 patch 命令应用补丁,然后配置、编译并安装 Nginx。 

RUN patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch

RUN ./configure --prefix=/usr/local/nginx \
    --with-http_stub_status_module \
    --with-http_ssl_module \
    --add-module=../nginx_upstream_check_module-master \
    && make \
    && make install \
    && rm -rf /usr/local/src/*  # 清理源码和临时文件,减少最终镜像大小

2.5 暴露端口并设置启动命令

最后,我们暴露 Nginx 常用的端口(80、443、8080、8000),并设置 Nginx 为容器启动时执行的命令。

EXPOSE 80 443 8080 8000

WORKDIR /usr/local/nginx/sbin
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

3. 构建并运行自定义 Nginx 镜像

3.1 构建镜像

在 Dockerfile 所在的目录下,运行以下命令构建镜像:

docker build -t nginx-upstream-check:1.25.3 .

3.2 运行容器

构建完成后,可以使用以下命令运行容器:

docker run -d -p 8000:8000 -v /home/nginx/conf:/usr/local/nginx/conf -v /home/nginx/logs:/usr/local/nginx/logs   nginx-upstream-check:1.25.3

3.3 健康检测配置

upstream upstream1 {
      server www.baidu.com;
      server 192.168.1.3:8080;
      server 192.168.1.4:8080;
      # 每隔2秒检查后端真实节点状态,成功2次为up状态,失败3次为down状态,超时时间为1秒

      check interval=2000 rise=2 fall=3 timeout=1000 type=http;
      
      # 设置描述了检查模块在每次检查时,向后端节点发送什么样的信息
      check_http_send "HEAD / HTTP/1.0\r\n\r\n";
      
      # 健康的状态码 
      check_http_expect_alive http_2xx http_3xx;
}

4. 验证

出现以下相关日志表示已经成功

5. 总结

通过本文,我们学习了如何使用 Dockerfile 构建一个自定义的 Nginx 镜像,并集成了 nginx_upstream_check_module 模块。这种自定义镜像不仅可以根据需求灵活配置,还能减少镜像体积,提高部署效率。希望本文对你有所帮助,欢迎在评论区分享你的想法和经验!


参考链接:

  • Nginx 官方文档

  • nginx_upstream_check_module GitHub 仓库

  • Alpine Linux 官方镜像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)

官方代码https://github.com/dongbeank/CATS Abstract 时间序列预测在多领域极为关键&#xff0c;Transformer 虽推进了该领域发展&#xff0c;但有效性尚存争议&#xff0c;有研究表明简单线性模型有时表现更优。本文聚焦于自注意力机制在时间序列预测中的作用&#xff0c;提…

【MQ】Spring3 中 RabbitMQ 的使用与常见场景

一、初识 MQ 传统的单体架构&#xff0c;分布式架构的同步调用里&#xff0c;无论是方法调用&#xff0c;还是 OpenFeign 难免会有以下问题&#xff1a; 扩展性差&#xff08;高耦合&#xff0c;需要依赖对应的服务&#xff0c;同样的事件&#xff0c;不断有新需求&#xff0…

LabVIEW与USB设备开发

开发一台USB设备并使用LabVIEW进行上位机开发&#xff0c;涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输&#xff0c;帮助用户顺利完成项目开发。下面是一个详细的说明&…

kali连接xshell

1.先保证宿主机&#xff1a;以太网适配器 VMware Network Adapter VMnet8 和kali&#xff08;net 模式&#xff09;在同一个网段 windows VMnet8开启 查看是否是自动获取ip ipv4 和ipv6一样的 查看 windows VMnet8的IPv4的地址 查看 kali 的IP地址 window ping的结果&#xf…

557. 反转字符串中的单词 III 简单

557. 反转字符串中的单词 IIIhttps://leetcode.cn/problems/reverse-words-in-a-string-iii/ 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a; 输入&#xff1a;s "Lets take LeetC…

多语言订货系统的语言适配与本地化开发策略

在全球化浪潮的席卷下&#xff0c;商业世界的边界日益模糊&#xff0c;企业纷纷踏上国际化征程&#xff0c;与世界各地的客户展开紧密合作。在这一背景下&#xff0c;多语言订货系统成为企业开拓全球市场的关键基础设施&#xff0c;其语言适配能力与本地化开发策略&#xff0c;…

OpenWRT中常说的LuCI是什么——LuCI介绍(一)

我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西&#xff0c;但luci到底是什么东西&#xff0c;可能还不够清楚&#xff0c;今天就趁机来介绍下&#xff0c;openwrt中的luci&#xff0c;到底是个什么东西。 什么是LuCI&#xff1f; 首先&#xff0c;LuCI是OpenWRT中…

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…

vue3 描边加载动画

效果&#xff1a; 组件代码&#xff1a; <template><divclass"loading-wrap"ref"loadingWrap":style"[{ borderRadius: styles.borderRadius || 4px },{ borderColor: styles.borderColor || #409eff },{ border: loading ? 1px solid #40…

20240911 光迅科技 笔试

文章目录 1、选择题1.11.21.31.41.51.61.71.81.91.101.111.121.131.141.152、编程题2.1岗位:嵌入式软件工程师 题型:15 道选择题,1 道编程题 注意:本文章暂无解析,谨慎分辨答案对错 1、选择题 1.1 若某图有 100 个顶点、90 条边,则该图一定是 (C) 有向图连通图非连…

C++软件开发常见面试题(二)

struct和class的区别 指针和引用的区别&#xff1f;c为什么提供了引用这个东西&#xff1f; 说const 指针和指针 const的区别&#xff1f;例如const A*是什么意思&#xff1f;了解const 函数吗&#xff1f;具体是不修改哪些数据成员呢&#xff1f; 多态。追问&#xff1a;动态…

[生信云问题分析] 为什么医院/单位/校园网络,无法通过ssh协议访问服务器

使用生信云,生信分析更省心轻松&#xff1b;欢迎访问生信圆桌 www.tebteb.cc了解 背景 许多科研人员在日常工作中需要使用单位的网络&#xff0c;但有时会遇到一个奇怪的现象&#xff1a;虽然网页可以正常打开&#xff0c;却无法通过SSH协议访问科研服务器。SSH&#xff08;Se…

java项目之基于推荐算法的图书购物网站源码(ssm+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于推荐算法的图书购物网站项目。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于推荐算法的…

鸿蒙HarmonyOS NEXT开发:优化复杂UI页面的性能——自定义组件冻结(freezeWhenInactive属性)

文章目录 一、自定义组件冻结1、freezeWhenInactive 二、当前支持的场景1、页面路由2、TabContent3、Navigation4、组件复用 三、限制条件 一、自定义组件冻结 自定义组件冻结功能专为优化复杂UI页面的性能而设计&#xff0c;尤其适用于包含多个页面栈、长列表或宫格布局的场景…

java练习(19)

ps:练习来自力扣 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 // 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode…

如何在华为harmonyOS上调试软件

1、设置-》关于手机-》HarmonyOS 版本连按多下&#xff0c;输入锁屏密码。显示开发者模式已打开。 2、设置-》搜索“开发人员选项”-》开启“开发人员选项”选项。 3、在 开发者选项 中找到 “USB 调试” 并开启。 4、开启 “仅充电时允许 ADB 调试”。 5、设置中开启 &quo…

Leetcode 算法题 14. 最长公共前缀

起因&#xff0c; 目的: 计划: 近期先做10个简单的题目&#xff0c;找找感觉&#xff0c; 然后开始做中等的。 题目来源&#xff1a; 14. 最长公共前缀 参考题解&#xff0c; 第二个写法&#xff0c;纵向扫描 代码 1 def solu(strs):# 方法二&#xff1a;纵向扫描# strs…

称呼计算器:智能科技,简化您的计算生活

一款手机应用程序&#xff0c;安卓设备上使用。这款计算器应用以其简洁的界面、实用的功能和良好的用户体验而受到用户的喜爱。 计算器的主要特点包括&#xff1a; 基本计算功能&#xff1a;支持加、减、乘、除等基本运算。 科学计算器模式&#xff1a;提供更高级的数学运算功…

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界

文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中&#xff0c;我们通过进程监控和日志分析来发现系统问题&…

Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】

文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …