Let's Encrypt与DNS轮循

本文由网络安全研究员、securityheaders.io和report-uri.io创始人Scott Helme发布在其个人博客中。描述了如何使用Let's Encrypt的同时兼容DNS轮循。
早些时候,我所经营的securityheaders.io经历了一段负载特别高的时期。在那段时间里,我尝试研究并整理其根本原因,想在网站后端投入更多的云资源来强化它。
DNS轮循
我想转移另一台服务器,将负载从当前的securityheaders.io运行的单个实例中分离出来。计划很简单:创建服务器,向DNS添加IP地址。 DNS循环允许您在同一个域中拥有2个(或更多)IP地址,并以不同的顺序返回,以便客户端使用不同的IP地址。这个想法最终达到了相当基本的负载平衡,使得每个服务器均分50%的流量。这么做在解决了我的负载问题同时,引入了一个新问题——更新证书。
Let's Encrypt
我使用了Let's Encrypt的证书,他们通过在你主机里的某个特殊路径里放一个简单的HTML文件,来实现DV challenge。这个工作机制在仅针对一个服务器时效果拔群,但问题是,我现在有两个。要是我其中一个服务器请求证书、托管这个HTML文件,结果Let's Encrypt将我的IP地址解析成另一个服务器的IP,但这个服务器上没有响应文件,那岂不是很尴尬?证书请求失败,那就玩不下去了?幸好,我们可以用Nginx来解决!
Nginx命名地点
在Nginx中,我们通常定义一个位置块和路径。 以下是我常用的接受ACME challenge的位置信息:
location /.well-known/acme-challenge/ {
alias /home/acme/challenges/;
try_files $uri;
}
该路径将匹配/.well-known/acme-challenge/,我已将其别名到写入challenge文件的文件系统文件夹中,try_files将检查文件的存在。 这一切都很好,直到该文件可能在另一个服务器上,这就是所在的位置。try_files指令可以采用多个参数,Nginx会遍历它们,直到匹配。 我们现在可以引入另一个参数并创建一个命名的位置:
location /.well-known/acme-challenge/ {alias /home/acme/challenges/;try_files $uri @proxy;}
这告诉Nginx在本地查找该文件,如果没有找到,那么将其传递给@proxy。 我们现在需要定义命名的位置:
location @proxy {
proxy_pass http://162.243.159.108:8080;
}
在这个位置,我正在使用proxy_pass指令将请求传递给另一个服务器。 第二台服务器正在监听端口8080,专门针对已经通过的ACME challenge:
server {
listen 192.241.216.219:8080;
server_name 192.241.216.219;
location / {
return 301 https://securityheaders.io$request_uri;
}
location /.well-known/acme-challenge/ {
alias /home/acme/challenges/;
try_files $uri =404;
}
}
第二台服务器被配置为监听IP,并回答ACME challenge,或将流量重定向并返回到securityheaders.io域。 我还向UFW添加了一条规则,只允许每个服务器根据其IP地址与端口8080上的其他服务器进行通信。
解决这个问题的最佳方法可能是使用DNS challenge而不是HTTP。 之前Let's Encrypt增加了对此的支持。不过可惜的是,我是用的客户端acme_tiny并不支持这项功能,而我只想走一条快速简洁的捷径。因而上述做法仅适用于几台服务器之间周转,扩展性不佳。但如果你和我一样只想快速搞定,这个方法可以一试!
Let's Encrypt与DNS轮循的更多相关文章
- python使用dns轮循检测web服务器是否异常
我使用的是python2.7,我本来另装了一个python3.6,发现无法安装dnspython,于是只能换回来了 import dns.resolver #这个需要另外下载并安装(下载地址www.d ...
- 【处理多服务器日志合并处理问题】多服务器的日志合并统计——apache日志的cronolog轮循
转发:http://www.chedong.com/tech/rotate_merge_log.html 内容摘要:你完全不必耐心地看完下面的所有内容,因为结论无非以下2点:1 用 cronolo ...
- ajax轮循
使用 AJAX 进行异步加载轮询操作.简单代码如下: <script> // 执行ajax轮循操作 function polling(){ var xmlhttp; // 判断浏览器--创 ...
- ajax 轮循
使用 AJAX 进行异步加载轮询操作.简单代码如下: <script> // 执行ajax轮循操作 function polling(){ var xmlhttp; // 判断浏览器--创 ...
- Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例
原文地址:http://www.jb51.net/article/31844.htm Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 ...
- 负载均衡之DNS轮询
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...
- 线程轮循打印ABC...
package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurren ...
- 负载均衡手段之DNS轮询
大多数域名注册商都支持对统一主机添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.下图的例子是:有3台联通服务器.3台电信服 ...
- Linux日志轮循实现(shell)
在Linux系统中,日志的使用非常频繁,那么对日志就需要一定策略的管理,包括存放目录的设计,log文件命名规则,历史log文件的存放,log目录的容量限制,另外还有日志轮循. 日志轮循就是,将过期的l ...
随机推荐
- Spring学习(2)---IOC
1.接口及面向接口编程 2.什么是IOC 3.Spring的Bean配置 4.Bean的初始化 5.Spring的常用注入方式 (一)接口 用于沟通的中介物的抽象化 实体把自己提供给我外接的一种抽象化 ...
- ZooKeeper数据结构
Time in ZooKeeper ZooKeeper跟踪时间的多种方式 1)Zxid:每个ZooKeeper状态变化将会接收到一个zxid(ZooKeeper Transaction Id)的时间戳 ...
- ionic2 跳转子页面隐藏底部导航栏
第一种方法: 在tab里面添加一个属性[tabsHideOnSubPages]='true' <ion-tab [root]="tab1Root" [tabsHideOnSu ...
- Java基础——关于访问权限的一道例题
一.回顾访问修饰符 ==public:被它修饰的类,属性,方法,不仅可以跨类访问,而且可以跨包(package)访问 ==private:可以修饰数据成员,构造方法,方法,不能修饰类,被它修饰的成员只 ...
- [1] [转]软件架构之三层架构和MVC的关系
注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用 又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了.因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联 ...
- 在vue 中使用Stylus
概述 什么是Stylus Stylus是一个CSS预处理器. 什么是CSS预处理器 关于CSS预处理器,推荐先行阅读这篇文章:为您详细比较三个 CSS 预处理器(框架):Sass.LESS 和 Sty ...
- python网络爬虫之beautfiulSoup
BeautifulSoup将html文档转换成一个属性结构,每个节点都是python对象.这样我们就能针对每个结点进行操作.参考如下代码 def parse_url(): try: ...
- 自动适配H5容器(UIViewView/WKWebView),生成长图,防微信进度条
前段时间撸代码猥琐发育的时候,设计师老王给了张截图某宝APP上一个生成长图分享的功能,正好公司有这个需求,于是在立马开始操练起来!在万能的度娘上搜集整理资料后发现很多文章介绍的方案对WKWebView ...
- 使用c#解析json库
写了个c#版的json解析库,提供了json到hashtable以及hashtable到json字符串的转换 受惠于c#的语法特性,hashtable到json的解析变得非常简单 先判断传入的obje ...
- Android-->创建自定义控件
1.仿 iPhone 的风格,在界面的顶部放置一个标题栏. <?xml version="1.0" encoding="utf-8"?> <R ...