1. 为什么选择容器化部署NGINX Plus在传统部署方式中我们通常需要在物理机或虚拟机上直接安装NGINX Plus。这种方式虽然直接但也存在一些痛点环境配置复杂、依赖冲突难以解决、迁移和扩展困难。而容器化技术如Docker正好能解决这些问题。我最早接触容器化部署是在2016年当时团队需要频繁在不同环境中部署NGINX Plus。传统方式下每次部署都要重复安装依赖、配置环境耗时又容易出错。改用容器化后部署时间从原来的半小时缩短到几分钟而且完全避免了在我机器上能跑的经典问题。容器化部署主要有三大优势环境一致性镜像包含了所有运行时依赖确保开发、测试、生产环境完全一致快速部署镜像拉取后秒级启动特别适合自动扩缩容场景资源隔离每个容器有独立的网络、文件系统避免端口冲突等问题2. 准备NGINX Plus容器镜像2.1 获取官方基础镜像NGINX官方提供了多个版本的Docker镜像我们可以从官方仓库直接拉取# 拉取NGINX开源版基础镜像用于参考 docker pull nginx:latest # 拉取NGINX Plus基础镜像需要认证 docker pull registry.gitlab.com/nginx/nginx-plus:latest注意NGINX Plus是商业产品需要有效的订阅证书才能使用。如果你还没有证书可以申请30天试用版。2.2 准备证书和密钥从F5客户门户下载你的NGINX Plus证书和密钥nginx-repo.crt和nginx-repo.key建议存放在项目目录的ssl子目录中mkdir -p ~/nginx-plus-docker/ssl cd ~/nginx-plus-docker/ssl # 将下载的证书和密钥复制到此目录2.3 编写Dockerfile下面是一个完整的Dockerfile示例我通常会根据项目需求进行调整FROM registry.gitlab.com/nginx/nginx-plus:latest # 设置工作目录 WORKDIR /etc/nginx # 复制证书和密钥 COPY ssl/nginx-repo.crt /etc/ssl/nginx/ COPY ssl/nginx-repo.key /etc/ssl/nginx/ # 复制自定义配置 COPY conf/nginx.conf /etc/nginx/ COPY conf/conf.d/ /etc/nginx/conf.d/ # 复制静态文件 COPY html/ /usr/share/nginx/html/ # 暴露端口 EXPOSE 80 443 # 启动命令 CMD [nginx, -g, daemon off;]这个Dockerfile做了以下几件事基于官方NGINX Plus镜像构建添加订阅证书复制自定义配置和静态文件设置启动命令3. 构建和运行容器3.1 构建自定义镜像在Dockerfile所在目录执行构建命令docker build -t my-nginx-plus .构建完成后可以用以下命令查看镜像docker images | grep my-nginx-plus3.2 运行容器实例运行容器有多种方式以下是最基本的运行命令docker run -d \ --name my-nginx \ -p 80:80 \ -p 443:443 \ my-nginx-plus对于生产环境我通常会添加更多参数docker run -d \ --name nginx-prod \ --restart unless-stopped \ -p 80:80 \ -p 443:443 \ -v /path/to/certs:/etc/ssl/nginx \ -v /path/to/logs:/var/log/nginx \ my-nginx-plus3.3 验证容器运行状态检查容器是否正常运行docker ps -f namemy-nginx查看容器日志docker logs my-nginx进入容器内部检查docker exec -it my-nginx bash nginx -t # 测试配置4. 高级配置技巧4.1 动态模块加载NGINX Plus支持动态模块在容器中加载模块需要额外步骤。这是我常用的Dockerfile片段# 安装动态模块 RUN apt-get update \ apt-get install -y nginx-plus-module-module-name \ rm -rf /var/lib/apt/lists/* # 在nginx.conf中加载模块 RUN echo load_module modules/ngx_module_name_module.so; /etc/nginx/modules.conf4.2 性能调优容器中的NGINX性能调优有几个关键点worker进程数通常设置为CPU核心数worker_processes auto;连接数限制根据容器资源限制调整events { worker_connections 1024; multi_accept on; }日志优化避免日志IO成为瓶颈access_log /var/log/nginx/access.log buffer32k flush5s;4.3 健康检查在容器环境中健康检查尤为重要。NGINX Plus提供了高级健康检查功能upstream backend { zone backend 64k; server backend1.example.com:80 slow_start30s; server backend2.example.com:80 slow_start30s; # 主动健康检查 health_check interval5s uri/health_check; }对应的Docker健康检查配置docker run -d \ --health-cmd curl -f http://localhost/health_check || exit 1 \ --health-interval 5s \ --health-timeout 2s \ --health-retries 3 \ my-nginx-plus5. 实际部署案例5.1 单容器部署对于小型应用单容器部署是最简单的方案。我常用的docker-compose.yml示例version: 3 services: nginx: image: my-nginx-plus ports: - 80:80 - 443:443 volumes: - ./ssl:/etc/ssl/nginx - ./logs:/var/log/nginx restart: unless-stopped5.2 集群部署在生产环境中我通常会结合Kubernetes或Docker Swarm进行集群部署。以下是一个Kubernetes部署示例apiVersion: apps/v1 kind: Deployment metadata: name: nginx-plus spec: replicas: 3 selector: matchLabels: app: nginx-plus template: metadata: labels: app: nginx-plus spec: containers: - name: nginx image: my-nginx-plus ports: - containerPort: 80 - containerPort: 443 volumeMounts: - name: certs mountPath: /etc/ssl/nginx volumes: - name: certs secret: secretName: nginx-certs5.3 AWS ECS部署在AWS环境中我推荐使用ECS进行部署。关键配置点包括创建ECR仓库存储自定义镜像配置任务定义时挂载证书Secret设置适当的CPU和内存限制配置ALB进行负载均衡6. 常见问题排查在多年的容器化部署实践中我总结了一些常见问题及解决方法证书问题SSL_CTX_use_PrivateKey_file(/etc/ssl/nginx/nginx-repo.key) failed (SSL: error:0909006C:PEM routines:get_name:no start line)解决方法确保证书和密钥是PEM格式且文件权限正确600性能问题 如果发现容器性能不佳可以检查容器资源限制是否合理NGINX worker配置是否优化是否启用了gzip压缩等性能优化功能网络问题 容器间通信问题通常是由于网络配置不当导致。建议使用自定义网络而非默认桥接网络检查防火墙规则确保端口映射正确7. 监控与日志7.1 实时监控NGINX Plus提供了丰富的实时监控指标可以通过API获取curl http://localhost:8080/api/3/nginx我通常会将Prometheus与Grafana结合使用配置示例server { listen 8080; location /metrics { allow 127.0.0.1; deny all; stub_status on; } location /api { api writeon; } }7.2 日志管理容器中的日志管理有几个最佳实践将日志输出到stdout/stderr方便Docker收集使用json格式日志便于解析配置日志轮转防止日志文件过大access_log /dev/stdout json; error_log /dev/stderr warn;8. 安全加固容器化环境的安全防护需要特别关注8.1 最小权限原则docker run --user 1000:1000 my-nginx-plus8.2 只读文件系统docker run --read-only -v /tmp/nginx:/tmp my-nginx-plus8.3 安全配置在nginx.conf中添加安全相关的HTTP头add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection 1; modeblock;9. 持续集成与交付成熟的CI/CD流程可以极大提升部署效率。我常用的流程包括代码提交触发镜像构建自动运行测试安全扫描部署到测试环境人工验证后发布示例GitLab CI配置stages: - build - test - deploy build_image: stage: build script: - docker build -t my-nginx-plus . - docker push my-registry/my-nginx-plus:$CI_COMMIT_SHA deploy_staging: stage: deploy script: - kubectl set image deployment/nginx-plus nginxmy-registry/my-nginx-plus:$CI_COMMIT_SHA environment: name: staging10. 迁移传统部署到容器将现有NGINX Plus迁移到容器环境我通常按以下步骤进行收集现有配置cp -R /etc/nginx ~/nginx-config分析依赖关系ldd $(which nginx)创建Dockerfile如前文所示测试新容器docker run --rm -p 8080:80 my-nginx-plus逐步迁移流量可以通过DNS或负载均衡器逐步将流量切换到新容器在迁移过程中要特别注意路径差异容器内路径可能与原系统不同环境变量配置日志和监控的连续性