今儿来了个需求, 用docker去部署nginx的静态服务器。

仔细观察这个命题,看似不难,直接docker run啥的一堆命令就好了,目录主要包括数据目录,配置目录以及日志目录。

#!/bin/bash
# 说明:该脚本用于启动staticnginx服务器,模拟线上static.machtalk.net

docker run --detach \
    --name staticserver \
    --publish 80:80 \
    -v /data/staticserver/data:/usr/share/nginx/html:rw \
    -v /data/staticserver/config/nginx.conf:/etc/nginx/nginx.conf:rw \
    -v /data/staticserver/config/servers:/etc/nginx/servers:rw \
    -v /data/staticserver/logs/error.log:/var/log/nginx/error.log:rw \
    -d nginx

如上配置之后,nginx可以跑起来,可是会遇到一个问题,就是日志看不到了。以下开始学习如何显示log。

  • docker nginx里面的配置

如何进docker

# 如下命令打出一个nginx的docker
docker run --name tt -d -t -i nginx

# 直接在docker里面运行bash
docker exec -i -t tt /bin/bash

这里写图片描述

这里写图片描述

root@78045edd70cc:/etc/nginx# cat nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

要想看日志,调整如下:

首先是nginx.conf配置文件

pid /etc/nginx/nginx.pid;
error_log  /var/log/nginx/error.log warn;
user  nginx;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    client_body_temp_path /etc/nginx/client_body_temp;
    proxy_temp_path /etc/nginx/proxy_temp;
    fastcgi_temp_path /etc/nginx/fastcgi_temp;
    uwsgi_temp_path /etc/nginx/uwsgi_temp;
    scgi_temp_path /etc/nginx/scgi_temp;
    access_log /var/log/nginx/access.log;
    sendfile        on;
    keepalive_timeout  65;
  include servers/*.conf;
}

其次是,调整 子文件的配置

server {
    listen 80;
    server_name static.abc.net,_;
    access_log /var/log/nginx/static.a.log;
    error_log /var/log/nginx/static.e.log;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
    location ~* \.(eot|ttf|woff|woff2|svg|otf)$ {
     add_header Access-Control-Allow-Origin *;
    }
}

另外,别忘了创建好/var/log/nginx/下面的access.log和error.log,要不,会报错的哦。

touch /var/log/nginx/access.log
touch /var/log/nginx/error.log

看看我们的启动文件

#!/bin/bash
# 说明:该脚本用于启动staticnginx服务器,模拟线上static.machtalk.net

docker stop staticserver && echo "停止服务成功!" || echo "停止服务失败!"
docker rm staticserver && echo "销毁服务成功!" || echo "销毁服务失败!"

docker run --detach \
    --name staticserver \
    --publish 80:80 \
    -v /data/staticserver/data:/usr/share/nginx/html:rw \
    -v /data/staticserver/config/nginx.conf:/etc/nginx/nginx.conf:rw \
    -v /data/staticserver/config/servers:/etc/nginx/servers:rw \
    -v /data/staticserver/logs:/var/log/nginx:rw \
    -d nginx

这次的配置文件新增了开始的几行,省的每次docker ps docker stop docker rm的麻烦。

目录对应关系列一下如下

本地路径docker路径备注
/data/staticserver/data/usr/share/nginx/html数据文件将夹
/data/staticserver/config/nginx.conf/etc/nginx/nginx.conf主配置文件
/data/staticserver/config/servers/etc/nginx/servers子目录文件夹
/data/staticserver/logs/var/log/nginx日志文件夹

说到这,可能还有两个问题,如果日志老实写,是不是我们应该部署logrotaged呀。呵呵,这点 nginx docker早就想到啦,里面有log轮转配置的。

root@e5d5154e7161:/etc/logrotate.d# cat nginx 
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

哦,好吧,另外,为啥使用docker logs -f –tail=40 staticserver的时候会看到刷刷的日志来。
那是因为做了 /var/log/nginx/access.log > /dev/stdout以及/var/log/nginx/error.log > /dev/stderr的链接

这里写图片描述

哦哦,好吧。

那么还有一件事儿, 就是https的问题咋弄来。这个还不难,目录映射白,不过这个这次用不到,就不BB了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐