今儿来了个需求, 用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
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了。