为了方便测试,本地维护了多个 web 站点,这些站点不会同时使用,所以都使用了默认 80 端口,每次直接 localhost 访问。
每次为了切换网站目录,修改 nginx 配置,切换次数多了逐渐感觉不太方便。
最近接触到 Docker,可以通过镜像创建多个相互隔离的容器。
于是考虑:是不是可以使用多个 nginx 的容器,分配加载不同站点,每次只需要运行相应容器就可以了
主要步骤
- 创建一个 default 站点,用做模板
- 增加新站点时,本地复制 default 目录并修改名称
- 创建新的 nginx 容器,并指向新站点相关目录
创建站点模板
docker 下载 nginx 镜像
下载完成后,可以通过 docker images
查看本地已下载的全部镜像
1 2 3
| $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 8f05d7383593 3 weeks ago 134MB
|
创建 nginx 模板容器
1 2
| # 使用 nginx 镜像创建 nginx-default 容器 $ docker run --name nginx-default -p 80:80 -d nginx:latest
|
创建站点所需目录
1 2 3 4 5 6 7 8 9 10 11
| $ mkdir ~/Sites/default && cd ~/Sites/default
$ mkdir html/
$ mkdir log/
$ mkdir nginx
|
拷贝模板容器中 nginx 配置文件
1 2 3 4
| $ docker cp nginx-default:/etc/nginx/nginx.conf nginx/
$ docker cp nginx-default:/etc/nginx/conf.d nginx/conf.d
|
删除 nginx 模板容器
模板容器的目的是为了导出 nginx 配置文件,完成上述导出操作后,可以删除 nginx-default 容器
1 2
| $ docker stop nginx-default $ docker rm nginx-default
|
创建新站点目录
1 2 3
| # 创建新的站点目录 nav $ cd ~/Sites/ $ cp -r default ./nav
|
将网站文件复制到 ~/Sites/nav/html/
目录
为新站点建立容器
停止其他 nginx 容器
因为所有的站点都映射到本地 80 端口,所以新建 nginx 容器前,需要先停止其他运行中的 nginx 容器,要不然创建新容器时会报错。
1
| $ docker stop $(docker ps -f ancestor=nginx | awk '{ print $1}' | tail -n +2)
|
新建 nginx 容器并映射到新站点
1 2 3 4 5 6 7
| $ docker run --name nginx-nav -p 80:80 \ -v ~/Sites/nav/html:/usr/share/nginx/html \ -v ~/Sites/nav/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v ~/Sites/nav/nginx/conf.d:/etc/nginx/conf.d \ -v ~/Sites/nav/log:/var/log/nginx \ -e TZ=Asia/Shanghai \ -d nginx:latest
|
docker 中切换站点
所有站点配置完毕后,每次切换站点时,需要注意先停止其他 nginx 容器,再启动新的容器。
1 2
| $ docker stop $(docker ps -f ancestor=nginx | awk '{ print $1}' | tail -n +2) $ docker start nginx-blog
|
可以通过 alias 的方式,将上述命令做成快捷方式
1
| alias nginx-start="alive=$(docker ps -f ancestor=nginx | awk '{ print $1}' | tail -n +2) ; [ -n "$alive" ] && docker stop $alive ; docker start "
|
每次通过 nginx-start [站点容器名]
即可启动站点
附注
nginx 相关目录定位
上述操作中,我们直接创建了 html、log、nginx 配置目录,这些目录信息,我们都可以在默认的 nginx.conf 文件中查阅到相关配置。
1 2
| $ docker exec -it nginx-default /bin/bash $ cat /etc/nginx/nginx.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| # /etc/nginx/nginx.conf 内容 user nginx; worker_processes auto;
error_log /var/log/nginx/error.log notice; 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 中又加载了 /etc/nginx/conf.d/*.conf
, 通过 nginx.conf 和 default.conf ,我们了解到以下信息:
- 网站 error.log 和 access.log 存放在
/var/log/nginx
目录
- 网站根目录为
/usr/share/nginx/html
- 修改
/etc/nginx/conf.d/*.conf
文件,即可起到配置 nginx 的目的