docker安装nginx,配置SSL
阅读原文时间:2023年07月08日阅读:3

nginx安装

1.docker pull nginx

2.docker images nginx 查看我们拉取到本地的nginx镜像IMAGE ID

3.首先测试下nginx镜像是否可用,使用docker run -d --name mynginx -p 80:80 imgae ID创建并启动nginx容器

将nginx容器内部配置文件挂载到主机,之后就可以在主机对应目录修改即可。适合频繁修改,复杂使用的情况

1.在主机/mnt目录下执行 mkdir -p ./nginx/{conf,html,logs}创建挂载目录

2.将容器内的nginx.conf与default.conf文件分别拷贝到主机/mnt/nginx和/mnt/nginx/conf下,分别执行

docker cp ef:/etc/nginx/nginx.conf
dokcer cp ef:/etc/nginx/conf.d/default.conf ./conf/

cp 命令代表复制

ef是我们nginx容器的ID,/etc/nginx/nginx.conf 是容器内部nginx.conf 路径

3.执行docker stop 容器ID 命令停止刚刚创建的nginx容器,b3是容器Id,然后执行docker rm 容器ID 移除容器。

4.执行下方命令重建容器

docker run -d --name mynginx -p 80:80 -p 443:443 -v /mnt/nginx/nginx.conf:/etc/nginx/nginx.conf -v /mnt/nginx/logs:/var/log/nginx -v /mnt/nginx/html:/usr/share/nginx/html -v /mnt/nginx/conf:/etc/nginx/conf.d -v /mnt/nginx/ssl:/ssl --privileged=true 容器ID

-v 挂载目录,格式 -v: 表示将主机目录与容器目录之间进行共享,

--privileged=true 容器内部对挂载的目录拥有读写等特权

5.这时我们在容器的挂载 /mnt/nginx/html目录下创建index.html,内容随便写上hello docker nginx,再次访问主机IP

到这里就大功告成了!

需要注意的:我们在挂载目录的操作,都实际会映射到容器内部,写配置文件的时候一定要注意路径问题!!(我在配置SSL的时候浪费了很长的时间不清楚最后是什么原因,在配置SSL文件路径的时候一定要写对应的docker容器内部地址,否则会找不到。)

贴一个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       mime.types;
        default_type  application/octet-stream;
    sendfile on;
    gzip on;
    client_max_body_size 10m;
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream tomcat1 {
        server 172.17.0.1:8080;
    }
    server {
        #SSL 访问端口号为 443
        listen 443 ssl;
        #填写绑定证书的域名
        server_name www.xxx.com;
        #证书文件名称
        ssl_certificate /ssl/xxx.crt;
        #私钥文件名称
        ssl_certificate_key /ssl/xxx.key;
    #ssl_session_cache   shared:SSL:5m;
        ssl_session_timeout 5m;
    #keepalive_timeout   70;
        #请按照以下协议配置
        ssl_protocols TLSv1.2 TLSv1.3;
        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

    location /html{
    #alias配置静态vue项目的时候用,之前用了root一直没法访问浪费我1天时间才找到问题所在
    #root和alias的区别(根据实际需求选择用哪个)
    #root会在目录后加上location后的路径,在本示例就是/usr/share/nginx/html/dist/html才能正确访问到
    #alias就是绝对地址,在本示例把前端放 /usr/share/nginx/html/dist 下就可以
    #注意:此处一定要写挂载目录对应的docker容器内的路径,而不是物理机的路径
    #例如:物理机/mnt/nginx/html 挂载到docker容器内的usr/share/nginx/html
    #你把vue项目放到/mnt/nginx/html下的时候,一定不能直接写这个目录,而要写对应容易的目录usr/share/nginx/html
    alias /usr/share/nginx/html/dist;
            index index.html;
    }

    location / {
        proxy_ssl_server_name on;
        #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
        #root html;
        proxy_set_header           X-Forwarded-Proto https;
        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_set_header X-Forwarded-Proto $scheme;
        proxy_pass   http://tomcat1;
        #index  index.html index.htm;
     }

   }

    server{
    listen 80;
    server_name www.xxx.com;
    location / {
        proxy_read_timeout 360s;
        proxy_pass http://tomcat1;
        proxy_set_header Host $host:$server_port;
        proxy_http_version 1.1;
        #websocket用
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
   }

}