升级 Kubernetes Ingress NGINX Controller: 自助编译 NGINX 的实践

保持软件的更新对于系统的安全性和稳定性至关重要。本文将介绍如何从源代码自助编译 NGINX,并将其集成到 Kubernetes Ingress NGINX Controller 镜像中,以实现 NGINX 的升级。此方法不仅可以提高系统的安全性,还可以定制 NGINX 的功能,以满足特定需求。

前提条件
  1. 需要一个可以访问 Docker 的环境。
  2. 需要安装 wgettar 等基本工具。
  3. 基础镜像使用 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
目标
  • 从源代码编译 NGINX。
  • 将编译后的 NGINX 集成到 Ingress NGINX Controller 镜像中。
  • 保持镜像的最小化和安全性。
官方镜像的 Dockerfile

在开始自定义构建之前,了解官方的 Dockerfile 是很有必要的。以下是 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 镜像的官方 Dockerfile:

# Copyright 2015 The Kubernetes Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.ARG BASE_IMAGEFROM ${BASE_IMAGE}ARG TARGETARCH
ARG VERSION
ARG COMMIT_SHA
ARG BUILD_ID=UNSETLABEL org.opencontainers.image.title="NGINX Ingress Controller for Kubernetes"
LABEL org.opencontainers.image.documentation="https://kubernetes.github.io/ingress-nginx/"
LABEL org.opencontainers.image.source="https://github.com/kubernetes/ingress-nginx"
LABEL org.opencontainers.image.vendor="The Kubernetes Authors"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.version="${VERSION}"
LABEL org.opencontainers.image.revision="${COMMIT_SHA}"LABEL build_id="${BUILD_ID}"WORKDIR  /etc/nginxRUN apk update \&& apk upgrade \&& apk add --no-cache \diffutils \&& rm -rf /var/cache/apk/*COPY --chown=www-data:www-data etc /etcCOPY --chown=www-data:www-data bin/${TARGETARCH}/dbg /
COPY --chown=www-data:www-data bin/${TARGETARCH}/nginx-ingress-controller /
COPY --chown=www-data:www-data bin/${TARGETARCH}/wait-shutdown /# Fix permission during the build to avoid issues at runtime
# with volumes (custom templates)
RUN bash -xeu -c ' \writeDirs=( \/etc/ingress-controller/ssl \/etc/ingress-controller/auth \/etc/ingress-controller/geoip \/etc/ingress-controller/telemetry \/var/log \/var/log/nginx \/tmp/nginx \); \for dir in "${writeDirs[@]}"; do \mkdir -p ${dir}; \chown -R www-data.www-data ${dir}; \done' \# LD_LIBRARY_PATH does not work so below is needed for  opentelemetry/other modules# Put libs of newer modules under `/modules_mount/etc/nginx/modules/otel` and add that path below# Could get complicated arch specific paths become a need&& echo "/lib:/usr/lib:/usr/local/lib:/modules_mount/etc/nginx/modules/otel" > /etc/ld-musl-x86_64.pathRUN apk add --no-cache libcap \&& setcap    cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap -v cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap    cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap -v cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap    cap_net_bind_service=+ep /usr/bin/dumb-init \&& setcap -v cap_net_bind_service=+ep /usr/bin/dumb-init \&& apk del libcap \&& ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginxUSER www-data# Create symlinks to redirect nginx logs to stdout and stderr docker log collector
RUN  ln -sf /dev/stdout /var/log/nginx/access.log \&& ln -sf /dev/stderr /var/log/nginx/error.logENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["/nginx-ingress-controller"]
编译 NGINX

接下来,我们编译 NGINX 需要一个干净的构建环境。在这里,我们使用多阶段构建技术,通过一个临时的构建容器编译 NGINX,并将最终的编译结果复制到目标容器中。

Dockerfile
# 第一阶段:编译 nginx
FROM alpine:3.11 AS build# 安装编译所需的依赖
RUN apk add --no-cache \build-base \zlib-dev \openssl-dev \pcre-dev \wget \tar# 下载并解压 Nginx 源代码
ARG NGINX_VERSION=1.26.1
RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz -O /tmp/nginx.tar.gz && \tar -zxvf /tmp/nginx.tar.gz -C /tmp# 进入源码目录,配置和编译 Nginx
WORKDIR /tmp/nginx-${NGINX_VERSION}
RUN ./configure \--prefix=/usr/local/nginx \--sbin-path=/usr/local/nginx/sbin/nginx \--modules-path=/usr/local/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 && \make && make install# 第二阶段:创建最终的运行容器
FROM quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0USER root# 从构建阶段复制编译好的 Nginx 可执行文件和模块
COPY --from=build /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx# 创建符号链接
RUN ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginx# 确保使用官方的 ENTRYPOINT 和 CMD
USER www-data# 重新声明 ENTRYPOINT 和 CMD
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["/nginx-ingress-controller"]
步骤解释
  1. 第一阶段:编译 NGINX

    • 使用 alpine:3.11 作为基础镜像,安装编译 NGINX 所需的依赖。这与 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 的基础镜像保持一致,以确保兼容性。
    • 下载并解压 NGINX 源代码。
    • 配置并编译 NGINX,指定各类路径和模块。特别注意,
  2. 第二阶段:集成编译好的 NGINX

    • 使用 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 作为基础镜像。
    • 将编译好的 NGINX 可执行文件和模块从构建阶段复制到目标镜像中。
    • 创建符号链接,以确保 NGINX 可执行文件在系统路径中可用。
    • 重新声明 ENTRYPOINTCMD,确保保持官方镜像的默认配置,这对于在 Kubernetes 中运行非常重要。
为什么使用 alpine:3.11 作为编译镜像

选择 alpine:3.11 作为编译镜像的原因是确保与 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 的基础镜像保持一致。这样做有以下几个优点:

  1. 兼容性:使用相同的基础镜像版本可以最大限度地减少在不同 Alpine 版本之间可能出现的兼容性问题。
  2. 安全性:使用与官方镜像相同的基础镜像可以确保我们继承了相同的安全性更新和修补程序。
  3. 一致性:确保编译环境与运行环境的一致性,有助于减少在开发和生产环境中的潜在问题。
官方 Dockerfile 中与 NGINX 相关的代码解释

官方 Dockerfile 中与 NGINX 相关的代码部分主要集中在以下几个方面:

  1. 安装依赖

    RUN apk update \&& apk upgrade \&& apk add --no-cache \diffutils \&& rm -rf /var/cache/apk/*
    

    这部分代码用于更新软件包列表并安装必要的依赖。

  2. 复制配置和二进制文件

    COPY --chown=www-data:www-data etc /etc
    COPY --chown=www-data:www-data bin/${TARGETARCH}/dbg /
    COPY --chown=www-data:www-data bin/${TARGETARCH}/nginx-ingress-controller /
    COPY --chown=www-data:www-data bin/${TARGETARCH}/wait-shutdown /
    

    这部分代码将配置文件和二进制文件复制到镜像中,并确保它们的所有者是 www-data 用户。

  3. 修复权限

    RUN bash -xeu -c ' \writeDirs=( \/etc/ingress-controller/ssl \/etc/ingress-controller/auth \/etc/ingress-controller/geoip \/etc/ingress-controller/telemetry \/var/log \/var/log/nginx \/tmp/nginx \); \for dir in "${writeDirs[@]}"; do \mkdir -p ${dir}; \chown -R www-data.www-data ${dir}; \done' \&& echo "/lib:/usr/lib:/usr/local/lib:/modules_mount/etc/nginx/modules/otel" > /etc/ld-musl-x86_64.path
    

    这部分代码创建一些必要的目录并设置适当的权限。此外,它还配置了库路径。

  4. 设置权限

    RUN apk add --no-cache libcap \&& setcap    cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap -v cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap    cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap -v cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap    cap_net_bind_service=+ep /usr/bin/dumb-init \&& setcap -v cap_net_bind_service=+ep /usr/bin/dumb-init \&& apk del libcap \&& ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginx
    

    这部分代码为一些二进制文件设置了必要的权限,以允许它们绑定到低编号端口。此外,还创建了符号链接,以确保 NGINX 可执行文件在系统路径中可用。

  5. 用户和日志

    USER www-data
    RUN  ln -sf /dev/stdout /var/log/nginx/access.log \&& ln -sf /dev/stderr /var/log/nginx/error.log
    

    这部分代码切换到 www-data 用户,并设置符号链接,以将 NGINX 日志输出到标准输出和标准错误,这对于 Docker 日志收集非常有用。

  6. 入口点和命令

    ENTRYPOINT ["/usr/bin/dumb-init", "--"]
    CMD ["/nginx-ingress-controller"]
    

    这部分代码定义了容器的入口点和默认命令。dumb-init 用于处理子进程的信号和重新aping,而 nginx-ingress-controller 是实际的控制器二进制文件。

通过以上步骤,我们不仅实现了从源代码编译 NGINX 并集成到 Ingress NGINX Controller 镜像中,还确保了新镜像与官方镜像在运行时的行为保持一致。这样做不仅提高了系统的安全性和稳定性,还可以根据需要定制 NGINX 的功能。
保持软件的更新对于系统的安全性和稳定性至关重要。本文将介绍如何从源代码自助编译 NGINX,并将其集成到 Kubernetes Ingress NGINX Controller 镜像中,以实现 NGINX 的升级。此方法不仅可以提高系统的安全性,还可以定制 NGINX 的功能,以满足特定需求。

前提条件
  1. 需要一个可以访问 Docker 的环境。
  2. 需要安装 wgettar 等基本工具。
  3. 基础镜像使用 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
目标
  • 从源代码编译 NGINX。
  • 将编译后的 NGINX 集成到 Ingress NGINX Controller 镜像中。
  • 保持镜像的最小化和安全性。
官方镜像的 Dockerfile

在开始自定义构建之前,了解官方的 Dockerfile 是很有必要的。以下是 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 镜像的官方 Dockerfile:

# Copyright 2015 The Kubernetes Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.ARG BASE_IMAGEFROM ${BASE_IMAGE}ARG TARGETARCH
ARG VERSION
ARG COMMIT_SHA
ARG BUILD_ID=UNSETLABEL org.opencontainers.image.title="NGINX Ingress Controller for Kubernetes"
LABEL org.opencontainers.image.documentation="https://kubernetes.github.io/ingress-nginx/"
LABEL org.opencontainers.image.source="https://github.com/kubernetes/ingress-nginx"
LABEL org.opencontainers.image.vendor="The Kubernetes Authors"
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL org.opencontainers.image.version="${VERSION}"
LABEL org.opencontainers.image.revision="${COMMIT_SHA}"LABEL build_id="${BUILD_ID}"WORKDIR  /etc/nginxRUN apk update \&& apk upgrade \&& apk add --no-cache \diffutils \&& rm -rf /var/cache/apk/*COPY --chown=www-data:www-data etc /etcCOPY --chown=www-data:www-data bin/${TARGETARCH}/dbg /
COPY --chown=www-data:www-data bin/${TARGETARCH}/nginx-ingress-controller /
COPY --chown=www-data:www-data bin/${TARGETARCH}/wait-shutdown /# Fix permission during the build to avoid issues at runtime
# with volumes (custom templates)
RUN bash -xeu -c ' \writeDirs=( \/etc/ingress-controller/ssl \/etc/ingress-controller/auth \/etc/ingress-controller/geoip \/etc/ingress-controller/telemetry \/var/log \/var/log/nginx \/tmp/nginx \); \for dir in "${writeDirs[@]}"; do \mkdir -p ${dir}; \chown -R www-data.www-data ${dir}; \done' \# LD_LIBRARY_PATH does not work so below is needed for  opentelemetry/other modules# Put libs of newer modules under `/modules_mount/etc/nginx/modules/otel` and add that path below# Could get complicated arch specific paths become a need&& echo "/lib:/usr/lib:/usr/local/lib:/modules_mount/etc/nginx/modules/otel" > /etc/ld-musl-x86_64.pathRUN apk add --no-cache libcap \&& setcap    cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap -v cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap    cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap -v cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap    cap_net_bind_service=+ep /usr/bin/dumb-init \&& setcap -v cap_net_bind_service=+ep /usr/bin/dumb-init \&& apk del libcap \&& ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginxUSER www-data# Create symlinks to redirect nginx logs to stdout and stderr docker log collector
RUN  ln -sf /dev/stdout /var/log/nginx/access.log \&& ln -sf /dev/stderr /var/log/nginx/error.logENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["/nginx-ingress-controller"]
编译 NGINX

接下来,我们编译 NGINX 需要一个干净的构建环境。在这里,我们使用多阶段构建技术,通过一个临时的构建容器编译 NGINX,并将最终的编译结果复制到目标容器中。

Dockerfile
# 第一阶段:编译 nginx
FROM alpine:3.11 AS build# 安装编译所需的依赖
RUN apk add --no-cache \build-base \zlib-dev \openssl-dev \pcre-dev \wget \tar# 下载并解压 Nginx 源代码
ARG NGINX_VERSION=1.26.1
RUN wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz -O /tmp/nginx.tar.gz && \tar -zxvf /tmp/nginx.tar.gz -C /tmp# 进入源码目录,配置和编译 Nginx
WORKDIR /tmp/nginx-${NGINX_VERSION}
RUN ./configure \--prefix=/usr/local/nginx \--sbin-path=/usr/local/nginx/sbin/nginx \--modules-path=/usr/local/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 && \make && make install# 第二阶段:创建最终的运行容器
FROM quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0USER root# 从构建阶段复制编译好的 Nginx 可执行文件和模块
COPY --from=build /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx# 创建符号链接
RUN ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginx# 确保使用官方的 ENTRYPOINT 和 CMD
USER www-data# 重新声明 ENTRYPOINT 和 CMD
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["/nginx-ingress-controller"]
步骤解释
  1. 第一阶段:编译 NGINX

    • 使用 alpine:3.11 作为基础镜像,安装编译 NGINX 所需的依赖。这与 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 的基础镜像保持一致,以确保兼容性。
    • 下载并解压 NGINX 源代码。
    • 配置并编译 NGINX,指定各类路径和模块。特别注意,
  2. 第二阶段:集成编译好的 NGINX

    • 使用 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 作为基础镜像。
    • 将编译好的 NGINX 可执行文件和模块从构建阶段复制到目标镜像中。
    • 创建符号链接,以确保 NGINX 可执行文件在系统路径中可用。
    • 重新声明 ENTRYPOINTCMD,确保保持官方镜像的默认配置,这对于在 Kubernetes 中运行非常重要。
为什么使用 alpine:3.11 作为编译镜像

选择 alpine:3.11 作为编译镜像的原因是确保与 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 的基础镜像保持一致。这样做有以下几个优点:

  1. 兼容性:使用相同的基础镜像版本可以最大限度地减少在不同 Alpine 版本之间可能出现的兼容性问题。
  2. 安全性:使用与官方镜像相同的基础镜像可以确保我们继承了相同的安全性更新和修补程序。
  3. 一致性:确保编译环境与运行环境的一致性,有助于减少在开发和生产环境中的潜在问题。
官方 Dockerfile 中与 NGINX 相关的代码解释

官方 Dockerfile 中与 NGINX 相关的代码部分主要集中在以下几个方面:

  1. 安装依赖

    RUN apk update \&& apk upgrade \&& apk add --no-cache \diffutils \&& rm -rf /var/cache/apk/*
    

    这部分代码用于更新软件包列表并安装必要的依赖。

  2. 复制配置和二进制文件

    COPY --chown=www-data:www-data etc /etc
    COPY --chown=www-data:www-data bin/${TARGETARCH}/dbg /
    COPY --chown=www-data:www-data bin/${TARGETARCH}/nginx-ingress-controller /
    COPY --chown=www-data:www-data bin/${TARGETARCH}/wait-shutdown /
    

    这部分代码将配置文件和二进制文件复制到镜像中,并确保它们的所有者是 www-data 用户。

  3. 修复权限

    RUN bash -xeu -c ' \writeDirs=( \/etc/ingress-controller/ssl \/etc/ingress-controller/auth \/etc/ingress-controller/geoip \/etc/ingress-controller/telemetry \/var/log \/var/log/nginx \/tmp/nginx \); \for dir in "${writeDirs[@]}"; do \mkdir -p ${dir}; \chown -R www-data.www-data ${dir}; \done' \&& echo "/lib:/usr/lib:/usr/local/lib:/modules_mount/etc/nginx/modules/otel" > /etc/ld-musl-x86_64.path
    

    这部分代码创建一些必要的目录并设置适当的权限。此外,它还配置了库路径。

  4. 设置权限

    RUN apk add --no-cache libcap \&& setcap    cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap -v cap_net_bind_service=+ep /nginx-ingress-controller \&& setcap    cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap -v cap_net_bind_service=+ep /usr/local/nginx/sbin/nginx \&& setcap    cap_net_bind_service=+ep /usr/bin/dumb-init \&& setcap -v cap_net_bind_service=+ep /usr/bin/dumb-init \&& apk del libcap \&& ln -sf /usr/local/nginx/sbin/nginx /usr/bin/nginx
    

    这部分代码为一些二进制文件设置了必要的权限,以允许它们绑定到低编号端口。此外,还创建了符号链接,以确保 NGINX 可执行文件在系统路径中可用。

  5. 用户和日志

    USER www-data
    RUN  ln -sf /dev/stdout /var/log/nginx/access.log \&& ln -sf /dev/stderr /var/log/nginx/error.log
    

    这部分代码切换到 www-data 用户,并设置符号链接,以将 NGINX 日志输出到标准输出和标准错误,这对于 Docker 日志收集非常有用。

  6. 入口点和命令

    ENTRYPOINT ["/usr/bin/dumb-init", "--"]
    CMD ["/nginx-ingress-controller"]
    

    这部分代码定义了容器的入口点和默认命令。dumb-init 用于处理子进程的信号和重新aping,而 nginx-ingress-controller 是实际的控制器二进制文件。

通过以上步骤,我们不仅实现了从源代码编译 NGINX 并集成到 Ingress NGINX Controller 镜像中,还确保了新镜像与官方镜像在运行时的行为保持一致。这样做不仅提高了系统的安全性和稳定性,还可以根据需要定制 NGINX 的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ipvsadm命令总结

ipvsadm命令总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 什么是ipvsadm命令? ipvsadm是Linux系统下的一个命令行工具,用于配置…

【Oracle】调用HTTP接口

Oracle调用http接口 前情提要1.创建HTTP请求函数2.创建ACL并授予权限3.测试HTTP请求函数一点建议 前情提要 公司唯有oracle被允许访问内外网,因此在oracle中发起HTTP请求。 1.创建HTTP请求函数 CREATE OR REPLACE FUNCTION HTTP_REQUEST(v_url VARCHAR2,--請求地…

数据资产安全保卫战:构建多层次、全方位的数据安全防护体系,守护企业核心数据资产安全

一、引言 在信息化时代,数据资产已成为企业运营的核心,其安全性直接关系到企业的生存与发展。然而,随着网络技术的飞速发展,数据泄露、黑客攻击等安全威胁日益增多,给企业的数据资产安全带来了严峻挑战。因此&#xf…

CSS动画实现让元素一直旋转

在CSS中,使用keyframes动画和transform: rotate()属性来创建一个无限循环的旋转动画。以下是一个简单的示例,展示了如何使一个元素(比如一个div)无限地旋转: keyframes spin { from { transform: rotate(0deg); } …

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路 摘录 《把你写进诗歌里(2020年度中国优秀诗歌)》,作者上官文露。并不惊艳,中英文双语对照的一本诗集&…

深入理解和应用Eureka:服务注册与发现的利器

目录 一 Eureka简介 什么是Eureka? 为什么选择Eureka? 二 Eureka的基本概念 Eureka Server Eureka Client 服务注册与发现 三 Eureka的工作原理 注册服务 心跳机制 服务发现 缓存机制 四 Eureka的配置与部署 配置Eureka Server 配置Eureka Client 五 Eureka的…

Python | Leetcode Python题解之第168题Excel表列名称

题目: 题解: class Solution:def convertToTitle(self, columnNumber: int) -> str:ans list()while columnNumber > 0:columnNumber - 1ans.append(chr(columnNumber % 26 ord("A")))columnNumber // 26return "".join(an…

RC4混淆变形

RC4混淆变形 一、RC4混淆变形1. 修改初始密钥调度算法 (KSA)2. 修改伪随机生成算法 (PRGA)3. 引入非线性变换4. 使用多个状态数组5. 增加密钥混淆步骤6.示例代码 二、RC4算法详解2.1. 密钥调度算法 (KSA)2.2. 伪随机生成算法 (PRGA)2.3. 加密/解密2.4 RC4 C实现2.5 代码解析 RC…

新手装修 避坑课2.0:装修之前一定要做好功课(55节课)

课程下载:https://download.csdn.net/download/m0_66047725/89388333 更多资源下载:关注我。 课程目录 第01节1.装修前准备工作.mp4 第02节开篇.mp4 第03节2.装修需要提前定好的设备和材料.mp4 第04节3.自装还是找装修公司.mp4 第05节4.自装怎么找…

Elementui的el-dropdown组件使用与案例

一、使用 trigger 属性用于设置下拉菜单的触发方式,可以是 click(点击触发)或 hover(悬停触发)。command 属性用于在 el-dropdown-item 上设置命令值。当用户点击某个菜单项时,会触发 command 事件&#x…

HTTP的持久连接(Persistent Connection)

目录 HTTP的持久连接(Persistent Connection)持久连接的工作原理HTTP/1.0 与 HTTP/1.1 的区别示例持久连接的优点持久连接的缺点超时机制 HTTP的持久连接(Persistent Connection) HTTP 的持久连接(Persistent Connect…

win11照片裁剪视频无法保存问题解决

win11照片默认走核显,intel的显卡可能无法解码,在设置里把照片的显示卡默认换成显卡就好了

红队内网攻防渗透:内网渗透之Linux内网权限提升技术:LXDDockerRbash限制型bash

红队内网攻防渗透 1. 内网权限提升技术1.1 Linux系统提权-普通用户-LXD容器1.2 Linux系统提权-普通用户-Docker容器1.3 权限在docker里面1.4 Linux系统提权-普通用户-Rbash限制型bash1. 内网权限提升技术 利用参考 https://gtfobins.github.io/LXD、LXC 和 Docker 是三种不同…

企业UDP文件传输工具测速的方式(下)

在前一篇文章中,我们深入讨论了UDP传输的基本概念和镭速UDP文件传输工具如何使用命令行快速进行速度测试。现在,让我们进一步探索更为高级和灵活的方法,即通过整合镭速UDP的动态或静态库来实现网络速度的测量,以及如何利用这一过程…

每日一练 - OSPF邻接与邻居关系

01 真题题目 下面关于 OSPF 邻居关系和邻接关系描述,正确的是: A.OSPF 路由器在交换信息之曲必须建立邻接关系 B.并非所有的邻居关系都可以成为邻接关系 C.接芙系由 OSPF 的 HELLO 协议维护 D.邻居关系是从邻接关系选出的为了交换路由信息而形成的关系 02 真题…

动态分区存储管理实验要点和难点以及常见报错解决

动态分区存储管理实验的主要目的是熟悉并掌握动态分区分配的各种算法,以及动态分区中分区回收的各种情况,并能够实现分区合并。以下是实验的一些主要内容和步骤: 实验准备:了解动态分区存储管理的基本原理和策略,包括动态分区的特点、虚拟内存管理的目标、页式虚拟存储管理…

差分数组汇总

本文涉及知识点 算法与数据结构汇总 差分数组 令 a[i] ∑ j : 0 i v D i f f [ i ] \sum_{j:0}^{i}vDiff[i] ∑j:0i​vDiff[i] 如果 vDiff[i1]&#xff0c;则a[i1…]全部 如果vDiff[i2]–,则a[i2…]全部–。 令11 < i2 &#xff0c;则&#xff1a; { a [ i ] 不变&…

1980python个性化电影推荐管理系统mysql数据库Django结构layUI布局elasticsearch存储计算机软件工程网页

一、源码特点 python Django个性化电影推荐管理系统是一套完善的web设计系统mysql数据库 利用elasticsearch存储浏览数据 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 开发环境pycharm…

27 map和set封装

map和set可以采用两套红黑树实现&#xff0c;也可以用同一个红黑树&#xff0c;就需要对前面的结构进行修改 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器&#xff0c;需要考虑以前问题&#xff1a; begin()和end() s…

【PB案例学习笔记】-23创建一个窗口菜单

写在前面 这是PB案例学习笔记系列文章的第23篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…