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 ...
随机推荐
- jquery表单序列化
$(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...
- ASP.NET MVC5(四):数据注解和验证
前言 用户输入验证的工作,不仅要在客户端浏览器中执行,还要在服务端执行.主要原因是客户端验证会对输入数据给出即时反馈,提高用户体验:服务器端验证,主要是因为不能完全信任用户提供的数据.ASP.NET ...
- BinarySearchTree-二叉搜索树
一.二叉搜索树的定义及性质 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空 ...
- 用queue函数写广搜
以走迷宫需要的最少步数的代码为例 #include<stdio.h>#include<string.h>#include<queue> using namespac ...
- Java NIO 学习笔记五 缓冲区补充
1.缓冲区分配 方法 以 ByteBuffer 为例 (1)使用静态方法 ByteBuffer buffer = ByteBuffer.allocate( 500 ); allocate() 方法 ...
- Latex: 插入数学公式
write equations align equations to left To only align one equation, you can \begin{flalign} &\te ...
- PHP二维数组合并,根据某个key合并
/** *PHP二维数组合并,根据某个key合并 * @param type $v 要传入的组合阵列 * @param type $keyname 对应的KEY名称. * @param type $v ...
- 第14章 Linux开机详细流程
本文目录: 14.1 按下电源和bios阶段 14.2 MBR和各种bootloader阶段 14.2.1 boot loader 14.2.2 分区表 14.2.3 采用VBR/EBR方式引导操作系 ...
- 【Android Developers Training】 28. 将用户带领到另一个应用
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Object-C知识点 (三) 单例 蒙版 刷新 KVO底层
#pragma mark - 单例方法(完整的方法) 系统的单例方法名称 sharedApplication defaultManager standardUserDefaults currentDe ...