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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
http {
...
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
log_format main escape=json '{ "@timestamp": "$time_local", '
'"http_user_agent": "$http_user_agent",'
'"http_x_forwarded_for": "$http_x_forwarded_for",'
'"remote_addr": "$remote_addr",'
'"remote_port": "$remote_port",'
'"host": "$host",'
'"http_host": "$http_host",'
'"scheme": "$scheme",'
'"http_referer": "$http_referer",'
'"request": "$request",'
'"request_uri": "$request_uri",'
'"request_method": "$request_method",'
'"request_time": "$request_time",'
'"request_length": "$request_length",'
'"response_status": "$status",'
'"bytes_sent": "$bytes_sent",'
'"body_bytes_sent": "$body_bytes_sent",'
'"upstream_addr": "$upstream_addr",'
'"upstream_response_time": "$upstream_response_time"}';
}
字段含义示例
body_bytes_sent响应body字节数3650
bytes_sent响应总字节数175
hostIP或域名(不包括端口)10.10.10.14
http_hostIP或域名(包括端口)10.10.10.14:81
http_refererreferer信息http://10.10.10.14/
http_user_agentUA信息Mozilla/5.0
http_x_forwarded_forXFF信息192.168.1.1
remote_addr客户端地址10.10.10.1
remote_user客户端认证用户名admin
request请求URI和协议GET
request_body请求的body
request_length请求长度571
request_method请求方法GET
request_time请求处理时间0.000
response_body返回的body,依赖lua,需要编写lua脚本来采集
response_header_data响应头数据,依赖headers-more-nginx-module
schema协议http
server_name虚拟主机名称
server_port服务器端口
server_protocol服务器协议
ssl_cipher交换数据中的算法
ssl_protocolSSL协议版本
status返回状态码404
time_local时间戳16/Jun/2019:23:29:50
upstream_addr后端提供服务地址
upstream_connect_time与服务器连接所花费的时间
upstream_response_time后端处理时间
upstream_statusupstream状态200

参考文档:

修改日志格式后,需要重启nginx,然后查看日志确认格式

1
2
docker restart nginx
tail -f /opt/nginx/log/access.log

配置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 许可协议。转载请注明出处!源站会及时更新知识点及修正错误,阅读体验也更好。欢迎分享,欢迎收藏~