将 docker nginx 访问日志存储在 docker 卷中

was*_*ner 8 nginx docker docker-compose

目前我的 docker 容器正在将 nginx 访问日志打印到 /dev/stdout。如何在我的 docker 容器内创建一个卷来存储访问日志?

我的 Dockerfile:

FROM python:3.7

ENV APP_ROOT /src
ENV CONFIG_ROOT /config

RUN apt-get update
RUN apt-get install -y apt-utils
RUN apt-get -y install unixodbc-dev
RUN apt-get -y install default-libmysqlclient-dev

RUN mkdir ${CONFIG_ROOT}
COPY /app/requirements.txt ${CONFIG_ROOT}/requirements.txt
RUN pip install -r ${CONFIG_ROOT}/requirements.txt

RUN mkdir ${APP_ROOT}
WORKDIR ${APP_ROOT}

ADD /app/ ${APP_ROOT}
Run Code Online (Sandbox Code Playgroud)

我的 docker-compose.yml:

version: "3"

services:
  app:
    build: .
    container_name: django-gunicorn
    restart: always
    env_file:
      - django.env
    ports:
      - "8000:8000"
    command:
      "gunicorn --workers=2 --bind=0.0.0.0:8000 mysite.wsgi:application"

  nginx:
    image: nginx:1.14
    container_name: ngx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./app/static:/static
    depends_on:
      - app
Run Code Online (Sandbox Code Playgroud)

我的 nginx/default.conf:

limit_req_zone "$binary_remote_addr$request_uri" zone=one:10m rate=60r/m;

server {
    listen 80;
    server_name example.org;
    server_tokens off;

    location  /static/ {
        autoindex on;
        alias /static/;
    }

    location / {
        proxy_pass http://app:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        limit_req zone=one nodelay burst=30;

    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试向此应用程序添加 fail2ban 和 fluentd 日志记录,但首先我需要存储可用于其他日志记录目的的物理文件(不是 /dev/stout)。

谢谢!

小智 5

默认情况下,Nginx 容器将访问日志转发到 STDOUT,将错误日志转发到 STDERR。您可以在 nginx Dockerfile 中看到这些行:

# forward request and error logs to docker log collector
    && ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log \
Run Code Online (Sandbox Code Playgroud)

所以可以在容器日志中看到nginx日志:

docker logs -f ngx
Run Code Online (Sandbox Code Playgroud)

但是如果你想将 nginx 日志存储在一个 docker 卷中,首先创建你自定义的 nginx docker 镜像:

FROM nginx
RUN rm /var/logs/nginx/*
Run Code Online (Sandbox Code Playgroud)

然后你在 docker-compose.yml 中的 nginx 服务会是这样的:

nginx:
    build: ./nginx/
    container_name: ngx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./app/static:/static
      - ./log/nginx:/var/log/nginx
    depends_on:
      - app
Run Code Online (Sandbox Code Playgroud)


小智 4

除了上面添加卷的注释之外,您还必须调整主 Nginx 配置(最有可能/etc/nginx/nginx.conf)和/或每个虚拟主机的配置文件。

在大多数情况下,将这些添加到您的主要配置中:

http {
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}
Run Code Online (Sandbox Code Playgroud)

类似的条目可能位于内部serverlocation