Let's Encrypt泛域名使用和Nginx配置拆分
上一期写了 使用Let's Encrypt实现网站https化 ,随着二级域名的增多,每个二级域名需要一张 SSL 证书,这可太不优雅了,泛域名表示我可以更优雅。
作者:IT王小二
博客:https://itwxe.com
本来 Let's Encrypt 泛域名使用、Nginx 配置拆分是准备分成两篇文章来写的,可是两篇文章又感觉篇幅过短和冗余。
所以最后决定写在一篇里面吧,同时把整个流程写明白,之前有人问有了证书怎么搭配 Nginx 来配置,这篇从域名映射到Nginx配置完成的保姆级教程,小二求个点赞不过分吧。
一、SSL证书获取
写在最前面,使用过程中如有问题参考 acme官方文档 ,文档有中文说明,如果有报错可以查看 Issuse,当然也可以留言你碰到的问题。
如果你已经有证书了,直接访问第二步 域名映射配置 开始阅读即可。
由于 Let's Encrypy 申请的 SSL 证书只有三个月的有效期,泛域名申请只能DNS验证,可以使用使用 acme.sh 脚本来获取且自动续期,前提是你的 DNS 服务商支持 DNS 调用,支持的服务商在 https://github.com/acmesh-official/acme.sh/wiki/dnsapi 中自行查看。
虽然 DNSPod.cn 支持 DNS 接口调用,不过个人结合了百度云加速 CDN 的严格加密模式,不用 CDN 来加速,那加载个图片估计都能卡成 PPT,就我服务器那小水管带宽,而百度云加速 CDN 没有可以能够自动上传证书的接口,故我没有使用自动 DNS 验证,使用了手动 DNS 验证。
手动的话每三个月就要手动更新一次证书,当然如果你没有配合其他 CDN 使用的话,可以使用 DNS 自动验证模式,每个服务商的使用方式也很简单,官方文档写的很明白了。
当然你不知道什么是自动 DNS 或者手动 DNS 也没关系,看文档或者按照我的操作一步一步来都是可以成功滴。
1. 什么是泛域名
比如用户的域名是abc.com,那么我们将主机名设置为"",IP解析到比如:218.104.78.100,大家都知道是通配符,他表明abc.com之前的所有子域名都将解析到218.104.78.100,这就意味着例如输入bbs.abc.com或者123.abc.com或者123.234.abc.com都将解析到218.104.78.100,这里需要说明的是,在我们系统里面如果单独设置一个子域名解析,比如将主机名设置为mail,单独解析到218.104.78.79,那么该解析记录优先。 -- 摘自百度百科
而泛域名证书就是一张证书可以用来验证所有同级子域名的证书,例如 *.itwxe.com
的证书,那么 www.itwxe.com
、images.itwxe.com
、waline.itwxe.com
都是可以使用 *.itwxe.com
来验证的,当然 主域名itwxe.com
和三级域名 www.aa.itwxe.com
就不适用了。
不过大部分人二级域名就已经够用了,这样就避免了一个二级域名申请一张 SSL 证书,真是个优雅的方案啊。
2. 下载脚本并安装
下载脚本并安装,将邮箱设置成自己的。
wget -O - https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m itwxe@qq.com
刷新用户变量,任意目录可以使用 acme.sh。
source /root/.bashrc
刷新配置后,输入命令 acme.sh -v
查看 acme.sh 的版本,要是正常打印版本就代表安装成功。
这里除了安装了脚本,同时还自动配置了个定时任务,这个定时任务每天会检查你的证书是否需要自动续期,可以使用 crontab -l
查看,因为使用的是手动 DNS 模式,这个定时任务意义不大,所以可以直接删除掉,当然不删除也没问题。
3. 手动申请泛域名证书
附上一段官方文档原话截图,免得有些小伙伴没法访问 GitHub 说我给的文档地址是假的,毕竟 GitHub 时不时抽风,这么贴心的小二不值得你的一个点赞吗,嘿嘿。
下面开始自己的操作,为了一张 SSL 证书能够同时使用主域名 itwxe.com
和 二级域名 *.itwxe.com
,所以,申请证书时命令如下,其中域名换成自己的。
acme.sh --issue --dns -d itwxe.com -d *.itwxe.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
因为我的泛域名还有两个多月过期,所以我这里演示增加参数 --force
强制更新,没有申请过证书则不需要 --force
参数,过程如图:
登录域名控制台,我的是腾讯云,手动添加 DNS 验证域名所有权,内容是上图中的两个圈中的内容。需要注意的是,内容主机域名填写 _acme-challenge,记录类型选择 TXT, 记录值填写上面命令生成的内容。
添加后的结果如图。
添加后过个30秒时间,执行如下命令如下,其中域名替换为自己的域名,特别注意的是 --renew
而不是 --issue --dns
。
acme.sh --renew -d itwxe.com -d *.itwxe.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
看到如上图的日志,就代表 SSL 证书生成成功了,可以看到 SSL 证书放在 /root/.acme.sh/itwxe.com/
目录下,查看一下生成的证书,主要用到的是下图这两个证书。
二、域名映射
同样在域名服务商后台配置映射,我这里还是腾讯云啦。配置泛域名映射到自己的主机 IP,假如我的 IP 是 192.168.5.11,可能有人要吐槽了,你这明显是个内网 IP,配置成这样能访问我..我...倒立喝可乐。
我说的是假如哈,不要较真,小伙伴们自己操作记得换成自己的公网 IP。
配置好了之后腾讯云免费解析大概要十分钟生效,趁这个时间刚好可以去配置一下 Nginx,美滋滋。
看解析是否生效的办法就是打开终端 ping 一下自己的二级域名,如果响应的是你的IP,那么就OK啦。
三、Nginx配置拆分
这里我使用的是 Nginx 作为反向代理,又不知道怎么安装 Nginx 的小伙伴可以访问 https://www.itwxe.com/posts/1334c88e/ 来安装 Nginx。
1. 复制证书文件
创建 /usr/local/nginx/ssl/any
目录并复制证书到创建的目录下,下面的命令就不用小二解释了吧,相信小伙伴们都明白,Linux常用的命令,注意把路径改成自己的就可以啦。
mkdir -p /usr/local/nginx/ssl/any
cp /root/.acme.sh/itwxe.com/{fullchain.cer,itwxe.com.key} /usr/local/nginx/ssl/any/
2. 配置Nginx
既然使用了泛域名,一般来说子域名就比较多了,目前我都已经 5 个子域名,后面还会不断增加,所以需要对 Nginx 配置文件进行一个拆分,拆分也很简单,以配置 www.itwxe.com
为例开始操作。
默认 Nginx 是用 /usr/local/nginx/conf/nginx.conf
文件启动的,那么为了拆分配置,在 /usr/local/nginx/conf
目录下新建一个 conf.d
文件夹,然后里面放我们拆分的配置。
进入 conf 目录后使用 mkdir conf.d
创建文件夹后,进入创建的文件夹,我的目录及文件如下。
vi common.conf
写入如下SSL通用配置后保存退出,ssl_certificate 和 ssl_certificate_key 分别是证书的路径。
ssl_certificate /usr/local/nginx/ssl/any/fullchain.cer;
ssl_certificate_key /usr/local/nginx/ssl/any/itwxe.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 30m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
ssl_prefer_server_ciphers on;
vi www.itwxe.conf
中配置如下,使用 include
关键字来引用 SSL 通用配置。
# itwxe.com 强制跳转 www.itwxe.com,按个人需求更改
server {
listen 443 ssl;
server_name itwxe.com;
include /usr/local/nginx/conf/conf.d/common.conf;
return 301 https://www.itwxe.com$request_uri;
}
server {
listen 443 ssl;
server_name www.itwxe.com;
# 引用通用域名配置common.conf
include /usr/local/nginx/conf/conf.d/common.conf;
location / {
root /itwxe/blogSite/public;
index index.html;
}
# 网站图标
location = /favicon.ico {
alias /itwxe/dockerData/lskypro/public/images/site-info/favicon.png;
log_not_found off;
access_log off;
}
# 404页面
error_page 404 /404.html;
location = /404.html {
root html/404-26;
}
}
www为示例,其他的同级子域名也类似配置。拆分出来的配置还要在主配置文件 /usr/local/nginx/conf/nginx.conf
中引用。
同时为了防止别人恶意解析到我们的泛域名,我们需要配置 Nginx 中未配置的二级域名默认返回 404 或者 444 ,这样配置也对 SEO 比较友好,当时我没配置导致百度收录了好几个没用的域名链接。
下面是我的配置,其中最重要的部分如图:
下面是方便大家复制修改成自己的配置文本。
server{
listen 80 default_server;
server_name _;
access_log off;
return 404;
}
server{
listen 443 default_server;
server_name _;
ssl_certificate /usr/local/nginx/ssl/any/fullchain.cer;
ssl_certificate_key /usr/local/nginx/ssl/any/itwxe.com.key;
access_log off;
return 404;
}
server {
listen 80;
server_name *.itwxe.com;
# 将http请求转变为https
return 301 https://$host$request_uri;
#rewrite ^(.*) https://$host$1 permanent;
#location / {
# root /itwxe/blogSite/public;
# index index.html;
#}
charset utf-8;
}
include /usr/local/nginx/conf/conf.d/*.itwxe.conf;
配置完成后,校验 Nginx 配置 和重新加载 Nginx 配置。
./nginx -t
./nginx -s reload
至此,就完成了泛域名的使用和 Nginx 配置拆分,这时候可以看下网站是否可以正常访问,可以看到证书正常部署生效了。
当然如果使用了 CDN 还在 CDN 控制台上传证书,我的就是百度云加速了,下篇来说说 CDN 是啥,国内和国外有哪些免费的 CDN 可以使用,感兴趣的小伙伴可以来个关注啦。
都读到这里了,来个 点赞、评论、关注、收藏 吧!
原文地址:https://www.cnblogs.com/itwxe/p/15161685.html
- CSS3弹性盒布局
- iBatis.Net(4):DataMapper API
- PHP开发过程的那些坑(四) ——PDO bindParam函数
- iBatis.Net(3):创建SqlMapper实例
- PHP开发过程的那些坑(五) ——PHP的empty()
- iBatis.Net(2):基本概念与配置
- ASP.NET Web API中的依赖注入什么是依赖注入ASP.NET Web API依赖解析器使用Unity解析依赖配置依赖解析
- 解决Entity Framework查询匿名对象后的跨域访问的一种方式
- WebSocket在ASP.NET MVC4中的简单实现
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式第一种方法第二种方法第三种方法
- Unity Container中的几种注册方式与示例1.实例注册2.简单类型注册
- 使用Unity创建依赖注入依赖注入生命周期:注册、解析、销毁 注册解析销毁
- 使用WCF进行跨平台开发之三(JAVA调用WCF服务)1.开发必备2.生成WCF客户端3.开发程序4.结束语
- 使用WCF进行跨平台开发之二(IIS托管WCF服务并使用php平台调用)1.系统必备2.在IIS中托管WCF服务3.使用PHP调用托管在IIS中的WCF服务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- a+=b 和 a=a+b 真的完全等价吗?
- C语言 main 函数到底怎么写是对的?
- theia 安装 + 登录认证
- 必须掌握的HDFS相关问题
- 如何在K8S上备份和恢复MySQL
- 学习 | Spring Cloud Config 从入门到精通
- 模仿百度新闻的一部分
- 腾讯云录音文件识别-iOS SDK
- ESP8266如何设置wifi。
- ESP8266搭建web服务器
- 关于持续交付中Git分支管理的思考
- 轻松应对并发问题,Newbe.Claptrap 框架中 State 和 Event 应该如何理解?
- 如何暂停一个正在运行的线程?
- WebMonitor采集端优化之路
- 美颜算法之自动祛斑算法实现 | 案例分享