Docker 部署 Nginx,使用 HTTPS+二级域名访问静态网站
2021年1月26日大约 4 分钟
1. 安装 docker(略)
2. 拉取 nginx
docker pull nginx3. 进入 nginx,将相关文件和目录拷贝到宿主机上(这里为腾讯云 centos7.8)关键路径如下:
# nginx的主配置文件
/etc/nginx/nginx.conf
# 虚拟主机的配置文件
/etc/nginx/conf.d
# nginx的日志文件
/var/log/nginx
# 存放静态资源
/usr/share/nginx/html
# 存放ssl证书
/etc/ssl4. 挂载到上述位置前,先将 nginx.conf、conf.d 下的 default.conf 文件从容器中拷贝到宿主机中,这样就无需自己在宿主机创建配置文件及其内容了,其余的都是一些目录,使用 mkdir 命令创建即可
先直接创建 nginx 容器,不挂载,目的是使用 docker cp 命令将相关配置文件拷贝到宿主机
docker run -id --name=c_nginx -p 80:80 nginx将 nginx 容器中的 nginx.conf 拷贝到/root/nginx 目录中(只是为了暂存这两个文件,路径可自行修改)
docker cp c_nginx:/etc/nginx/nginx.conf /root/nginx将 nginx 容器中的 default.conf 拷贝到/root/nginx 目录中
docker cp c_nginx:/etc/nginx/conf.d/default.conf /root/nginx创建相关目录,为挂载做准备
注意路径
mkdir html
mkdir conf.d
mkdir logs
mkdir ssl删除 nginx 容器,重新创建并挂载相关文件及目录 先停止 nginx 容器运行
docker stop c_nginx再删除
docker rm c_nginx # c_nginx是我起的容器名重新创建 nginx 容器并挂载相关文件及目录,这一步是关键,一定要确认宿主机的相关目录或文件是否与 nginx 容器一一对应,这一步比较容易出错,不要忘记映射 443 端口,否则无法通过 https 访问
# 创建并启动nginx容器,注意,$PWD这里为/root/nginx
docker run -id --name=c_nginx \
-p 80:80 \
-p 443:443 \
-v $PWD/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/conf.d:/etc/nginx/conf.d \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
-v $PWD/ssl:/etc/ssl \
nginx查看 nginx 容器是否成功运行
docker ps只要 STATUS 为 Up 即可,如果为已退出状态,请检查上一步
5. 下载 ssl 证书,我的是腾讯云,具体过程略,申请后等 10 分钟左右会出结果,若申请成功可以下载一个压缩包,解压后有一个 Nginx 目录,里面有两个文件:1_你的域名_bundle.crt 和 2_你的域名.key
将这两个文件放在宿主机/root/nginx/ssl 下即可,这里我放在 ssl 下又创建了一个目录,以域名命名,将上述的两个文件放入即此目录
6. 将静态资源上传至/root/nginx/html 并配置 default.conf
如果主配置文件 nginx.conf 中没有 include /etc/nginx/conf.d/*
.conf;就在 nginx.conf 中写 server 即可,一般是一个网站对应 conf.d 目录中的一个 xxx.conf,这里我直接在 default.conf 中配置 server,配置内容如下
# web前端课程期末设计 https配置
server {
#侦听443端口,这个是ssl访问端口
listen 443 ssl;
# 如果强制所有的访问都必须是HTTPs的,这行需要注销掉
#listen 80;
#定义使用 访问域名
server_name 申请证书的域名;
# 这些都是腾讯云推荐的配置,直接拿来用就行了,只是修改证书的路径,注意这些路径是相对于/etc/nginx/nginx.conf文件位置
ssl_certificate /etc/ssl/自定义目录/1_你的域名_bundle.crt;
ssl_certificate_key /etc/ssl/自定义目录/2_你的域名.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;
#默认请求
location / {
# 需要注意的是,由于是docker部署,所以root是容器内的路径,而不能是宿主机的,否则404
# 以后再部署静态网站时,root就写/usr/share/nginx/html/要部署的静态资源目录名
# root /root/nginx/html/web前端课程期末设计 错误写法!!404
root /usr/share/nginx/html/web前端课程期末设计;
index index.html index.htm;
}
}
server {
listen 80;
server_name 你的二级域名;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}检查配置文件语法是否正确,首先进入 nginx 容器
docker exec -it c_nginx bashnginx -t出现以下提示则语法正确
再使用查看 nginx 容器是否运行,若没运行,请检查上文操作的正确性
docker ps最后输入域名,访问成功
补充:server_name 一定是已存在的域名,比如二级域名 xxx.xxx.com,这需要在控制台添加主机记录,以腾讯云为例