轻松构建 Nginx 镜像:如何在 Docker 中添加 stub_status 模块

引言

在当今的互联网时代,Nginx 作为一款高性能的 Web 服务器和反向代理服务器,被广泛应用于各种场景中。Docker 作为一种轻量级、可移植的容器化技术,为 Nginx 的部署和管理提供了极大的便利。在实际应用中,我们经常需要根据特定需求定制 Nginx 镜像,比如添加某些模块以扩展其功能。本文将详细介绍如何在 Docker 中构建 Nginx 镜像,并添加常用的 stub_status 模块,以监控 Nginx 的状态信息。

Nginx 与 Docker 的基本概念

在开始构建镜像之前,我们先简单了解一下 Nginx 和 Docker 的基本概念。

Nginx:是一个高性能的 HTTP 和反向代理服务器,它以其稳定性、低资源消耗和丰富的功能而闻名。Nginx 常用于负载均衡、缓存、SSL 加密和静态文件服务等领域。

Docker:是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 容器是完全使用沙箱机制,相互之间不会有任何接口。

构建基础 Nginx 镜像

在 Docker 中构建 Nginx 镜像,我们通常需要一个基础镜像,比如官方的 Nginx 镜像。然后,我们可以在此基础上添加自定义配置和模块。下面是一个简单的 Dockerfile 示例,用于构建一个基础的 Nginx 镜像:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20

# 维护者信息

LABEL maintainer="yourname@example.com"

# 将本地 Nginx 配置文件复制到容器中

COPY nginx.conf /etc/nginx/nginx.conf

# 将本地网站文件复制到容器中

COPY html /usr/share/nginx/html

# 对外暴露端口

EXPOSE 80

# 启动 Nginx

CMD \["nginx", "-g", "daemon off;"\]

在这个 Dockerfile 中,我们使用了官方的最新 Nginx 镜像作为基础镜像,然后复制了本地的 Nginx 配置文件和网站文件到容器中。最后,我们暴露了端口 80,并设置了启动命令。

添加 stub_status 模块

stub_status 模块是 Nginx 提供的一个轻量级状态监控模块,它可以提供 Nginx 的基本状态信息,如活动连接数、接受和处理的总请求数等。要添加这个模块,我们需要在构建镜像时重新编译 Nginx。

首先,我们需要创建一个包含 stub_status 模块的 Nginx 配置文件。例如:

1
2
3
4

        location /nginx_status {        stub_status on;        access_log off;        allow 127.0.0.1;        deny all;    }}

}

在这个配置文件中,我们定义了一个名为 /nginx_status 的 location,用于提供 Nginx 的状态信息。同时,我们禁止了访问日志,并只允许本地 IP 访问。

接下来,我们需要在 Dockerfile 中添加步骤来编译 Nginx 并包含 stub_status 模块。这通常涉及到安装 Nginx 的编译依赖,下载 Nginx 源代码,配置并编译。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 安装编译依赖

RUN apt-get update && apt-get install -y build-essential libpcre3-dev libssl-dev zlib1g-dev

# 下载 Nginx 源代码

RUN wget http://nginx.org/download/nginx-1.17.5.tar.gz && \\ tar -zxvf nginx-1.17.5.tar.gz

# 配置并编译 Nginx,包含 stub\_status 模块

RUN cd nginx-1.17.5 && \\ ./configure --with-http\_stub\_status\_module && \\ make && make install

# 复制 Nginx 配置文件

COPY nginx.conf /usr/local/nginx/conf/nginx.conf

# 对外暴露端口

EXPOSE 80

# 启动 Nginx

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

在这个 Dockerfile