美文网首页
Docker 部署Nginx 带SSL证书部署

Docker 部署Nginx 带SSL证书部署

作者: coderTG | 来源:发表于2023-05-07 15:41 被阅读0次

一、准备SSL证书
腾讯云申请
阿里云申请、

自行申请

还有一步DNS验证,因为我这边已经申请了证书,不好演示了。也挺简单的,按照教程来就行了,在域名解析里面加一条DNS解析记录,然后点击验证,通过了,就申请成功了,然后下载nginx版本的证书压缩包,解压上传到服务器就可以了

*稍微需要注意下,腾讯云和阿里云的证书文件后缀有点不一样,腾讯云是xx.crt和xx.key,阿里云是xx.pem和xx.key,都可以正常使用

二、下载最新nginx镜像
docker pull nginx
1
三、新建几个目录,把nginx容器内的配置文件挂载到主机上

mkdir -p /usr/local/nginx/{conf,html,logs,ssl}

这一步的目的是:1方便后期修改配置文件 2容器删除后配置文件也会删除,相当于多了个备份

四、启动一个nginx临时容器,把配置文件复制过来,然后删除

启动一个nginx容器

docker run --name nginx -p 80:80 -d nginx

复制配置文件

docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx/conf/
docker cp nginx:/etc/nginx/conf.d /usr/local/nginx

复制完了,可以把这个容器删了,先停止再删除

docker stop nginx
docker rm nginx

这一步是为了获得正确的nginx配置文件格式

五、把SSL证书上传到服务器

上传到这个目录下面,ssl是我们刚才创建的目录

/usr/local/nginx/ssl

六、修改nginx.conf配置文件,配置SSL证书

server {
    listen 80;
    #填写绑定证书的域名
    server_name _;
    #把http的域名请求转成https,相当于用户访问http也可以自动跳转到https,避免出现网页提示不安全
    return 301 https://$host$request_uri; 
}

server {
    listen  443 ssl;
    server_name  _; 
    #证书文件名称
    ssl_certificate_key /etc/nginx/ssl/xx.key;
    #私钥文件名称 .crt和.pem都可以用
    ssl_certificate /etc/nginx/ssl/xx.pem; 
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    root         /usr/local/nginx/html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    #首页
    location / {
       index index.php index.html index.htm;
       client_max_body_size  50m;
       #limit_rate 100k; 限制下载速度

       include fastcgi_params; 
       #rewrite ^.*$ /index.php$request_uri break;
       #ThinkPhp访问异常可以用下面的代码
       if (!-e $request_filename) {
           rewrite  ^(.*)$  /index.php?s=/$1  last;
           break;
       }
     
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_index index.php;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   }
}

*注意:虽然证书存放位置是/usr/local/nginx/ssl,但是配置里面要写/etc/nginx/ssl而不是/usr/local/nginx/ssl,不然启动会报错,因为配置里面的绝对路径,都是在nginx容器里面的地址,和主机里面的目录地址是两个东西,后面启动目录挂载的时候,是可以读到证书的,不用担心。

七、正式启动nginx

docker run --name nginx -p 80:80 -p 443:443 \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf/ \
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d/ \
-v /usr/local/nginx/logs:/var/log/nginx \
-v /usr/local/nginx/ssl:/etc/nginx/ssl \
--privileged=true -d --restart=always nginx
--name nginx //容器名称
-p 80:80 -p 443:443 //将容器的80端口映射到服务器的80端口,将容器的443端口映射到服务器的443端口
-v aa:bb //将主机的aa目录挂载到容器的bb
--privileged=true //使用该参数,container内的root拥有真正的root权限,避免后面操作时提示无权限
--restart=always //能够使我们在重启docker时,自动启动相关容器

八、检查nginx是否成功启动

up运行中

访问服务器,提示这个,就是成功启动了

九、访问失败?

看下nginx日志,有没有报错

docker logs nginx

检查下服务器的80/443端口都打开吗?看下服务器安全组里面开了吗?还有问题可以评论留言

TIPS:

#不需要SSL的情况
server {
    listen 80;  # 监听80端口
    server_name example.com www.example.com;  # 自己的域名
    
    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://127.0.0.1:8090;  # 需要代理的地址:端口
    }
}

配置完后,访问example.comwww.example.com的请求会被转发到服务器的8090端口

需要SSL的情况
如果不需要访问http的时候强制重定向为https,可以用下面的配置

# 非强制重定向https
server {
    listen 80; #侦听80端口,如果强制所有的访问都必须是HTTPs的,这行需要注销掉
    listen 443 ssl; #侦听443端口,用于SSL
    server_name example.cn www.example.cn;  # 自己的域名
    # 注意文件位置,是从/etc/nginx/下开始算起的
    ssl_certificate 1_example_bundle.crt;
    ssl_certificate_key 2_example.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
        proxy_pass http://xxx.xx.xx.xx:8090;
    }
}

如果需要访问http的时候强制重定向为https,可以用下面的配置

# 强制重定向
server {
    listen 443 ssl;
    server_name example.cn www.example.cn;  # 自己的域名
    # 注意文件位置,是从/etc/nginx/下开始算起的
    ssl_certificate 1_example_bundle.crt;
    ssl_certificate_key 2_example.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    client_max_body_size 1024m;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
        proxy_pass http://xxx.xx.xx.xx:8090;
    }
}
server {
     listen 80; # 监听80端口
     server_name example.cn www.example.cn;  # 绑定证书的域名
     #把http的域名请求转成https
     return 301 https://$host$request_uri; 
}

启动Nginx

docker run -itd --name nginx -p 80:80 -p 443:443-v /nginx/conf.d/nginx.conf:/etc/nginx/conf.d/nginx.conf -v /nginx/cert:/etc/nginx -m 100m nginx

参数说明

-itd    后台运行
-p      指定端口80和443
-v      将本地的文件映射到docker中
        配置文件 /nginx/conf.d/nginx.conf -> /etc/nginx/conf.d/nginx.conf
        证书文件 /nginx/cert -> /etc/nginx
-m      限制使用内存大小
--name  指定名字为nginx

相关文章

网友评论

      本文标题:Docker 部署Nginx 带SSL证书部署

      本文链接:https://www.haomeiwen.com/subject/tiahsdtx.html