前文提到利用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!