前文提到利用docker安装nginx的方法,它非常的快速,安全,易维护
但是新手有时候不能很好理解挂载目录的逻辑,导致写出来的nginx配置经常出现问题
本文将详细的介绍如何撰写docker下nginx的配置
本文以www.example.com为例
上文提到挂载目录

# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/docker/nginx/conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/docker/nginx/html
# 将容器中的证书文件夹复制到宿主机
docker cp nginx:/etc/ssl /home/docker/nginx/ssl
# 将容器中的日志文件夹复制到宿主机
docker cp nginx:/var/log/nginx /home/docker/nginx/logs
/etc/nginx/nginx.conf ——> /home/docker/nginx/conf
/etc/nginx/conf.d ——> /home/docker/nginx/conf/conf.d
/usr/share/nginx/html ——> /home/docker/nginx/html
/etc/ssl ——> /home/docker/nginx/ssl
/var/log/nginx ——> /home/docker/nginx/logs
这是什么意思呢
就是,虚拟机内的/etc/nginx/nginx.conf就是主机里的/home/docker/nginx/conf
例如,www.example.com的配置文件地址是
/home/docker/nginx/conf/conf.d/www.example.com.conf

由于挂载的存在,nginx仍然认为这个文件的实际地址是/etc/nginx/conf.d/www.example.com.conf
html文件的目录是/home/docker/nginx/html/www.example.com

同理,nginx认为这个文件的实际地址是
/usr/share/nginx/html/www.example.com
所以,www.example.com的nginx配置应该这么写
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
root /usr/share/nginx/html/www.example.com/;
# SSL
ssl_certificate /etc/ssl/www.example.com/fullchain.cer;
ssl_certificate_key /etc/ssl/www.example.com/www.example.com.key;
# security
#include nginxconfig.io/security.conf;
# logging
access_log /var/log/nginx/home/access.log combined buffer=512k flush=1m;
error_log /var/log/nginx/home/error.log warn;
# index.html fallback
# include /etc/nginx/conf.d/XXX.conf; #其它想引用的配置
# additional config
#include nginxconfig.io/general.conf;
}
# HTTP redirect
server {
listen 80;
listen [::]:80;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
# include /etc/nginx/conf.d/XXX.conf; #其它想引用的配置
}
根据你的需要修改上面的配置 (请把ssl的部分注释掉,如果你还未申请好ssl,或者没搞懂ssl配置)
如果你照搬我的配置,但是启动不成功,即访问ip不显示,那么有可能是nginx配置出错然后自动退出,
docker容器并不会把nginx的status打印出来,如果你觉得自己配置的正确,但是访问不了,你可以用下面的命令自己检查配置
#进入容器内部,重载nginx
docker exec -it nginx nginx -s reload
#查看nginx日志
docker logs nginx
#直接进入虚拟机内部
docker exec -it nginx bash
#退出
exit
如果你不需要我的ssl配置,或者还没有申请证书,请把ssl的部分注释掉,如果你想知道怎么申请证书,我会抽空写一篇文章
在这里再推荐一个digitalocean提供的在线生成nginx配置的工具
NGINXConfig | DigitalOcean
你可以不用管这个全局配置,站点配置完我们直接拉到最下面
我们一般只需要右侧的那个站点配置,如果你需要使用它生成的nginx全局配置,你可以自行摸索剩下的板块
值得注意的是,这里生成的配置有一点问题,listen…http2的写法已经在新版本docker nginx中被弃用了
把涉及到的
listen 443 ssl http2;
listen [::]:443 ssl http2;
全部改为
listen 443 ssl;
listen [::]:443 ssl;
即可
题外话
我在Windows上也部署了docker,有一些小问题
1.windows环境下,安装docker和docker desktop需要开启虚拟化,hyper-v,WSL
不然它看似安装好了,其实启动的时候一直卡在初始化,不要怀疑,就是上面这些没开
2.windows环境下,edge浏览器访问不了localhost,它会将http://localhost自动转成https://localhost,然后告诉你拒绝连接
不要怀疑自己,这个是edge的问题,实测chrome浏览器可以
enjoy!