nginx容器配置方案

nginx容器配置

可以参考docker官网nginx页面的默认配置
docker-nginx官网how to use image

这里面提供了一些demo,可以帮助我们快速的启动nginx容器,并且除了常规的挂载、端口等基本配置外,还提供了以只读方式启动、以debug模式启动、设置日志等级环境变量等演示。

下文仅是博主根据在云服务搭建nginx时,为了转发和管理nginx软件方便,而做的改造和尝试。

docker-compose.yml

version: '3'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "433:433"
    volumes:
      - ./nginx-conf/conf.d/:/etc/nginx/conf.d/
      - ./nginx-logs:/var/log/nginx
      - ./nginx-command/:/scripts/
    environment:
      TZ: Asia/Shanghai

根据这些挂载,不难看出我需要在部署包中放置以下文件

nginx/
|-- docker-compose.yml
|-- nginx-conf/
|   |-- conf.d/
|   |   |--default.conf
|-- nginx-logs/
|-- nginx-command/

简易的运维脚本

使用swarm启动脚本,首先需要将本机器变为stack节点。

docker swarm init

然后就可以用deploy启动了

stack_name='nginx'
docker stack deploy -c docker-compose.yml $stack_name

如果想在容器内,直接reload nginx,那么可以试试下面的脚本
先将test_and_reload_nginx.sh脚本挂在nginx-command下,让其挂载在容器中。

#!/bin/bash

# 检查 nginx 配置是否正确
nginx_test_output=$(nginx -t 2>&1)

# 检查 nginx -t 命令的退出状态
if [ $? -eq 0 ]; then
    echo "Nginx configuration test successful."
    # 如果测试成功,执行 nginx -s reload
    nginx -s reload
    echo "Nginx reload!"
else
    echo "Nginx configuration test failed."
    # 如果测试失败,输出错误信息
    echo "$nginx_test_output"
fi

然后在容器外使用下面的指令:

docker exec -it $(docker ps -qf name=nginx_nginx) bash /scripts/test_and_reload_nginx.sh

配置文件挂载及规则

在上述的挂载中,关于nginx的配置,我只挂载了conf.d进去,而目前默认只有一个default.conf的配置文件,而实际上,nginx真正用到nginx文件是有一定加载顺序的。

首先,目录中会有一个主配置文件nginx.conf,实际上nginx默认的容器中默认就是有的,不需要挂载,它主要做了这么几件事:

  • user nginx;:指定 Nginx 进程的运行用户。
  • worker_processes auto;:根据可用的 CPU 核心数量自动设置 worker 进程数量。
  • error_logaccess_log:配置错误日志和访问日志的路径。
  • events 块:配置与事件处理相关的参数,如 worker_connections
  • http 块:定义 HTTP 配置,包括 MIME 类型、默认类型、日志格式等。
  • include 指令:引入其他配置文件,如 /etc/nginx/mime.types/etc/nginx/conf.d/*.conf/etc/nginx/sites-enabled/*

其中引入其他配置文件就是我们定制化转发的关键,这是一种灵活的配置方式。nginx给我们提供了两种默认的配置方式,都是基于nginx.conf中的include指令。

  1. conf.d 目录: conf.d 目录是一个约定的目录,用于存放额外的配置文件。在主配置文件中,会有一行指令来加载 conf.d 目录下的配置文件:
    include /etc/nginx/conf.d/*.conf;
    这意味着 conf.d 目录下的所有以 .conf 结尾的文件都会被加载。

  2. sites-available 目录和sites-enabled 目录:** sites-available 目录包含了所有站点的配置文件,但这些配置文件并不直接生效。它只是一种组织和管理配置文件的方式。sites-enabled 目录包含了实际要生效的站点配置文件的符号链接。这些符号链接指向 sites-available 目录下的配置文件。通常,在主配置文件中,会有一行指令来加载 sites-enabled 目录下的配置文件:
    include /etc/nginx/sites-enabled/*;
    这样,sites-enabled 目录下的符号链接都会被加载,实际生效的站点配置因此被包含在 Nginx 配置中。

我则只采取了conf.d的配置方式,原因是,如果我想关闭一个所谓的站点,其实只需要在conf.d对应的配置文件后面加一个.disable的后缀即可实现。

总结下来就是nginx.conf文件中加载了conf.d文件中的所有以.conf为结尾的文件配置使其生效。如果想要关闭某个站点,仅需让此站点的配置文件的后缀变化即可。

posted @ 2024-02-11 23:48  leethon  阅读(39)  评论(0编辑  收藏  举报