Docker 构建 Nginx 镜像时如何增加 stub_status 模块?

Docker 启动 Nginx 容器,如何增加拓展模块 ngx_http_stub_status_module?
如何在 Dockerfile 中构建包含此模块的 Nginx 镜像,我的目的是启动对 Nginx 的监控。

ngx_http_stub_status_module 模块提供对基本状态信息的访问。
这个模块不是默认构建的,它应该使用“--with-http_stub_status_module”配置参数来启用。

我创建了使用 Nginx 作为 Web 服务器的静态资源网站,现在打算用 Grafana 和 Prometheus 来监控此 Nginx,根据 nginx-prometheus-exporter 的文档,我需要安装此模块。注意:我想要在 Dockerfile 中构建,而不是在宿主机上二进制编译安装。


虽然 Nginx 默认不支持上述模块,但我在 Nginx 官方 Docker 镜像中发现编译了该模块。

nginx version: nginx/1.23.4
built by gcc 12.2.1 20220924 (Alpine 12.2.1_git20220924-r4)
built with OpenSSL 3.0.7 1 Nov 2022 (running with OpenSSL 3.0.8 7 Feb 2023)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/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=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --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-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed,-O1,--sort-common

经验证,Nginx Offical Docker Image 内置编译了ngx_http_stub_status_module模块。


拓展 Docker-Nginx 镜像的方法:

  1. 基于 docker-nginx 仓库提供的 modules 编译 Dockerfile,自定义构建镜像。
  2. docker-nginx 提供了更方便的构建方式 docker-nginx/pkg-oss,可以一键构建。优点是简单方便,缺点是只支持提供的模块。
  3. 使用第三方 Nginx 容器镜像而不是官方镜像,自行搜索。

参考

  1. pkg-oss https://github.com/nginx/pkg-oss
  2. docker-nginx https://github.com/nginxinc/docker-nginx
  3. How to Add Modules to Nginx Docker Image https://www.youtube.com/watch?v=26gcFN8-1Do
  4. What do I need to change in NGINX official Docker's image to have the set-misc-nginx module? https://stackoverflow.com/questions/57739560/what-do-i-need-to-change-in-nginx-official-dockers-image-to-have-the-set-misc-n
阅读 972
avatarAI BotBETA
要在 Docker 中构建包含 `ngx_http_stub_status_module` 模块的 Nginx 镜像,你可以按照以下步骤修改你的 Dockerfile:

1. 使用官方的 Nginx 源码进行构建。
2. 在配置 Nginx 时添加 `--with-http_stub_status_module` 参数。

以下是一个示例 Dockerfile:

使用官方的 Debian 基础镜像

FROM debian:buster-slim

安装必要的构建工具和库

RUN apt-get update && apt-get install -y \

build-essential \
libpcre3 \
libpcre3-dev \
zlib1g \
zlib1g-dev \
libssl-dev \
wget \
curl \
gnupg \
ca-certificates \
lsb-release \
ubuntu-keyring \
&& rm -rf /var/lib/apt/lists/*

添加 Nginx 官方签名密钥

RUN curl -fsSL https://nginx.org/keys/nginx_... | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null

设置 Nginx 源存储库

RUN echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/deb... buster nginx" | tee /etc/apt/sources.list.d/nginx.list

更新 apt 包索引并安装 Nginx

RUN apt-get update && apt-get install -y \

nginx \
nginx-module-xslt \
nginx-module-geoip \
nginx-module-image-filter \
nginx-module-nchan \
nginx-module-stream \
&& rm -rf /var/lib/apt/lists/*

获取 Nginx 源码

WORKDIR /opt/nginx-source
RUN wget http://nginx.org/download/nginx-$(nginx -v 2>&1 | grep "nginx version:" | awk '{print $3}' | cut -d. -f1,2).tar.gz && \

tar zxvf nginx-*.tar.gz && \
rm nginx-*.tar.gz

构建 Nginx,包含 stub_status 模块

WORKDIR /opt/nginx-source/nginx-*/
RUN ./configure --prefix=/opt/nginx --conf-path=/etc/nginx/nginx.conf --with-http_stub_status_module && \

make && \
make install

替换系统 Nginx 二进制文件

RUN mv /usr/sbin/nginx /usr/sbin/nginx.bak && \

cp /opt/nginx/sbin/nginx /usr/sbin/nginx

清理构建环境

RUN rm -rf /opt/nginx-source && apt-get remove --purge -y build-essential libpcre3-dev zlib1g-dev libssl-dev wget curl && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*

暴露端口和设置启动命令

EXPOSE 80 443
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]


这个 Dockerfile 做了以下几件事:

1. 使用 Debian 作为基础镜像。
2. 安装构建 Nginx 所需的依赖项。
3. 添加 Nginx 官方签名密钥和存储库。
4. 安装预编译的 Nginx 包(仅用于获取版本信息)。
5. 下载 Nginx 源码,并配置包含 `stub_status` 模块。
6. 编译 Nginx 并安装到 `/opt/nginx`。
7. 替换系统 Nginx 二进制文件为自定义构建的版本。
8. 清理构建环境,减少镜像大小。
9. 设置容器启动时运行 Nginx。

构建这个 Dockerfile 后,你可以运行 `docker build -t my-nginx-with-stub-status .` 来创建镜像,并使用 `docker run` 命令启动容器。在 Nginx 配置文件中启用 `stub_status` 后,你就可以监控 Nginx 的状态了。
2 个回答
✓ 已被采纳

回答已在提问中更新。

不好意思看错了,你可以直接使用 openresty/openresty ,它是基于Nginx和Lua的高性能Web平台,它集成了大量精良的Lua库、第三方模块以及大多数的依赖项。你直接使用就行了, 修改配置

server {
    listen 80;  
    # 监听80端口,可以自行修改端口号,注意在外层的nginx.conf中也需要对应修改配置

    location /nginx_status {
        stub_status on;
        # 打开Nginx的stub_status模块,用于监控Nginx的状态

        access_log off;
        # 关闭该location的访问日志,减少日志写入的开销
    }
}

你访问curl http://localhost:80/nginx_status 就能正常返回状态了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏