0%

使用Docker安装配置Nginx

前言

《CentOS7设置nginx开机自启动》一文中学习了在CentOS7中安装配置Nginx的方法,本文学习一下使用Docker安装配置Nginx的方法。

前置条件是安装配置好了docker环境,安装方法参考《Docker入门》。已知docker宿主机IP为8.136.13.58。

安装Nginx

1、登录dockerhub查看需要的Nginx - Docker Official Images

2、下载nginx镜像(以1.17.7为例)

1
docker pull nginx:1.17.7

3、创建nginx挂载目录

1
mkdir -p /opt/nginx/{conf,html,ssl,work,log}

4、拷贝nginx镜像中的配置到宿主机

1
2
3
4
5
6
docker run --name tmp-nginx -d nginx:1.17.7
docker cp tmp-nginx:/etc/nginx/nginx.conf /opt/nginx/conf/
docker cp tmp-nginx:/etc/nginx/conf.d/ /opt/nginx/conf/
docker cp tmp-nginx:/usr/share/nginx/html/. /opt/nginx/html/
docker stop tmp-nginx
docker rm tmp-nginx

5、启动nginx服务

1
2
3
4
5
6
7
8
9
10
docker run --name vk-nginx -d --privileged=true \
-p 80:80 -p 443:443 \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/ssl:/etc/nginx/ssl \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/work:/usr/share/nginx/work \
-v /opt/nginx/log:/var/log/nginx \
-v /etc/localtime:/etc/localtime \
nginx:1.17.7

以上命令:

  • 命名容器为vk-nginx,后台运行
  • 映射宿主机80、443端口到容器的80、443端口
  • 挂载宿主机文件 /opt/nginx/conf/nginx.conf 到容器文件 /etc/nginx/nginx.conf
  • 挂载宿主机目录 /opt/nginx/conf/conf.d 到容器目录 /etc/nginx/conf.d
  • 挂载宿主机目录 /opt/nginx/ssl 到容器目录 /etc/nginx/ssl
  • 挂载宿主机目录 /opt/nginx/html 到容器目录 /usr/share/nginx/html
  • 挂载宿主机目录 /opt/nginx/work 到容器目录 /usr/share/nginx/work
  • 挂载宿主机目录 /opt/nginx/log 到容器目录 /var/nginx/log
  • 挂载宿主机目录 /etc/localtime 到容器目录 /etc/localtime

更多启动命令参数可以参考How to use this image

6、验证安装
(1)docker ps,nginx启动正常的话就可以看到vk-nginx容器。
(2)curl localhost,可以看到html文本。
(3)浏览器访问 http://8.136.13.58 ,可以看到Welcome to nginx!

常用命令

测试配置

1
docker exec -it vk-nginx nginx -t

重新加载配置

1
docker exec -it vk-nginx nginx -s reload

重启nginx

1
docker restart vk-nginx

配置Web服务

以配置 www.voidking.com 域名的Web服务为例,参考《Hexo启用https加密连接》《Hexo加速访问》

1、下载博客项目

1
2
mkdir /opt/nginx/work
git clone https://gitee.com/voidking/voidking.github.io.git voidking

2、上传证书
上传 1_www.voidking.com_bundle.crt 和 2_www.voidking.com.key 到/opt/nginx/conf.d/ssl目录

3、创建配置文件

1
2
cd /opt/nginx/conf/conf.d
vim www.voidking.com.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
33
34
35
server {
listen 80;
listen 443 ssl;
server_name www.voidking.com;
charset utf-8;

ssl_certificate /etc/nginx/ssl/1_www.voidking.com_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/2_www.voidking.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
ssl_prefer_server_ciphers on;

if ($ssl_protocol = "") {
return 301 https://$host$request_uri;
}

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

root /usr/share/nginx/work/voidking/;
index index.html;
}

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/work/voidking/;
index 404.html;
}
location ~ /\.git {
return 404;
}
}

4、重启nginx

1
docker restart vk-nginx

5、查看是否启动成功

1
2
3
docker ps
docker logs vk-nginx
docker logs --tail 10 vk-nginx

至此, www.voidking.com 域名配置完成,在dnspod添加好解析即可访问,nice。

配置七牛图床反向代理

七牛图床,http访问不收费,https收费。
为了给图床省钱,使用nginx配置了一层代理,添加了域名 cdn.voidking.com.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
server {
listen 80;
listen 443 ssl;
server_name cdn.voidking.com;
charset utf-8;

#ssl配置
ssl_certificate /etc/nginx/ssl/1_cdn.voidking.com_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/2_cdn.voidking.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;

if ($ssl_protocol = "") {
return 301 https://$host$request_uri;
}

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://qiniu.cdn.voidking.com;
}
}

重定向问题排查

有一天,通过chrome浏览器访问 http://8.136.13.58 ,发现报错 403

仔细看了下地址栏,原来是 http 自动转到了 https。本地curl验证一下是否是chrome的问题:

1
2
curl http://8.136.13.58
curl http://8.136.13.58 -L


由上图可以看出,确实是nginx对请求进行了重定向。

那么,为什么通过ip访问会进行重定向?在 default.conf 的配置中,没有进行修改,没有配置任何重定向!
这样看来,问题只能出在 www.voidking.com.conf 和 cdn.voidking.com.conf 这两个文件。

删除 www.voidking.com.conf ,重启nginx,问题依然存在。
删除 cdn.voidking.com.conf ,重启nginx,问题解决!
那么,问题就肯定出在 cdn.voidking.com.conf 这个文件上。从配置上看,没有任何问题,但是为什么会导致IP访问nginx被重定向呢?
找了很多资料,没有找到答案。后来灵光一现:cdn.voidking.com.conf 比 default.conf 优先级更高!
因为c开头的配置文件要比d开头的配置文件先加载,而 default.conf 并没有特殊的优先级配置。所以,最终结果就是 cdn.voidking.com.conf 才是真正意义上的 default !

解决方案:重命名 default.conf 为 0.default.conf 。

  • 本文作者: 好好学习的郝
  • 本文链接: https://www.voidking.com/dev-docker-nginx/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!源站会及时更新知识点及修正错误,阅读体验也更好。欢迎分享,欢迎收藏~