<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>服务器安全维护工作室 &#187; 代维</title>
	<atom:link href="https://www.fuwuqiok.com/topics/%e4%bb%a3%e7%bb%b4/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fuwuqiok.com</link>
	<description></description>
	<lastBuildDate>Sun, 01 Mar 2020 07:28:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.26</generator>
	<item>
		<title>在Virtual Private Cloud中自建基于BIND的DNS服务器</title>
		<link>https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
		<comments>https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Fri, 27 Jul 2018 09:16:48 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[linux服务器代维护]]></category>
		<category><![CDATA[linux服务器维护]]></category>
		<category><![CDATA[linux系统代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[在Virtual Private Cloud中自建基于BIND的DNS服务器]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3698</guid>
		<description><![CDATA[<p>Amazon Virtual Private Cloud (Amazon VPC) 是 AWS 提供的虚拟私有 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/">在Virtual Private Cloud中自建基于BIND的DNS服务器</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>Amazon Virtual Private Cloud (Amazon VPC) 是 AWS 提供的虚拟私有网络服务，允许您在 AWS 云中预配置出一个采用逻辑隔离的部分，让您在自己定义的虚拟网络中启动 AWS 资源。您可以完全掌控您的虚拟联网环境，包括选择自有的 IP 地址范围、创建子网，以及配置路由表和网关。</p>
<p>除了提供IP资源及网络连接，Amazon VPC还提供DNS及DHCP等基础设施服务。当您将实例启动到默认 VPC 中时，我们为实例提供与其公有 IPv4 和私有 IPv4 地址对应的公有和私有 DNS 主机名。当您在非默认 VPC 中启动实例时，我们会为实例提供私有 DNS 主机名，并根据您为 VPC 和实例指定的设置来决定是否提供公有 DNS 主机名。</p>
<p>对于 us-east-1 区域，公有 (外部) DNS 主机名采用 ec2-&lt;public-ipv4-address&gt;.compute-1.amazonaws.com 形式，对于其他区域，则采用 ec2-&lt;public-ipv4-address&gt;.region.amazonaws.com 形式。例如，公有IP为54.222.212.110的EC2实例，其公有DNS名为ec2-54-222-212-110.cn-north-1.compute.amazonaws.com.cn。我们将公有 DNS 主机名解析为该实例在所在网络外的公有 IPv4 地址及其在所在网络内的私有 IPv4 地址。</p>
<p>私有 (内部) DNS 主机名解析为实例的私有 IPv4 地址，并对 us-east-1 区域采用 ip-&lt;private-ipv4-address&gt;.ec2.internal 形式，对其他区域采用 ip-&lt;private-ipv4-address&gt;.region.compute.internal 形式 (其中 private.ipv4.address 是反向查找 IP 地址)。例如，私有IP地址为10.206.2.239的EC2实例，其私有DNS名为ip-10-206-2-239.cn-north-1.compute.internal。您可以使用私有 DNS 主机名在同一网络中实现实例之间的通信，但我们无法解析实例所在网络之外的 DNS 主机名。要解析实例所在网络之外的主机名，可自建DNS服务器来为VPC及外部网络提供DNS服务。</p>
<p>常见的应用场景是在混合IT架构下，客户数据中心通过VPN或是Direct Connect专线连接到AWS上的VPC，在VPC中配置1台DNS服务器，在客户数据中心也配置1台DNS服务器，服务器的主从角色客户可自行定义。通过多台DNS服务器为不同位置的客户端提供DNS服务，即能保证服务的高可用，又能就近提供服务，减少DNS查询延迟。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-1.png" alt="20170523-1" width="1748" height="678" /></a></p>
<p>接下来，我将基于上述架构图一步一步说明如何使用BIND搭建DNS服务器。本文不会涉及BIND的高级配置，如需了解BIND的高级配置，可参考<a href="https://www.isc.org/" target="_blank" rel="noopener noreferrer">BIND官方网站</a>。</p>
<h3>安装配置DNS主服务器</h3>
<p>首选需要准备一台EC2实例用于安装BIND软件，如何创建EC2实例可参考<a href="http://docs.amazonaws.cn/AWSEC2/latest/UserGuide/EC2_GetStarted.html" target="_blank" rel="noopener noreferrer">Amazon EC2入门指南</a>。本次示例选用Amazon Linux操作系统的AMI来创建实例，实例类型选用了通用型实例类型: m4.large。BIND对服务器硬件资源要求不高，在不启用DNSSEC的情况下(不在本文讨论范围)，普通配置的服务器即可承载DNS服务。m4.large配置有2颗vCPU和8G内存，运行DNS服务能够支持中等规模的DNS请求，当请求增加时，也可方便的调整实例类型到更大的配置。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-2.png" alt="20170523-2" width="2314" height="594" /></a></p>
<p>创建EC2实例时需要指定安全组来开放服务端口，DNS服务通过UDP 53端口提供DNS查询相应，通过TCP 53端口提供区域传送。因此，安全组队VPC网段开放UDP 53端口，对客户数据中心的DNS服务器开放TCP 53端口，如下图所示：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-3.png" alt="20170523-3" width="1948" height="764" /></a></p>
<p>DNS服务器作为基础设施服务的重要性无须多言，Amazon EC2持续监控EC2实例的状态以及底层硬件的状态，分别称为实例状态检查和系统状态检查。我们可创建状态检查报告，当任一状态检查失败时，执行重启操作，并将警报发送至指定邮箱。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-4.png" alt="20170523-4" width="1216" height="836" /></a></p>
<p>创建好警报之后，通过SSH登陆至EC2实例，并yum命令安装bind软件：</p>
<p><code>yum install bind-utils bind</code></p>
<p>安装好之后，我们接下来将创建一个示例的DNS域：aws.local，我们首先需要编辑/etc/named.conf文件，修改以下内容：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-5.png" alt="20170523-5" width="932" height="266" /></a></p>
<p>listen-on 缺省配置为127.0.0.1，DNS服务只会绑定到系统的环回接口，其他客户端无法访问，需要添加EC2实例的私有IP地址，才能提供外部访问</p>
<p>allow-query缺省配置为localhost，即只允许DNS服务器所在的EC2实例对自己进行DNS查询，添加VPC的网段可允许来自VPC内部的主机进行DNS查询。注：也可将此参数设置为0.0.0.0/0，因为前面安全组设置里只允许了VPC内的IP访问UDP 53端口。</p>
<p>此外，还需要增加对aws.local这个域的定义，在/etc/named.conf中增加以下内容，allow-transfer指定了只允许从DNS服务器进行区域传送，限定允许区域传送的范围颗可提高DNS服务的安全性：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-6.png" alt="20170523-6" width="556" height="160" /></a></p>
<p>上述配置说明aws.local域的具体解析配置在文件/var/named/aws.local.db 里，其内容如下，在这个示例配置中，定义了两条A记录，分别是dns.aws.local对应10.206.0.212和<a href="http://www.aws.local/">www.aws.local</a>对应10.206.0.213</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-7.png" alt="20170523-7" width="522" height="340" /></a></p>
<h3>配置Amazon VPC使用自建DNS服务器</h3>
<p>Amazon VPC通过DHCP服务为VPC中的EC2及其他连网组件动态分配IP地址，动态主机配置协议 (DHCP) 提供了将配置信息传递到 TCP/IP 网络中主机的标准。DHCP 消息中的options字段包含配置参数。这些参数包括域名、域名服务器以及“netbios-node-type”。接下来我们将创建一个新的DHCP选项集，并在选项集中将域名服务器指向刚才创建的DNS服务器。</p>
<p>在AWS控制台中选择VPC服务，并在左边的菜单中选择“DHCP选项集”，点击“创建DHCP选项集”按钮，输入以下信息，域名服务器可指定多个DNS服务器，按照顺序第一个为VPC内的DNS服务器，第二个为客户数据中心的DNS服务器：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-8.png" alt="20170523-8" width="1342" height="812" /></a></p>
<p>创建好DHCP选项集之后选择左边菜单中“您的VPC”选项，选中要修改的VPC，从“操作”下拉菜单中选择“编辑DHCP选项集”</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-9.png" alt="20170523-9" width="490" height="408" /></a></p>
<p>选择刚才创建的DHCP选项集并保存：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-10.png" alt="20170523-10" width="884" height="330" /></a></p>
<p>在您将新的 DHCP 选项集与 VPC 关联之后，任何现有实例以及您在 VPC 内启动的所有新增实例都将使用这些选项。 无需重新开始或重新启动实例。根据实例更新 DHCP 租赁权的频率，它们会在几个小时内自动拾取更改。如果您愿意，您也可以使用实例上的操作系统，直接更新租赁权。</p>
<h3>安装配置DNS从服务器</h3>
<p>在客户数据中心安装配置DNS服务器的步骤与在Aamazon EC2中安装配置DNS服务器的步骤相同，除了/etc/named.conf的配置稍有差别：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/20170523-11.png" alt="20170523-11" width="514" height="182" /></a></p>
<p>从服务器的type类型为slave，file参数对应的域配置文件会自动根据从主DNS服务器接收到的更新来进行创建和更新，masters指定aws.local域的主域名服务器，最后一个参数allow-transfer禁用了区域传送。</p>
<p>配置好从DNS服务器之后，可将客户数据中心内的连网设备设置为从DNS服务器，第二DNS服务器设置为AWS上的主DNS服务器。</p>
<h3>总结</h3>
<p>Amazon VPC提供DHCP服务和DNS服务，为VPC中的EC2实例提供IP地址分配和域名解析服务，为每个EC2实例创建特定格式的DNS域名。如果用户希望使用自定义域名，或者希望使用一套域名统一管理云上和云下的资源，可自行搭建DNS服务器来提供DNS解析服务，Amazon VPC能够支持客户。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/">在Virtual Private Cloud中自建基于BIND的DNS服务器</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%9c%a8virtual-private-cloud%e4%b8%ad%e8%87%aa%e5%bb%ba%e5%9f%ba%e4%ba%8ebind%e7%9a%84dns%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用AWS的数据库迁移DMS服务</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/#comments</comments>
		<pubDate>Fri, 27 Jul 2018 08:59:26 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[使用AWS的数据库迁移DMS服务]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3632</guid>
		<description><![CDATA[<p>1.DMS服务介绍 为了使用户更容易的将数据库迁移到云中，AWS已经在海外区域推出了AWS Database  [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/">使用AWS的数据库迁移DMS服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h3>1.DMS服务介绍</h3>
<p>为了使用户更容易的将数据库迁移到云中，AWS已经在海外区域推出了AWS Database Migration Service服务，如果您的数据库在海外，DMS可以在源数据库不停机的情况下，帮您将数据迁移到AWS云中。DMS的功能非常强大，支持同构数据库的迁移（如Oracle迁移到Oracle)，也支持异构数据库直接的迁移，如Oracle到Mysql等）。在数据库迁移期间，源数据库无需停机，并且能将迁移期间数据的更改持续复制到目标数据库。因此迁移完成后，您只需在短暂的停机时间内直接切换数据库，从而保证业务数据的完整性。<br />
在中国BJS区域，还没有推出DMS服务，但是提供了Database Migration Tool(DMT)工具，您可以使用DMT工具来完成数据库迁移。</p>
<h3>2.使用DMS完成迁移</h3>
<p>使用DMS服务必须确保源或目标数据库有一个在AWS云中。 使用DMS服务的步骤如下：</p>
<p><strong>步骤一：Create migration</strong></p>
<p>登陆AWS全球区域的Console，选择DMS,点击“Create migration”,我们便来到了“welcome”界面，从该界面我们可以看到，通过DMS进行数据迁移我们至少需要一个源数据库、目标数据库和复制实例。当然，DMS 也支持多个源数据库向一个目标数据库的迁移以及单个源数据库向多个目标数据库的迁移。迁移时，数据通过一个运行在复制实例上的任务将源数据库复制到目标数据库。点击“Next”进行复制实例的创建。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-1.png" alt="0928-1" width="3200" height="2200" /></a></p>
<p><strong>步骤二：创建“Replication Instance”</strong></p>
<p>您在进行数据库迁移过程中的第一个任务是创建具有足够存储空间和处理能力的复制实例，通过复制实例来执行您分配的任务并将数据从您的源数据库迁移到目标数据库。此实例所需的大小取决于您要迁移的数据和您需要执行的任务量。具体配置参数见下表1。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-2.png" alt="0928-2" width="971" height="700" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-3.png" alt="0928-3" width="3228" height="2444" /></a></p>
<p>如果您需要为网络和加密设置值，请选择高级选项卡。具体参数见表2。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-4.png" alt="0928-4" width="946" height="706" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-5.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-5.jpg" alt="0928-5" width="819" height="460" /></a></p>
<p><strong>步骤三：创建数据库连接</strong></p>
<p>当您在创建复制实例时，您可以指定源和目标数据库。源数据库和目标数据库可以在AWS的EC2上，也可以是AWS的关系数据库服务（RDS）的DB实例或者本地数据库。在设置源和目标数据库时，             具体参数可以参见表3。您也可以通过高级选项卡来设置连接字符串和加密密钥的值。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-6.png" alt="0928-6" width="968" height="910" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-7.png" alt="0928-7" width="795" height="920" /></a></p>
<p>等图示上部分的显示变成”Replication instance created successfully”并且“Run test“按钮变成正常，然后测试，确保测试结果为”Connection tested Successfully”,由于需要从AWS服务端连接测试数据库，因此需要设置好security group，设置的security group必须确保复制实例能够访问源和目标数据库。需要的话，可以短暂的将security group 1521　的访问设置为 0.0.0.0/0,测试成功后，点击”Next”按钮。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-8.png" alt="0928-8" width="805" height="940" /></a></p>
<h4>步骤四：创建“task”</h4>
<p>当源数据库和目标数据库建立连接后，您需要创建一个任务来指定哪些表需要迁移，使用目标架构来映射数据并且在目标数据库中创建新表。作为创建任务的一部分，您可以选择迁移类型：迁移现有数据、迁移现有数据并复制正在进行的更改，或只复制更改的数据。</p>
<p>如果选择”Migrate existing data and replicate data changes”选项需要打开Task Settings 中的supplemental loging开关。在Table Mapping中Schema to Migrate选择“Oracle”,点击“Create Task”。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-9.png" alt="0928-9" width="821" height="848" /></a></p>
<p>当您创建的task状态从creating变为ready的时候，您的task便创建好了。点击该“task”并点击上方的“Start/Resume”,您数据迁移任务便开始了！</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/0928-10.png" alt="0928-10" width="1090" height="182" /></a></p>
<p>数据库迁移完成后，目标数据库在您选择的时间段内仍会与源数据库保持同步，使您能够在方便的时候切换数据库。</p>
<h3>3.总结</h3>
<p>从上面过程我们可以看到，只需要简单的配置，DMS就可以帮助我们完成数据库的迁移任务，并且DMS服务是免费的，迁移过程中用到的资源是收费的。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/">使用AWS的数据库迁移DMS服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bbdms%e6%9c%8d%e5%8a%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon CloudFront常见错误配置及解决方法</title>
		<link>https://www.fuwuqiok.com/amazon-cloudfront%e5%b8%b8%e8%a7%81%e9%94%99%e8%af%af%e9%85%8d%e7%bd%ae%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/</link>
		<comments>https://www.fuwuqiok.com/amazon-cloudfront%e5%b8%b8%e8%a7%81%e9%94%99%e8%af%af%e9%85%8d%e7%bd%ae%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Fri, 27 Jul 2018 08:56:40 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux服务器代维护]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[Amazon CloudFront常见错误配置及解决方法]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3617</guid>
		<description><![CDATA[<p>很多的用户在最初使用CloudFront做Web类内容分发的时候遇到无法调通的情况，本文总结了用户在配置过程中 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/amazon-cloudfront%e5%b8%b8%e8%a7%81%e9%94%99%e8%af%af%e9%85%8d%e7%bd%ae%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/">Amazon CloudFront常见错误配置及解决方法</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>很多的用户在最初使用CloudFront做Web类内容分发的时候遇到无法调通的情况，本文总结了用户在配置过程中遇到的常见错误，内容涵盖了大部分用户遇到的情况。</p>
<h3>错误一  源访问权限未放开</h3>
<p>这种错误常见于用S3做源的情况, 引起这种错误的原因是s3的访问控制没有对CloudFront开放。从浏览器中返回的错误通常类似于下图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-1.png" alt="1025-1" width="817" height="153" /></a></p>
<p>更具体些，可分为以下两个场景：</p>
<p><strong>场景1. CloudFront使用了Restrict Bucket Access</strong></p>
<p>在创建distribution的时候选择了Restrict Bucket Access 为yes, 但 Grant Read Permissions on Bucket, 选择的是”No, I Will Update Permissions”， 而用户事后却没有在s3的桶里更新policy。如下图所示。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-2.png" alt="1025-2" width="668" height="443" /></a></p>
<p><strong>解决方法：</strong></p>
<p>方法1, 在S3中增加桶的策略，使该桶允许该CloudFront访问，以下是policy示例，其中标黄部分需要替换成用户自己的信息。</p>
<p><code>{</code></p>
<p><code>                "Version": "2008-10-17",</code></p>
<p><code>                "Id": "PolicyForCloudFrontPrivateContent",</code></p>
<p><code>                "Statement": [</code></p>
<p><code>                                {</code></p>
<p><code>                                                "Sid": "1",</code></p>
<p><code>                                                "Effect": "Allow",</code></p>
<p><code>                                                "Principal": {</code></p>
<p><code>                                                                "AWS": "arn:aws:iam::CloudFront:user/CloudFront Origin Access Identity E344H6KAFBMK0I"</code></p>
<p><code>                                                },</code></p>
<p><code>                                                "Action": "s3:GetObject",</code></p>
<p><code>                                                "Resource": "arn:aws:s3:::elastictcoutputthumb/*"</code></p>
<p><code>                                }</code></p>
<p><code>                ]</code></p>
<p><code>}</code></p>
<p>方法2, 重新创建distribution, 新建的distribution中Grant Read Permissions on Bucket选择yes, Update bucket policy， 这样当distribution创建完成后，s3桶的policy会被自动更新。</p>
<p><strong>场景2. 普通的S3回源</strong></p>
<p>CloudFront 并未使用Restrict Bucket Access, 这种情况下如果s3中的对象没有设置成可被公共访问，也会出现Access Denied的错误。</p>
<p><strong>解决方法：</strong></p>
<p>可以通过设置s3桶的bucket policy或者设置s3中对象的Object ACL来实现。 例如，通过 AWS 控制台设置存储桶的bucket policy:</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-3.png" alt="1025-3" width="607" height="401" /></a></p>
<p>通过 AWS 控制台设置S3对象的Object ACL:</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-4.png" alt="1025-4" width="684" height="234" /></a></p>
<p>注：如果想了解S3访问控制的详细内容，请参考：<a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html" target="_blank" rel="noopener noreferrer">http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html</a></p>
<h3>错误二 使用自定义域名但未在CloudFront中配置</h3>
<p>用户有时不直接使用CloudFront的distribution产生的域名，而是使用了自定义的域名并用CNAME的方式指到CloudFront的域名, 例如使用cdn.mydomain.com  CNAME到d1cbzf61pdxxxx.CloudFront.net。此外，如果使用Route53作为DNS, 也可以不采用CNAME的方式，而是采用Alias的方式。</p>
<p>CloudFront规定当使用自定义域名并配置该域名使用CNAME或Alias的方式指向CloudFront distribution的域名的时候，需要在CloudFront相应的distribution中提供该自定义的域名，如果使用了多个自定义的域名，则提供多个自定义的域名。如果没有提供，就会出现类似下图的错误：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-5.png" alt="1025-5" width="608" height="226" /></a></p>
<p><strong>解决方法：</strong></p>
<p>可以通过AWS控制台，对distribution中的Alternate Domain Names(CNAMEs)进行设置：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-6.png" alt="1025-6" width="667" height="275" /></a></p>
<h3>错误三 访问路径错误</h3>
<p>配置完CloudFront的Behavior后，用户有时不能给出正确的url来访问想要的资源。 出现访问错误, 如果是回源s3, 返回的错误通常如下：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-7.png" alt="1025-7" width="748" height="196" /></a></p>
<p>如果是回源的自定义网站，返回的错误根据网站的不同而不同，例如：返回”找不到相应的页面”等错误。</p>
<p><strong>解决方法：</strong></p>
<p>避免这种错误很简单，了解CloudFront Behavior的url与所访问的源站资源的对应方法，即可判别自己的url是否正确. 以下举例说明：</p>
<p>某Behavior如下，该Behavior对应的origin ID是S3-hxybucket/Picture:</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-8.png" alt="1025-8" width="909" height="258" /></a></p>
<p>进入到Origin查看,可知Origin Domain Name and Path是hxybucket.s3.amazonaws.com/Picture</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-81.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-81.png" alt="1025-81" width="909" height="258" /></a></p>
<p>如果通过d1cbzf61pdxxxx.CloudFront.net/dog.jpg访问的话， 对应的源站资源是hxybucket.s3.amazonaws.com/Picture/dog.jpg</p>
<p>如果通过d1cbzf61pdxxxx.CloudFront.net/jpg/dog.jpg访问的话，对应的源站资源是hxybucket.s3.amazonaws.com/Picture/jpg/dog.jpg</p>
<p>即: 将CloudFront域名后面的路径追加到Origin Domain Name and Path (注意，除了Domain Name之外，还有Path) 所对应的路径后面, 就是对应到源站的资源, 用户通过该路径即可判断所使用的url是否正确。</p>
<h3>错误四 HTTP Method 设置不当</h3>
<p>在创建Behavior的时候， allowed http methods选项的默认值是GET和HEAD, 有时用户会使用其他的HTTP method, 例如POST, 此时如果还是用默认值，就会出错，返回的错误通常如下：</p>
<p>“This distribution is not configured to allow the HTTP request method that was used for this request. The distribution supports only cachable requests.”</p>
<p><strong>解决办法：</strong></p>
<p>办法很简单，在Behavior中重新设定一下Allowed HTTP Methods选项，使其包含所用的HTTP Method.</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-10.png" alt="1025-10" width="616" height="81" /></a></p>
<h3>错误五 设置了Restrict Viewer Access 却没有使用Signed URL或Signed Cookie</h3>
<p>在创建Behavior的时候，Restrict Viewer Access (Use Signed URLs or<br />
Signed Cookies)选项的默认值是No, 如果用户改成了Yes, 此时该Behavior对应的资源必须使用Signed URL 或者Signed Cookie的方式访问，如果使用普通的Url访问，返回的错误通常如下：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-11.png" alt="1025-11" width="522" height="140" /></a></p>
<p><strong>解决方法：</strong></p>
<p>方法１.使用signed url 或signed Cookie进行访问，具体参考：<a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html" target="_blank" rel="noopener noreferrer">http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html</a></p>
<p>方法2. 将Restrict Viewer Access (Use Signed URLs or<br />
Signed Cookies)的值改为No。如图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-12.png" alt="1025-12" width="581" height="126" /></a></p>
<h3>错误六  Object Caching 设置不当</h3>
<p>虽然能够访问到源，但有时用户会反映使用了CloudFront并没有加速访问，有时甚至效果还不如未使用CloudFront时。 这很可能是由于Object Caching设置不当造成的。</p>
<p><strong>解决方法:</strong></p>
<p>Object Caching有两个选项，分别是Use Origin Cache Headers 和 Customize。默认选项是前者。但是，当默认选择了Use Origin Cache Headers，而源的HTTP header中却没有Cache-control的头，那返回内容就不被缓存了。 因此，用户需谨慎选择，当源的返回值中没有Cache-control头的情况下，选择Customize，Customize中的Default值将会成为TTL时间(时间单位是秒)。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/07/1025-13.png" alt="1025-13" width="483" height="242" /></a></p>
<p>另外，如果源的返回值中存在Cache-control，而Object Caching又选择了Customize, 这种情况下返回的内容肯定会在CloudFront边缘节点中被缓存。但CloudFront会使用哪个值作为TTL呢？ 这个在CloudFront 文档中有详细的描述， 详见： <a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html" target="_blank" rel="noopener noreferrer">http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html</a></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/amazon-cloudfront%e5%b8%b8%e8%a7%81%e9%94%99%e8%af%af%e9%85%8d%e7%bd%ae%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/">Amazon CloudFront常见错误配置及解决方法</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/amazon-cloudfront%e5%b8%b8%e8%a7%81%e9%94%99%e8%af%af%e9%85%8d%e7%bd%ae%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过AWS Config 管理AWS服务配置</title>
		<link>https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/</link>
		<comments>https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/#comments</comments>
		<pubDate>Fri, 23 Mar 2018 01:54:53 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[aws服务器代维]]></category>
		<category><![CDATA[linode云服务器迁移]]></category>
		<category><![CDATA[Linux服务器维护]]></category>
		<category><![CDATA[linux维护]]></category>
		<category><![CDATA[云服务解决方案]]></category>
		<category><![CDATA[企业上云服务咨询]]></category>
		<category><![CDATA[服务器外包]]></category>
		<category><![CDATA[服务器维护]]></category>
		<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[香港服务器代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3509</guid>
		<description><![CDATA[<p>为更好遵从各行业的合规要求，构建安全的IT环境，企业的安全团队一般都会在明确安全／管理边界的前提下，选择相关安 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/">通过AWS Config 管理AWS服务配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>为更好遵从各行业的合规要求，构建安全的IT环境，企业的安全团队一般都会在明确安全／管理边界的前提下，选择相关安全框架，用对应的风险评估方法梳理出符合自身业务特点的安全模型。根据安全模型，通常也会用各种文档标准化抽象为各种管理策略，例如可能包含以下常见的内容：</p>
<ul>
<li>用户权限策略</li>
<li>访问控制策略</li>
<li>服务器安全策略</li>
<li>应用接入策略</li>
<li>网络分区策略</li>
<li>数据传输策略</li>
<li>数据存储策略</li>
<li>备份归档策略</li>
<li>日志记录策略</li>
<li>审计管理策略</li>
</ul>
<p>……….</p>
<p>在实际的应用场景中，标准策略可能会因为业务的变化或管理方式的变化动态调整，如何持续评估和审核在AWS云端的资源配置的合规性是否与企业规划一致？如何帮助用户在云端更好的实现变更管理，安全分析甚至自动修正不合规的配置 ？这种场景下，可以考虑用AWS Config 服务来帮忙。</p>
<h3>一、AWS config 是什么</h3>
<p>AWS Config 是一项托管服务,借助 Config您可以盘点AWS 资源、查看配置更改以及 AWS 资源之间的关系并深入探究详细的资源配置历史记录。使用 Config，还能通过自定义规则来定义所需的资源配置、内部最佳实践和指南，并依据这些规则评估您记录的配置。</p>
<p>AWS Config的主要应用功能：</p>
<ul>
<li>评估您 AWS 资源配置是否具备所需设置。</li>
<li>获得与您的 AWS 账户关联的受支持资源的当前配置快照。</li>
<li>检索您的账户中的一个或多个资源配置。</li>
<li>检索一个或多个资源的历史配置。</li>
<li>在资源被创建、修改或删除时接收通知。</li>
<li>查看不同资源之间的关系。例如，您可能想要找到使用特定安全组的所有资源</li>
</ul>
<p><em>AWS Config工作原理</em></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-1.png" alt="20170613-1" width="1886" height="856" /></a></p>
<p>更多AWS Config的信息可以参考<a href="https://aws.amazon.com/cn/config/">https://aws.amazon.com/cn/config/</a></p>
<h3>二、 AWS config 配置测试</h3>
<p>为了更好了解AWS Config的工作过程，以下 将以AWS安全组的配置监控为例做一个简短测试 。</p>
<h4>1. 测试场景：</h4>
<ul>
<li>一个为web服务器配置的安全组，该安全组策略只允许对Internet开放HTTP和HTTPS两个端口；</li>
<li>配置AWS Config 规则，当该安全组配置规则中添加了其他端口时，AWS Config 自动记录，并触发修复机制自动删除新加入的不合规的配置。</li>
</ul>
<h4>2. 配置过程</h4>
<p><strong>a. 权限准备。</strong>为成功配置AWS Config 规则，需要创建IAM 角色，授予 AWS Config 权限，使其可以访问Amazon S3 存储桶、Amazon SNS 主题，获取受支持的 AWS 资源的配置详细信息。IAM内置了一个AWSConfigRole的托管策略 。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-2.png" alt="20170613-2" width="1334" height="362" /></a></p>
<p>新建一个IAM Role 命名为awsconfigrole, 可以直接附加该策略：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-3.png" alt="20170613-3" width="2330" height="1214" /></a>另外，测试过程中将使用lambda自动对安全组执行安全组操作，cloudwatch log操作，也需要建立好对应的IAM role并编辑策略赋予对应的权限,在测试中该IAM role为：awsoncifgec2security</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-4.png" alt="20170613-4" width="1390" height="1398" /></a></p>
<p><code>{</code></p>
<p><code>    "Version": "2012-10-17",</code></p>
<p><code>    "Statement": [</code></p>
<p><code>        {</code></p>
<p><code>            "Effect": "Allow",</code></p>
<p><code>            "Action": [</code></p>
<p><code>                "logs:CreateLogGroup",</code></p>
<p><code>                "logs:CreateLogStream",</code></p>
<p><code>                "logs:PutLogEvents"</code></p>
<p><code>            ],</code></p>
<p><code>            "Resource": "arn:aws:logs:*:*:*"</code></p>
<p><code>        },</code></p>
<p><code>        {</code></p>
<p><code>            "Effect": "Allow",</code></p>
<p><code>            "Action": [</code></p>
<p><code>                "config:PutEvaluations",</code></p>
<p><code>                "ec2:DescribeSecurityGroups",</code></p>
<p><code>                "ec2:AuthorizeSecurityGroupIngress",</code></p>
<p><code>                "ec2:RevokeSecurityGroupIngress"</code></p>
<p><code>            ],</code></p>
<p><code>            "Resource": "*"</code></p>
<p><code>        }</code></p>
<p><code>    ]</code></p>
<p><code>}</code></p>
<p><strong>b. 配置AWS Config Setting。</strong>在AWS 控制台，打开 AWS Config ,具体过程可以参考：<a href="http://docs.aws.amazon.com/zh_cn/config/latest/developerguide/gs-console.html">http://docs.aws.amazon.com/zh_cn/config/latest/developerguide/gs-console.html</a></p>
<p>在本测试过程中，我们选择资源类型为SecurityGroup:</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-5.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-5.png" alt="20170613-5" width="2652" height="1186" /></a></p>
<p>在配置过程中，指定一个存储桶保存日志，并指定预先为AWS Config 的IAM Role ,当然也可以在这个步骤选择新建角色：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-6.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-6.png" alt="20170613-6" width="2234" height="1500" /></a></p>
<p>在上述页面中，可以选择是否通过SNS 启用通知将信息流式传输到 Amazon SNS 主题，发送配置历史记录传输、配置快照传输和合规性等通知。</p>
<p>在Resources页面中验证一下，评估的对象是否能正常的筛选出来，本例中我们是对测试的安全组进行查找：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-7.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-7.png" alt="20170613-7" width="1816" height="516" /></a></p>
<p><strong>c. AWS Config 规则配置。</strong>AWS Config提供一些内置的规则，也支持自定义规则创建。在前文中提及测试的背景中需要通过自动机制保证安全组规则符合设定的合规配置，我们将通过lambda完成该步骤。在创建规则的过程中，按向导设置规则名称，点击新建lambda功能按钮：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-8.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-8.png" alt="20170613-8" width="1924" height="478" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-9.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-9.png" alt="20170613-9" width="2280" height="960" /></a></p>
<p>在lambda创建过程中，选择blank blueprint 并为函数指定runtime为python2.7 ，将准备好的代码保存在s3（可以在github中找到相关代码参考，比如<a href="https://github.com/awslabs/aws-config-rules">https://github.com/awslabs/aws-config-rules</a> ）并上传。</p>
<p>Lambda函数主要完成以下工作：</p>
<ul>
<li>lambda函数中按照要求只开启tcp 80 和tcp 443端口；</li>
<li>如果有其他端口添加到配置规则中将被删除，最终保证安全组的配置规则条目中只有tcp80和tcp443相关的配置；</li>
<li>相关的操作将记录在cloudwath logs中。</li>
</ul>
<p>在创建过程中，为lambda指定对应的IAM Role.</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-10.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-10.png" alt="20170613-10" width="2416" height="1592" /></a></p>
<p>lambda创建完成后，需要在AWS Config 规则页面中指定Lambda ARN,  配置触发器。本例中,当安全组配置发生变化时即触发对安全组的评估，也可以配置按照时间周期的评估对象。 另外，为了详细记录评估信息，为规则启用debug级别的记录。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-11.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-11.png" alt="20170613-11" width="2100" height="1590" /></a></p>
<p>&nbsp;</p>
<p>AWS config  规则后，当前的安全组配置将自动被评估。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-12.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-12.png" alt="20170613-12" width="2822" height="452" /></a></p>
<p><strong>d. 验证。</strong>为触发AWS Config 对安全组的评估， 我们在对应的安全组规则中除tcp 80 和tpc443，额外新添加tcp445 端口。在cloudwathc logs中创建了logs group,可以进行相关日志查看：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-13.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-13.png" alt="20170613-13" width="2076" height="460" /></a></p>
<p>在日志中可以清楚看到对安全组有revoking的行为，操作的端口正是额外添加的tcp445 ， 并且最终将安全组只开启tcp80 和tcp443 端口。</p>
<h3>三、进一步讨论</h3>
<p>在上述测试过程中，大致可以了解AWS Config的工作机制和配置流程，下面进一步对一些场景的应用场景做进一步说明。</p>
<h4>资产发现</h4>
<p>AWS Config 不仅会发现账户中的资源、记录其当前配置并捕获对这些配置所做的任何更改，Config 还会保留已删除资源的详细配置信息。所有资源及其配置属性的完全快照在您的账户中提供完整的资源库。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-14.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-14.png" alt="20170613-14" width="1888" height="1072" /></a></p>
<h4>持续安全分析</h4>
<p>AWS Config 提供的数据可使您持续监控您的资源配置情况，并评估这些配置是否具有潜在的安全弱点。对您的资源配置进行更改，将触发系统发送 Amazon Simple Notification Service (SNS) 通知，这些通知可发送给您的安全团队，以便他们查看通知并采取相应措施。发生潜在的安全事件后，您可以使用 Config 查看资源的配置历史记录并检查您的安全状况。</p>
<p>正如测试过程中展示，企业IT团队只需明确制定相关的策略，配置AWS Config规则，AWS Config提供了托管规则和自定义规则，能满足各种就能持续监控相关的安全标准是否合规。借助 AWS Config，利用 AWS Lambda 中的自定义规则将合规性要求编制成代码，这些代码会定义资源配置内部最佳实践和指南。您可以使用 Config 自动评估您的资源配置和资源更改，从而确保整个 AWS 基础设施实现持续合规性和自主监管。通过这个机制，为企业的安全自动化提供了一个可行选项。</p>
<h4>变更管理</h4>
<p>在创建、更新或删除资源时，AWS Config 会将这些配置更改流式传输到 Amazon Simple Notification Service (SNS)，如此便会收到所有配置更改通知。根据通知机制也可以考虑引入基于事件触发的机制，进一步集成各个管理环节。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-15.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-15.png" alt="20170613-15" width="1352" height="480" /></a></p>
<p>在AWS Config按照既定规则完成评估后，可以在规则的详细信息中查看到具体的变更事件记录：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-16.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-16.png" alt="20170613-16" width="2136" height="448" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-17.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-17.png" alt="20170613-17" width="1132" height="760" /></a></p>
<h4>审计</h4>
<p>AWS CloudTrail 将记录账户上的用户 API 活动，将保存有关 API 操作的完整详细信息，如发起人的身份、该 API 调用的时间、请求参数和 AWS 服务返 。AWS Config 与AWS CloudTrail 集成 ,回答“谁进行了修改此资源的 API 调用？”例如下图， 使用集成的 AWS CloudTrail 信息，可以发现是哪个用户错误配置了安全组。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-18.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-18.png" alt="20170613-18" width="2230" height="690" /></a></p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-19.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2018/03/20170613-19.png" alt="20170613-19" width="3068" height="846" /></a></p>
<p>综合上述讨论，企业内部资产管理团队可以清楚明确当前在AWS云端的数字资产，安全团队可以将严格制定的安全体系持续的在云端自动化运行，任何相关的变更和配置管理都能详尽的记录，方便后续的审计。</p>
<p>更多关于AWS Config的一些常见问题可参考：<a href="https://aws.amazon.com/cn/config/faq/">https://aws.amazon.com/cn/config/faq/</a></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/">通过AWS Config 管理AWS服务配置</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%80%9a%e8%bf%87aws-config-%e7%ae%a1%e7%90%86aws%e6%9c%8d%e5%8a%a1%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AWS节约成本之购买AMAZON预留实例(RESERVED INSTANCE)</title>
		<link>https://www.fuwuqiok.com/aws%e8%8a%82%e7%ba%a6%e6%88%90%e6%9c%ac%e4%b9%8b%e8%b4%ad%e4%b9%b0amazon%e9%a2%84%e7%95%99%e5%ae%9e%e4%be%8breserved-instance/</link>
		<comments>https://www.fuwuqiok.com/aws%e8%8a%82%e7%ba%a6%e6%88%90%e6%9c%ac%e4%b9%8b%e8%b4%ad%e4%b9%b0amazon%e9%a2%84%e7%95%99%e5%ae%9e%e4%be%8breserved-instance/#comments</comments>
		<pubDate>Wed, 06 Dec 2017 02:34:27 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器运维]]></category>
		<category><![CDATA[AWS节约成本之购买AMAZON预留实例(RESERVED INSTANCE)]]></category>
		<category><![CDATA[linux服务器代维服务收费及详细]]></category>
		<category><![CDATA[云主机代维]]></category>
		<category><![CDATA[性能调优]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[服务器安全代维]]></category>
		<category><![CDATA[服务监控]]></category>
		<category><![CDATA[系统部署]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3359</guid>
		<description><![CDATA[<p>&#160; 购买Amazon预留实例(Reserved Instance)时，其实无需停止现在使用的EC2及 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e8%8a%82%e7%ba%a6%e6%88%90%e6%9c%ac%e4%b9%8b%e8%b4%ad%e4%b9%b0amazon%e9%a2%84%e7%95%99%e5%ae%9e%e4%be%8breserved-instance/">AWS节约成本之购买AMAZON预留实例(RESERVED INSTANCE)</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<div class="entry-text clearfix"><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Reserved-Instance.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Reserved-Instance.png" alt="Reserved-Instance" width="770" height="500" /></a></p>
<div class="shortcode-br clearfix"></div>
<p>购买Amazon预留实例(Reserved Instance)时，其实无需停止现在使用的EC2及RDS等，购买Reserved Instance就跟购买折扣券一样,是对现在使用的EC2及RDS费用打折，长期使用AWS服务时，可以购买Reserved Instance节省成本。</p>
<h2>购买Reserved Instance的流程</h2>
<p>1.登录到AWS管理页面以后，点击EC2。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Service_Menu.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Service_Menu.png" alt="Service_Menu" width="1024" height="581" /></a>2.点击「Reserved Instances」以后，「Purchase Reserved Instances」。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Purchase_Reserved_Instance.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Purchase_Reserved_Instance.png" alt="Purchase_Reserved_Instance" width="1028" height="609" /></a>3.进行搜索。</p>
<p>进行搜索之前需要，选择以下信息。需要谨慎的选择。</p>
<ul>
<li>Platform：Linux/Unix</li>
<li>Instance Type：m3.xlarge</li>
<li>Availability Zone:ap-northeast-1a</li>
<li>Term:1month – 12month</li>
<li>Tenancy:Default</li>
<li>Offering Type:Heavy Utilization</li>
</ul>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Search.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Search.png" alt="Search" width="814" height="550" /></a>4.加入购物车。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Add_to_Cart.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/Add_to_Cart.png" alt="Add_to_Cart" width="817" height="549" /></a>5.选择完购买的Reserved Instance以后,点击购买。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/EC2_Purchase.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/EC2_Purchase.png" alt="EC2_Purchase" width="818" height="555" /></a>信用卡结算以后，购买Reserved Instance的工作就结束了。</p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/aws%e8%8a%82%e7%ba%a6%e6%88%90%e6%9c%ac%e4%b9%8b%e8%b4%ad%e4%b9%b0amazon%e9%a2%84%e7%95%99%e5%ae%9e%e4%be%8breserved-instance/">AWS节约成本之购买AMAZON预留实例(RESERVED INSTANCE)</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/aws%e8%8a%82%e7%ba%a6%e6%88%90%e6%9c%ac%e4%b9%8b%e8%b4%ad%e4%b9%b0amazon%e9%a2%84%e7%95%99%e5%ae%9e%e4%be%8breserved-instance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/#comments</comments>
		<pubDate>Tue, 05 Dec 2017 08:56:21 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Amazon AWS]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[AWS云主机托管]]></category>
		<category><![CDATA[AWS云服务解决方案]]></category>
		<category><![CDATA[AWS代付]]></category>
		<category><![CDATA[AWS服务咨询]]></category>
		<category><![CDATA[AWS服务器迁移]]></category>
		<category><![CDATA[AWS电话告警]]></category>
		<category><![CDATA[AWS解决方案提供商！]]></category>
		<category><![CDATA[AWS运维支持]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[企业上AWS云]]></category>
		<category><![CDATA[使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案]]></category>
		<category><![CDATA[海外服务器代维]]></category>
		<category><![CDATA[澳洲华人服务器代维]]></category>
		<category><![CDATA[香港主机代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3304</guid>
		<description><![CDATA[<p>1. 前述 通过本文章，您将了解如何通过AWS CodePipeline，AWS CodeBuild，AWS  [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/">使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h3>1. 前述</h3>
<p>通过本文章，您将了解如何通过AWS CodePipeline，AWS CodeBuild，AWS CloudFormation 来实现基于Amazon ECS的持续集成持续部署方案。</p>
<p>开发人员在GitHub中提交的新版本代码，会自动触发代码获取，打包镜像，上传镜像仓库，更新新版本容器服务，注册到负载均衡器等操作。</p>
<p>方案中会涉及使用如下组件：</p>
<p>GitHub：示例使用的源，一个提交到GitHub上的PHP示例网站。AWS CodePipeline支持GitHub， AWS CodeCommit服务，或者S3作为源。此次实例使用的Demo软件工程可以从以下链接Fork：</p>
<p><a href="https://github.com/awslabs/ecs-demo-php-simple-app">https://github.com/awslabs/ecs-demo-php-simple-app</a></p>
<p>Docker：作为发布服务使用的容器。演示方案的Build阶段会使用AWS CodeBuild托管的ubuntu／docker 1.12.1基础镜像。</p>
<p>Amazon EC2：作为ECS的容器宿主机集群。</p>
<p>Amazon VPC：服务所在的网络。</p>
<p>Amazon ECS：AWS托管的容器编排服务。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/Welcome.html">http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/Welcome.html</a></p>
<p>Amazon ECR：AWS 托管的容器镜像仓库。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/AmazonECR/latest/userguide/what-is-ecr.html">http://docs.aws.amazon.com/zh_cn/AmazonECR/latest/userguide/what-is-ecr.html</a></p>
<p>AWS CodePipeline：AWS 托管的持续集成持续交付服务，可以快速可靠的更新应用程序和服务，集成支持GitHub，Jenkins等主流开源工具。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/welcome.html">http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/welcome.html</a></p>
<p>AWS CodeBuild：AWS 托管的构建服务，用于打包代码生成可部署的软件包。文档链接 <a href="http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/welcome.html">http://docs.aws.amazon.com/zh_cn/codebuild/latest/userguide/welcome.html</a></p>
<p>AWS CloudFormation：批量创建和管理AWS资源的自动化脚本。文档链接<a href="http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/Welcome.html">http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/Welcome.html</a></p>
<h3>2.方案架构</h3>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/1-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/1-2.png" alt="1-2" width="673" height="357" /></a></p>
<p>流程如下：</p>
<ol>
<li>开发者将一个新版本的代码工程提交到GitHub</li>
<li>Pipeline的Source阶段，检测到指定GitHub的repo有新版本的更新，从GitHub上拉取代码工程，开启已设定好的CICD Pipeline</li>
<li>Pipeline的Build阶段，AWS CodeBuild将新版本的代码工程打包为Docker镜像</li>
<li>AWS CodeBuild将打包好的镜像推送到Amazon ECR</li>
<li>Pipeline的Deploy阶段，AWS CodePipeline触发AWS CloudFormation，其定义了Amazon ECS的Task definition和service</li>
<li>AWS CloudFormation创建新版本的Task definition关联到新版本的Docker镜像，并更新Service</li>
<li>Amazon ECS从Amazon ECR中取到新版本的Docker镜像，并运行来替换旧Task以完成服务的更新部署</li>
</ol>
<h3>3. 搭建</h3>
<p>搭建部分分为以下几个步骤：基础设施，与CICD Pipeline的搭建。</p>
<p><strong>3.1   基础设施部分的搭建</strong></p>
<p>这里需要准备好网络，负载均衡器，S3以及运行ECS所需要的宿主机集群。</p>
<p>3.1.1 网络搭建</p>
<p>创建VPC，子网，Internet Gateway，路由表。将Internet Gateway Attach到VPC上，路由表配置0.0.0.0/0指向Internet Gateway，并关联子网。</p>
<p>之后的EC2宿主机集群，负载均衡器等都使用在这个网络里。</p>
<p>3.1.2 负载均衡器</p>
<p>创建ALB应用负载均衡器，监听80端口</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/2-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/2-2.png" alt="2-2" width="2528" height="410" /></a></p>
<p>选择对应的子网</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/3-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/3-1.png" alt="3-1" width="2368" height="560" /></a></p>
<p>新建安全组，端口80，并新建目标组</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/4.png" alt="4" width="1194" height="638" /></a></p>
<p>注册目标此时不选择，ECS创建服务时会注册集群和对应端口进来。</p>
<p>下一步审核后创建。</p>
<p>3.1.3 ECS宿主机集群</p>
<p>在ECS的界面下，创建集群</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/5-3.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/5-3.png" alt="5-3" width="2516" height="358" /></a></p>
<p>实例配置保持默认或根据情况自行选择，示例中保持默认。</p>
<p>联网配置，选择创建好的VPC，子网，创建Role允许宿主机上的ECS代理调用ECS服务的API。</p>
<p>创建后画面下面会显示集群信息</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/6-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/6-1.png" alt="6-1" width="1990" height="538" /></a></p>
<p>集群一览会显示</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/7.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/7.jpg" alt="7" width="2022" height="332" /></a></p>
<p>修改ECS宿主机集群的安全组，inbound源设置为建好的应用负载均衡器的安全组ID</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/8-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/8-1.png" alt="8-1" width="2330" height="734" /></a></p>
<p>3.1.4 ECR镜像仓库创建</p>
<p>创建一个用于Build阶段上传存放软件工程Docker镜像的镜像仓库</p>
<p>ECS界面下，创建存储库，创建好后如下</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/9-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/9-1.png" alt="9-1" width="1724" height="622" /></a></p>
<p>3.1.5 S3桶创建</p>
<p>创建一个S3桶用来存放Deploy阶段CloudFormation使用的脚本模版，创建桶时选择和以上服务同一Region，并且打开桶的版本控制。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/10-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/10-1.png" alt="10-1" width="1360" height="1124" /></a></p>
<p>将CloudFormation模版压缩zip后上传到桶中。</p>
<p>示例中将模版文件service.yaml放在templates文件夹后压缩为templates.zip。</p>
<p>service.yaml如下，注意缩进</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java">Parameters<span class="token operator">:</span>

  Tag<span class="token operator">:</span>

    Type<span class="token operator">:</span> String

    Default<span class="token operator">:</span> latest


  DesiredCount<span class="token operator">:</span>

    Type<span class="token operator">:</span> Number

    Default<span class="token operator">:</span> <span class="token number">0</span>


  TargetGroup<span class="token operator">:</span>

    Type<span class="token operator">:</span> String


  Cluster<span class="token operator">:</span>

    Type<span class="token operator">:</span> String


  Repository<span class="token operator">:</span>

    Type<span class="token operator">:</span> String


Resources<span class="token operator">:</span>

  ECSServiceRole<span class="token operator">:</span>

    Type<span class="token operator">:</span> AWS<span class="token operator">:</span><span class="token operator">:</span>IAM<span class="token operator">:</span><span class="token operator">:</span>Role

    Properties<span class="token operator">:</span>

      Path<span class="token operator">:</span> <span class="token operator">/</span>

      AssumeRolePolicyDocument<span class="token operator">:</span> <span class="token operator">|</span>

        <span class="token punctuation">{</span>

            <span class="token string">"Statement"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>

                <span class="token string">"Effect"</span><span class="token operator">:</span> <span class="token string">"Allow"</span><span class="token punctuation">,</span>

                <span class="token string">"Principal"</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">"Service"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"ecs.amazonaws.com"</span> <span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span>

                <span class="token string">"Action"</span><span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"sts:AssumeRole"</span> <span class="token punctuation">]</span>

            <span class="token punctuation">}</span><span class="token punctuation">]</span>

        <span class="token punctuation">}</span>

      Policies<span class="token operator">:</span>

        <span class="token operator">-</span> PolicyName<span class="token operator">:</span> root

          PolicyDocument<span class="token operator">:</span>

            Version<span class="token operator">:</span> <span class="token number">2012</span><span class="token operator">-</span><span class="token number">10</span><span class="token operator">-</span><span class="token number">17</span>

            Statement<span class="token operator">:</span>

              <span class="token operator">-</span> Resource<span class="token operator">:</span> <span class="token string">"*"</span>

                Effect<span class="token operator">:</span> Allow

                Action<span class="token operator">:</span>

                  <span class="token operator">-</span> ec2<span class="token operator">:</span><span class="token operator">*</span>

                  <span class="token operator">-</span> elasticloadbalancing<span class="token operator">:</span><span class="token operator">*</span>


  Service<span class="token operator">:</span>

    Type<span class="token operator">:</span> AWS<span class="token operator">:</span><span class="token operator">:</span>ECS<span class="token operator">:</span><span class="token operator">:</span>Service

    Properties<span class="token operator">:</span>

      Cluster<span class="token operator">:</span> <span class="token operator">!</span>Ref Cluster

      Role<span class="token operator">:</span> <span class="token operator">!</span>Ref ECSServiceRole

      DesiredCount<span class="token operator">:</span> <span class="token operator">!</span>Ref DesiredCount

      TaskDefinition<span class="token operator">:</span> <span class="token operator">!</span>Ref TaskDefinition

      LoadBalancers<span class="token operator">:</span>

        <span class="token operator">-</span> ContainerName<span class="token operator">:</span> simple<span class="token operator">-</span>app

          ContainerPort<span class="token operator">:</span> <span class="token number">80</span>

          TargetGroupArn<span class="token operator">:</span> <span class="token operator">!</span>Ref TargetGroup


  TaskDefinition<span class="token operator">:</span>

    Type<span class="token operator">:</span> AWS<span class="token operator">:</span><span class="token operator">:</span>ECS<span class="token operator">:</span><span class="token operator">:</span>TaskDefinition

    Properties<span class="token operator">:</span>

      Family<span class="token operator">:</span> <span class="token operator">!</span>Sub $<span class="token punctuation">{</span>AWS<span class="token operator">:</span><span class="token operator">:</span>StackName<span class="token punctuation">}</span><span class="token operator">-</span>simple<span class="token operator">-</span>app

      ContainerDefinitions<span class="token operator">:</span>

        <span class="token operator">-</span> Name<span class="token operator">:</span> simple<span class="token operator">-</span>app

          Image<span class="token operator">:</span> <span class="token operator">!</span>Sub $<span class="token punctuation">{</span>AWS<span class="token operator">:</span><span class="token operator">:</span>AccountId<span class="token punctuation">}</span><span class="token punctuation">.</span>dkr<span class="token punctuation">.</span>ecr<span class="token punctuation">.</span>$<span class="token punctuation">{</span>AWS<span class="token operator">:</span><span class="token operator">:</span>Region<span class="token punctuation">}</span><span class="token punctuation">.</span>amazonaws<span class="token punctuation">.</span>com<span class="token operator">/</span>$<span class="token punctuation">{</span>Repository<span class="token punctuation">}</span><span class="token operator">:</span>$<span class="token punctuation">{</span>Tag<span class="token punctuation">}</span>

          EntryPoint<span class="token operator">:</span>

            <span class="token operator">-</span> <span class="token operator">/</span>usr<span class="token operator">/</span>sbin<span class="token operator">/</span>apache2

            <span class="token operator">-</span> <span class="token operator">-</span>D

            <span class="token operator">-</span> FOREGROUND

          Essential<span class="token operator">:</span> <span class="token boolean">true</span>

          Memory<span class="token operator">:</span> <span class="token number">128</span>

          MountPoints<span class="token operator">:</span>

            <span class="token operator">-</span> SourceVolume<span class="token operator">:</span> my<span class="token operator">-</span>vol

              ContainerPath<span class="token operator">:</span> <span class="token operator">/</span>var<span class="token operator">/</span>www<span class="token operator">/</span>my<span class="token operator">-</span>vol

          PortMappings<span class="token operator">:</span>

            <span class="token operator">-</span> ContainerPort<span class="token operator">:</span> <span class="token number">80</span>

          Environment<span class="token operator">:</span>

            <span class="token operator">-</span> Name<span class="token operator">:</span> Tag

              Value<span class="token operator">:</span> <span class="token operator">!</span>Ref Tag

        <span class="token operator">-</span> Name<span class="token operator">:</span> busybox

          Image<span class="token operator">:</span> busybox

          EntryPoint<span class="token operator">:</span>

            <span class="token operator">-</span> sh

            <span class="token operator">-</span> <span class="token operator">-</span>c

          Essential<span class="token operator">:</span> <span class="token boolean">false</span>

          Memory<span class="token operator">:</span> <span class="token number">128</span>

          VolumesFrom<span class="token operator">:</span>

            <span class="token operator">-</span> SourceContainer<span class="token operator">:</span> simple<span class="token operator">-</span>app

          Command<span class="token operator">:</span>

            <span class="token operator">-</span> <span class="token operator">/</span>bin<span class="token operator">/</span>sh <span class="token operator">-</span>c <span class="token string">"while true; do /bin/date &gt; /var/www/my-vol/date; sleep 1; done"</span>

      Volumes<span class="token operator">:</span>

        <span class="token operator">-</span> Name<span class="token operator">:</span> my<span class="token operator">-</span>vol</code></pre>
</div>
<p>到此基础设施部分的搭建工作结束。</p>
<p><strong>3.2   Pipeline的搭建</strong></p>
<p>分为Source，Build以及Deploy三阶段：</p>
<p>Source阶段设置GitHub上的软件工程位置，并设置Deploy阶段会使用的CloudFormation脚本模版来更新ECS服务，</p>
<p>Build阶段使用AWS CodeBuild来打包软件工程到Docker镜像并上传到ECR，</p>
<p>Deploy阶段使用Source阶段引入的CloudFormation脚本，找到对应的宿主机集群，负载均衡器，以及上传到ECR的Docker镜像等对象，更新服务。</p>
<p>AWS CodePipeline创建后的展示图是这样的，串起了整个CICD流程</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/11-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/11-2.png" alt="11-2" width="842" height="1420" /></a></p>
<p>在AWS CodePipeline界面点击创建管道Pipeline，可以看到画面左侧一个基本流程，从源，到生成Build，到部署Deploy，到角色等配置。实际应用中用户可以随实际需要，或随着CICD流程的由简入繁在创建后编辑加入新的阶段或操作。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/12-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/12-1.png" alt="12-1" width="2112" height="812" /></a></p>
<p>点击下一步。</p>
<p>3.2.1 Source阶段配置</p>
<p>源提供商下拉菜单选择GitHub，</p>
<p>点击连接到GitHub来授权访问权，来允许AWS CodePipeline从GitHub上获取软件工程源内容，认证后选择GitHub上软件工程所在位置和分支</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/13-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/13-2.png" alt="13-2" width="2104" height="1160" /></a></p>
<p>此次实例使用的Demo软件工程可以从以下链接Fork：</p>
<p><a href="https://github.com/awslabs/ecs-demo-php-simple-app">https://github.com/awslabs/ecs-demo-php-simple-app</a></p>
<p>点击下一步。</p>
<p>3.2.2 Build阶段配置</p>
<p>AWS CodePipeline在Build阶段支持包括AWS CodeBuild，Jenkins在内的引擎，此方案选用AWS 托管的CodeBuild服务</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/14-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/14-2.png" alt="14-2" width="2160" height="684" /></a></p>
<p>选择新建构建项目</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/15-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/15-1.png" alt="15-1" width="1420" height="750" /></a></p>
<p>选择AWS CodeBuild托管的镜像，支持Ubuntu系统，运行时支持包括Java，Python，Go语言，Node.js，Docker在内的众多选择，此次方案使用Docker。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/16-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/16-2.png" alt="16-2" width="1478" height="904" /></a></p>
<p>构建规范这里选择使用buildspec.yml，里面预定了AWS CodeBuild在Build生命周期中要执行的动作，如login到ECR，打包Docker镜像，给Docker镜像打tag，上传Docker镜像到已login的ECR镜像仓库。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/55.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/55.png" alt="55" width="1232" height="150" /></a></p>
<p>Buildspec.yml放在GitHub软件工程源代码目录中，如果复制粘贴的话注意yaml文件的缩进</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java">version<span class="token operator">:</span> <span class="token number">0.2</span>

phases<span class="token operator">:</span>

  pre_build<span class="token operator">:</span>

    commands<span class="token operator">:</span>

      <span class="token operator">-</span> $<span class="token punctuation">(</span>aws ecr get<span class="token operator">-</span>login<span class="token punctuation">)</span>

      <span class="token operator">-</span> TAG<span class="token operator">=</span><span class="token string">"$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | head -c 8)"</span>

  build<span class="token operator">:</span>

    commands<span class="token operator">:</span>

<span class="token operator">-</span>    docker build <span class="token operator">--</span>tag <span class="token string">"替换创建好的ECR镜像仓库的URI:${TAG}"</span> <span class="token punctuation">.</span>

  post_build<span class="token operator">:</span>

    commands<span class="token operator">:</span>

      <span class="token operator">-</span> docker push <span class="token string">"替换创建好的ECR镜像仓库的URI:${TAG}"</span>

      <span class="token operator">-</span> printf <span class="token string">'{"tag":"%s"}'</span> $TAG <span class="token operator">&gt;</span> build<span class="token punctuation">.</span>json

artifacts<span class="token operator">:</span>

  files<span class="token operator">:</span> build<span class="token punctuation">.</span>json</code></pre>
</div>
<p>选择Role</p>
<p>新建一个Role，这个Role允许AWS CodeBuild来调用相关的AWS服务，此方案中需要调用包括S3，ECR，CloudWatch在内的服务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/17-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/17-2.png" alt="17-2" width="1390" height="1192" /></a></p>
<p><strong>*默认创建的Role不具备对ECR的权限，需要在保存构建项目后，到IAM找到新创建的Role，编辑添加对ECR的权限否则后面Pipeline执行到Build时会报错。</strong></p>
<p>保存构建项目。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/18.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/18.png" alt="18" width="1372" height="836" /></a></p>
<p>点击下一步。</p>
<p>3.2.3 Deploy</p>
<p>AWS CodePipeline部署阶段支持包括AWS CloudFormation，AWS CodeDeploy，AWS Elastic Beanstalk在内的服务提供商，此方案选用AWS CloudFormation来部署ECS容器服务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/19-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/19-2.png" alt="19-2" width="1474" height="490" /></a></p>
<p>这里暂时选择无部署，等Pipeline创建好后，编辑引入Deploy的CloudFormation模版源，再进行配置。</p>
<p>点击下一步。</p>
<p>3.2.4 角色</p>
<p>配置AWS CodePipeline对AWS服务的调用权限，包括S3，AWS CodeBuild，AWS CloudFormation，IAM等。点击创建角色到IAM界面选择相对应的策略创建。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/20-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/20-2.png" alt="20-2" width="1420" height="594" /></a></p>
<p>创建好后画面回到Pipeline，IAM创建好的Role已经显示在里面。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/21-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/21-2.png" alt="21-2" width="1374" height="584" /></a></p>
<p>点击下一步。</p>
<p>3.2.5 审核后创建管道。</p>
<p>管道创建好后会自动运行，现有的从GitHub软件工程源代码抓取工程，打包Docker镜像并推送到ECR上。界面上显示如图</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/22.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/22.png" alt="22" width="714" height="1120" /></a></p>
<p>3.2.6 添加Deploy阶段CloudFormation需要的模版源以及配置Deploy阶段</p>
<p>点击编辑，点击Source阶段右上角的画笔图标</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/23-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/23-1.png" alt="23-1" width="1422" height="1202" /></a></p>
<p>可以看到AWS CodePipeline的编辑界面在南北纵向和东西横向都可以添加</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/24-2.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/24-2.png" alt="24-2" width="1438" height="1098" /></a></p>
<p>在GitHub这个Source右侧，点击添加操作，选择源，操作名称Template，选择S3，输入创建好的S3桶的地址</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/25-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/25-1.png" alt="25-1" width="2528" height="1258" /></a></p>
<p>画面往下拉，注意在输出项目这里，输入Template。</p>
<p>Pipeline中各阶段的传递需要制定南北向的输入输出，即Source阶段S3源的输出Template，在Deploy阶段用输入Template来衔接。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/26-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/26-1.png" alt="26-1" width="1240" height="654" /></a></p>
<p>点击更新。</p>
<p>点击Build阶段下面的添加阶段，画面右侧选择部署，选择AWS CloudFormation</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/27-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/27-1.png" alt="27-1" width="2544" height="1300" /></a></p>
<p>操作模式选择创建或更新堆栈，输入创建的堆栈名称，模版这里输入Template::templates/service.yaml，也就是对应的输入是S3源桶中templates.zip里的service.yaml文件。功能选择CAPABILITY_NAMED_IAM。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/28-1.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/28-1.png" alt="28-1" width="1268" height="1156" /></a></p>
<p>同样需要创建一个Role，允许AWS CloudFormation调用包括IAM，ECS，ECR在内的AWS服务。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/29.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/29.png" alt="29" width="2134" height="556" /></a></p>
<p>在IAM界面创建好后选择Role。</p>
<p>高级这里点开</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/30.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/30.png" alt="30" width="1224" height="1212" /></a></p>
<p>在参数覆盖这里输入CloudFormation需要传入的参数，其中的固定参数也可以在S3的service.yaml中直接定义。</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java"><span class="token punctuation">{</span>

  <span class="token string">"Tag"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">"Fn::GetParam"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"MyAppBuild"</span><span class="token punctuation">,</span> <span class="token string">"build.json"</span><span class="token punctuation">,</span> <span class="token string">"tag"</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>

  <span class="token string">"DesiredCount"</span><span class="token operator">:</span> <span class="token string">"2"</span><span class="token punctuation">,</span>

  <span class="token string">"Cluster"</span><span class="token operator">:</span> <span class="token string">"CICD-DEMO-CLUSTER-01"</span><span class="token punctuation">,</span>

  <span class="token string">"TargetGroup"</span><span class="token operator">:</span> <span class="token string">"arn:aws:elasticloadbalancing:us-east-2:305890642658:targetgroup/CICD-DEMO-TG-01/b7649674ee8ab97b"</span><span class="token punctuation">,</span>

  <span class="token string">"Repository"</span><span class="token operator">:</span> <span class="token string">"cicd-demo-ecr-01"</span>

<span class="token punctuation">}</span></code></pre>
</div>
<p>Tag是Build阶段传出的Docker镜像Tag使用的值，传入CloudFormation中用于建立Task Definition的Container时从ECR拉取对应版本的Docker镜像。</p>
<p>DesiredCount，即想要在ECS的Service中建立的Task的数量。</p>
<p>Cluster，即建立好的宿主机集群的名称。</p>
<p>TargetGroup，即建立好的宿主机集群的应用负载均衡器的ARN。</p>
<p>Repository，即建立好的ECR的镜像仓库名称。</p>
<p>&nbsp;</p>
<p>输入项目这里输入Build阶段和S3模版源的输出。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/31.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/31.png" alt="31" width="1236" height="1124" /></a></p>
<p>点击添加操作。</p>
<p>保存管道更改。</p>
<h3>4. 运行以及模拟版本更新</h3>
<p><strong>4.1   运行</strong></p>
<p>访问负载均衡器的DNS地址来确认目前服务已经运行正常。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/32.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/32.png" alt="32" width="2556" height="1394" /></a></p>
<p><strong>4.2   模拟版本更新</strong></p>
<p>4.2.1 修改代码</p>
<p>在开发本地更新代码，示例中在src/index.php加入一行文字</p>
<div class="hide-language">
<pre class=" language-java" data-language="Java"><code class=" language-java"><span class="token operator">&lt;</span>h1 style<span class="token operator">=</span><span class="token string">"color:FF7F00;"</span><span class="token operator">&gt;</span>Amazon ECS Awesome<span class="token operator">!</span><span class="token operator">&lt;</span><span class="token operator">/</span>h1<span class="token operator">&gt;</span></code> 4.2.2 提交新版本后查看AWS CodePipeline各阶段触发 <a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/33.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/33.png" alt="33" width="814" height="1420" /></a></pre>
</div>
<p>4.2.3 刷新服务来确认新修改的部分已经发布</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2017/12/34.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2017/12/34.png" alt="34" width="2554" height="1378" /></a></p>
<p>&nbsp;</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/">使用AWS CodePipeline，AWS CodeBuild与AWS CloudFormation实现Amazon ECS上的持续集成持续部署解决方案</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8aws-codepipeline%ef%bc%8caws-codebuild%e4%b8%8eaws-cloudformation%e5%ae%9e%e7%8e%b0amazon-ecs%e4%b8%8a%e7%9a%84%e6%8c%81%e7%bb%ad%e9%9b%86%e6%88%90%e6%8c%81%e7%bb%ad%e9%83%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux系统配置多实例php-fpm服务</title>
		<link>https://www.fuwuqiok.com/linux%e7%b3%bb%e7%bb%9f%e9%85%8d%e7%bd%ae%e5%a4%9a%e5%ae%9e%e4%be%8bphp-fpm%e6%9c%8d%e5%8a%a1/</link>
		<comments>https://www.fuwuqiok.com/linux%e7%b3%bb%e7%bb%9f%e9%85%8d%e7%bd%ae%e5%a4%9a%e5%ae%9e%e4%be%8bphp-fpm%e6%9c%8d%e5%8a%a1/#comments</comments>
		<pubDate>Tue, 15 Mar 2016 14:16:01 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[linux代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[Linux系统配置多实例php-fpm服务]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3104</guid>
		<description><![CDATA[<p>Linux系统上目前主要使用Apache和php-fpm来解析运行PHP Web程序。php-fpm仅支持多进 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/linux%e7%b3%bb%e7%bb%9f%e9%85%8d%e7%bd%ae%e5%a4%9a%e5%ae%9e%e4%be%8bphp-fpm%e6%9c%8d%e5%8a%a1/">Linux系统配置多实例php-fpm服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="entry-content">
<p>Linux系统上目前主要使用Apache和php-fpm来解析运行PHP Web程序。php-fpm仅支持多进程，Apache支持多进程和多线程，但绝大多数环境中均为多进程方式，这里也只讨论多进程。</p>
<p>从实践来看，单实例最多可以开到200-300左右的进程，开到500以上就容易出错了。<br />
每个进程占用的内存在5M-15M左右，按平均10M计算，500个进程也只有5G，而现在很多高性能机都是64G甚至128G的内存，这样单实例是无法全面使用上内存资源的。<br />
<span id="more-571"></span><br />
这几年部署过的多实例环境并不多，因为访问量不是十分高的话，是用不上的。<br />
上次配置多实例是一个100万左右PV的Discuz论坛，配置之后是很有效的。现在做的这个是千万PV的静态站，请求主要在点击计数上，在300和500之间调整进程数还是会偶尔的挂掉，机器配置是足够用的，是稳定性的问题。</p>
<p>LNMP或者LNAMP环境的配置这里不做介绍，只讲在LNMP环境的基础上配置多实例的过程。因为我在使用的是LNAMP环境，所以额外编译一份php到/usr/local/php-fpm/，配置文件在/etc/php-fpm/，并在此基础上做的笔记。</p>
<p>先修改三个值：<br />
1，以static方式，也就是固定进程数量运行php-fpm。<br />
2，每个实例建立100个worker进程。（不宜太多，避免不稳定）<br />
3，每个进程执行完200次请求即退出。（避免PHP的内存泄露问题，也就是内存越用越多）</p>
<div class="codecolorer-container text geshi">
<div class="text codecolorer">sed -i &#8216;s#pm = dynamic#pm = static#&#8217; /etc/php-fpm/php-fpm.conf<br />
sed -i &#8216;s#pm.max_children = 5#pm.max_children = 100#&#8217; /etc/php-fpm/php-fpm.conf<br />
sed -i &#8216;s#;pm.max_requests = 500#pm.max_requests = 200#&#8217; /etc/php-fpm/php-fpm.conf</div>
</div>
<p>以下为复制php-fpm.conf和php-fpm服务管理脚本的命令</p>
<div class="codecolorer-container text geshi">
<div class="text codecolorer">cd /etc/php-fpm/<br />
cp php-fpm.conf  php-fpm-1.conf<br />
sed -i &#8216;s#listen = 127.0.0.1:9000#listen = 127.0.0.1:9001#&#8217; php-fpm-1.conf<br />
sed -i &#8216;s#\[www\]#\[php-fpm-pool-1\]#&#8217; php-fpm-1.conf<br />
sed -i &#8216;s#pid = run/php-fpm.pid#pid = run/php-fpm-1.pid#&#8217; php-fpm-1.conf</p>
<p>cd /etc/init.d/<br />
cp php-fpm  php-fpm-1<br />
sed -i &#8216;s#/etc/php-fpm/php-fpm.conf#/etc/php-fpm/php-fpm-1.conf#&#8217; php-fpm-1<br />
sed -i &#8216;s#/var/run/php-fpm.pid#/var/run/php-fpm-1.pid#&#8217; php-fpm-1</p>
<p>service php-fpm-1 restart</p></div>
</div>
<p>执行完上面的命令即复制了一份php-fpm，服务名和配置文件名均为php-fpm-1。<br />
再复制更多份，把上面的命令上的-1替换为-2，listen监听端口往上修改，然后再执行一遍就OK。</p>
<p>然后写一个restart_php_fpm.sh的文件，内容为</p>
<div class="codecolorer-container text geshi">
<div class="text codecolorer">service php-fpm-1 restart<br />
service php-fpm-2 restart<br />
service php-fpm-3 restart<br />
&#8230; &#8230;</div>
</div>
<p>可以用来启动和重启所有的php-fpm实例。关闭用命令killall php-fpm即可。</p>
<p>然后是Nginx配置。<br />
在http段加入：</p>
<div class="codecolorer-container text geshi">
<div class="text codecolorer">upstream php-fpm-pool {<br />
server 127.0.0.1:9001;<br />
server 127.0.0.1:9002;<br />
server 127.0.0.1:9003;<br />
server 127.0.0.1:9004;<br />
server 127.0.0.1:9005;<br />
}</div>
</div>
<p>修改server段：</p>
<div class="codecolorer-container text geshi">
<div class="text codecolorer">location ~ .*\.(php|php5)?$ {<br />
fastcgi_pass php-fpm-pool;<br />
fastcgi_index index.php;<br />
include fastcgi.conf;<br />
}</div>
</div>
<p>配置结束。</p>
<p>多实例在效果上基本等于多台机器的负载均衡，但是我个人还是比较倾向于在单台上配置多实例（累加资源相等的情况下），在一台机器上配置、维护、使用都要方便的多。</p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/linux%e7%b3%bb%e7%bb%9f%e9%85%8d%e7%bd%ae%e5%a4%9a%e5%ae%9e%e4%be%8bphp-fpm%e6%9c%8d%e5%8a%a1/">Linux系统配置多实例php-fpm服务</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/linux%e7%b3%bb%e7%bb%9f%e9%85%8d%e7%bd%ae%e5%a4%9a%e5%ae%9e%e4%be%8bphp-fpm%e6%9c%8d%e5%8a%a1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云VPC配置SNAT</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91vpc%e9%85%8d%e7%bd%aesnat/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91vpc%e9%85%8d%e7%bd%aesnat/#comments</comments>
		<pubDate>Mon, 14 Mar 2016 14:37:03 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[阿里云VPC配置SNAT]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3088</guid>
		<description><![CDATA[<p>包括阿里云在内的很多云服务器classcal下都不支持SNAT，有幸拿到了阿里云VPC的测试权限，测试这个虚拟 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91vpc%e9%85%8d%e7%bd%aesnat/">阿里云VPC配置SNAT</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>包括阿里云在内的很多云服务器classcal下都不支持SNAT，有幸拿到了阿里云VPC的测试权限，测试这个虚拟专用网模式下是支持SNAT的，大概列一下操作过程。<span id="more-498"></span></p>
<div id="crayon-56e6bf780eee8884510290" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e6bf780eee8884510290-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e6bf780eee8884510290-2">2</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e6bf780eee8884510290-1" class="crayon-line">使用一台虚拟路由器，两台虚拟交换机用于连接内网局域网和外网机器所属的局域网，两台<span class="crayon-v">ECS</span><span class="crayon-o">:</span></div>
<div id="crayon-56e6bf780eee8884510290-2" class="crayon-line crayon-striped-line">一台纯内网，一台绑定了<span class="crayon-i">EIP</span>作为<span class="crayon-i">NAT</span>网关，如下：</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>&nbsp;</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/11.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/11.jpg" alt="11" width="674" height="502" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div id="crayon-56e6bf780eef9637743723" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e6bf780eef9637743723-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e6bf780eef9637743723-1" class="crayon-line">在虚拟路由器上配置路由</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>由于为了让内网服务器借助EIP访问公网，所以设置所有目标地址0.0.0.0/0下一跳都转发到绑定了公网IP的ECS实例上。这里的下一跳ECS不支持搜索，有点麻烦。</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/%EF%BC%92.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/%EF%BC%92.jpg" alt="%EF%BC%92" width="264" height="234" /></a></p>
<p>&nbsp;</p>
<div id="crayon-56e6bf780eeff662866795" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e6bf780eeff662866795-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e6bf780eeff662866795-1" class="crayon-line">配置好之后，登陆外网机器配置<span class="crayon-v">SNAT</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="highlighter_631315" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="plain">iptables -t nat -I POSTROUTING -s 172.16.3.0/24 -j SNAT --to-</code><code class="functions">source</code> <code class="plain">172.16.1.2</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>其中3网段是内网局域网的网段，172.16.1.2是绑定了EIP的ECS自身IP，以便完成源地址转换</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/31.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/31.jpg" alt="31" width="817" height="167" /></a></p>
<p>&nbsp;</p>
<div id="crayon-56e6bf780ef06824747418" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e6bf780ef06824747418-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e6bf780ef06824747418-1" class="crayon-line">然后修改内核参数允许<span class="crayon-i">IP</span>转发：</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="highlighter_17521" class="syntaxhighlighter  ">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="functions">sed</code> <code class="plain">-i </code><code class="string">'s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g'</code> <code class="plain">/etc/sysctl.conf;sysctl -p</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>完成后测试，内网服务器已经可以访问外网了: <a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/51.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/51.jpg" alt="51" width="912" height="263" /></a></p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91vpc%e9%85%8d%e7%bd%aesnat/">阿里云VPC配置SNAT</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91vpc%e9%85%8d%e7%bd%aesnat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云下配置keepalive，利用HAVIP实现HA</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha-2/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha-2/#comments</comments>
		<pubDate>Mon, 14 Mar 2016 14:34:22 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[linux系统代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[阿里云下配置keepalive，利用HAVIP实现HA]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3078</guid>
		<description><![CDATA[<p>包括阿里云在内的很多云环境，因为不支持浮动IP广受诟病。目前阿里云在VPC网络下发布了HAVIP，能够实现ar [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha-2/">阿里云下配置keepalive，利用HAVIP实现HA</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>包括阿里云在内的很多云环境，因为不支持浮动IP广受诟病。目前阿里云在VPC网络下发布了HAVIP，能够实现arp宣告IP。这样也就让自己搭建HA成为了可能，有幸拿到了内测权限体验了一下。(classical网络依然不支持)</p>
<p>测试环境：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/1.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/1.jpg" alt="1" width="893" height="267" /></a></p>
<div id="crayon-56e612a8cec97214385622" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8cec97214385622-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cec97214385622-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8cec97214385622-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cec97214385622-4">4</div>
<div class="crayon-num" data-line="crayon-56e612a8cec97214385622-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cec97214385622-6">6</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8cec97214385622-1" class="crayon-line"><span class="crayon-i">VPC</span>：<span class="crayon-cn">192.168.1.0</span><span class="crayon-o">/</span><span class="crayon-cn">24</span></div>
<div id="crayon-56e612a8cec97214385622-2" class="crayon-line crayon-striped-line"><span class="crayon-v">ECS</span><span class="crayon-o">:</span></div>
<div id="crayon-56e612a8cec97214385622-3" class="crayon-line"><span class="crayon-i">nginx1</span>：<span class="crayon-cn">192.168.1.1</span></div>
<div id="crayon-56e612a8cec97214385622-4" class="crayon-line crayon-striped-line"><span class="crayon-v">nginx2</span><span class="crayon-o">:</span><span class="crayon-cn">192.168.1.2</span></div>
<div id="crayon-56e612a8cec97214385622-5" class="crayon-line"><span class="crayon-v">HAVIP</span><span class="crayon-o">:</span><span class="crayon-cn">192.168.1.3</span></div>
<div id="crayon-56e612a8cec97214385622-6" class="crayon-line crayon-striped-line">绑定到<span class="crayon-i">havip</span>的公网<span class="crayon-i">EIP</span>：<span class="crayon-cn">121.43.187.37</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>配置完毕后的拓扑如下：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/4.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/4.jpg" alt="4" width="641" height="405" /></a><br />
环境搭建完毕后，登陆主备ECS服务器，分别配置nginx+keepalived</p>
<div id="crayon-56e612a8ceca9851636518" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8ceca9851636518-1">1</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8ceca9851636518-1" class="crayon-line"><span class="crayon-sy">[</span><span class="crayon-v">root</span><span class="crayon-sy">@</span><span class="crayon-v">Nginx1</span> <span class="crayon-o">~</span><span class="crayon-sy">]</span><span class="crayon-c"># yum install nginx keepalived -y</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>MASTER服务器（nginx1）配置文件/etc/keepalived/keepalived.conf内容以及解释如下：</p>
<div id="crayon-56e612a8cecae477615045" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-4">4</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-6">6</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-8">8</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-10">10</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-12">12</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-14">14</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-15">15</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-16">16</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-17">17</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-18">18</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-19">19</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-20">20</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-21">21</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-22">22</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-23">23</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-24">24</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-25">25</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-26">26</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-27">27</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-28">28</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-29">29</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-30">30</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-31">31</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-32">32</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-33">33</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-34">34</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-35">35</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-36">36</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-37">37</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-38">38</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-39">39</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-40">40</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-41">41</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-42">42</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-43">43</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-44">44</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-45">45</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecae477615045-46">46</div>
<div class="crayon-num" data-line="crayon-56e612a8cecae477615045-47">47</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8cecae477615045-1" class="crayon-line"><span class="crayon-o">!</span> <span class="crayon-e">Configuration</span> <span class="crayon-r">File</span> <span class="crayon-st">for</span> <span class="crayon-e">keepalived</span></div>
<div id="crayon-56e612a8cecae477615045-2" class="crayon-line crayon-striped-line"><span class="crayon-c">#配置global_defs，主要用于标示机器，以及故障时通知</span></div>
<div id="crayon-56e612a8cecae477615045-3" class="crayon-line"><span class="crayon-e">global_defs</span> <span class="crayon-sy">{</span><span class="crayon-h">  </span></div>
<div id="crayon-56e612a8cecae477615045-4" class="crayon-line crayon-striped-line"><span class="crayon-h">   </span><span class="crayon-e">router_id </span><span class="crayon-i">Nginx1</span></div>
<div id="crayon-56e612a8cecae477615045-5" class="crayon-line"><span class="crayon-sy">}</span></div>
<div id="crayon-56e612a8cecae477615045-6" class="crayon-line crayon-striped-line"><span class="crayon-c">#配置vrrp_script，主要用于健康检查，以及检查失败后执行的动作。</span></div>
<div id="crayon-56e612a8cecae477615045-7" class="crayon-line"><span class="crayon-e">vrrp_script</span> <span class="crayon-e">chk_nginx</span> <span class="crayon-sy">{</span></div>
<div id="crayon-56e612a8cecae477615045-8" class="crayon-line crayon-striped-line"><span class="crayon-c">#健康检查脚本，当脚本返回值不为0时认为失败</span></div>
<div id="crayon-56e612a8cecae477615045-9" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">script</span> <span class="crayon-s">&#8220;/etc/keepalived/ck_ng.sh&#8221;</span></div>
<div id="crayon-56e612a8cecae477615045-10" class="crayon-line crayon-striped-line"><span class="crayon-c">#检查频率，以下配置每2秒检查1次</span></div>
<div id="crayon-56e612a8cecae477615045-11" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">interval</span> <span class="crayon-cn">2</span></div>
<div id="crayon-56e612a8cecae477615045-12" class="crayon-line crayon-striped-line"><span class="crayon-c">#当检查失败后，将vrrp_instance的priority减小5</span></div>
<div id="crayon-56e612a8cecae477615045-13" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">weight</span> <span class="crayon-o">&#8211;</span><span class="crayon-cn">5</span></div>
<div id="crayon-56e612a8cecae477615045-14" class="crayon-line crayon-striped-line"><span class="crayon-c">#连续监测失败3次，才认为真的健康检查失败。并调整优先级</span></div>
<div id="crayon-56e612a8cecae477615045-15" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">fall</span> <span class="crayon-cn">3</span></div>
<div id="crayon-56e612a8cecae477615045-16" class="crayon-line crayon-striped-line"><span class="crayon-c">#连续监测2次成功，就认为成功。但不调整优先级</span></div>
<div id="crayon-56e612a8cecae477615045-17" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">rise</span> <span class="crayon-cn">2</span></div>
<div id="crayon-56e612a8cecae477615045-18" class="crayon-line crayon-striped-line"><span class="crayon-sy">}</span></div>
<div id="crayon-56e612a8cecae477615045-19" class="crayon-line"></div>
<div id="crayon-56e612a8cecae477615045-20" class="crayon-line crayon-striped-line"><span class="crayon-c">#定义对外提供服务的VIP vrrp_instance配置</span></div>
<div id="crayon-56e612a8cecae477615045-21" class="crayon-line"><span class="crayon-e">vrrp_instance</span> <span class="crayon-e">VI_1</span> <span class="crayon-sy">{</span></div>
<div id="crayon-56e612a8cecae477615045-22" class="crayon-line crayon-striped-line"><span class="crayon-c">#指定vrrp_instance的初始状态，是MASTER还是BackUP主要还是看优先级。</span></div>
<div id="crayon-56e612a8cecae477615045-23" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-e">state </span><span class="crayon-v">MASTER</span></div>
<div id="crayon-56e612a8cecae477615045-24" class="crayon-line crayon-striped-line"><span class="crayon-c">#指定vrrp_instance绑定的网卡，最终会通过指定的网卡宣告VIP</span></div>
<div id="crayon-56e612a8cecae477615045-25" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-t">interface</span> <span class="crayon-v">eth0</span></div>
<div id="crayon-56e612a8cecae477615045-26" class="crayon-line crayon-striped-line"><span class="crayon-c">#发送心跳包的源IP，可使用绑定的网卡IP，也可以使用本服务器上的其他IP</span></div>
<div id="crayon-56e612a8cecae477615045-27" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">mcast_src</span><span class="crayon-sy">_</span>ip <span class="crayon-cn">192.168.1.1</span></div>
<div id="crayon-56e612a8cecae477615045-28" class="crayon-line crayon-striped-line"><span class="crayon-c">#相当于VRID，用于在一个网内区分组播，需要组播域内内唯一。</span></div>
<div id="crayon-56e612a8cecae477615045-29" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">virtual_router</span><span class="crayon-sy">_</span>id <span class="crayon-cn">55</span></div>
<div id="crayon-56e612a8cecae477615045-30" class="crayon-line crayon-striped-line"><span class="crayon-c">#本机的优先级，VRID相同的机器中，优先级最高的会被选举为MASTER</span></div>
<div id="crayon-56e612a8cecae477615045-31" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-i">priority</span> <span class="crayon-cn">101</span></div>
<div id="crayon-56e612a8cecae477615045-32" class="crayon-line crayon-striped-line"><span class="crayon-c">#心跳间隔，下面配置，MASTER会每隔1秒发送一个报文高职组内其他机器，自己还活着。</span></div>
<div id="crayon-56e612a8cecae477615045-33" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-v">advert</span><span class="crayon-sy">_</span>int <span class="crayon-cn">1</span></div>
<div id="crayon-56e612a8cecae477615045-34" class="crayon-line crayon-striped-line"><span class="crayon-c">#定义主从的验证方式以及密码，一般使用PASS(最长8位，超过了只会识别前8位作为密码)</span></div>
<div id="crayon-56e612a8cecae477615045-35" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-e">authentication</span> <span class="crayon-sy">{</span></div>
<div id="crayon-56e612a8cecae477615045-36" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-e">auth_type </span><span class="crayon-e">PASS</span></div>
<div id="crayon-56e612a8cecae477615045-37" class="crayon-line"><span class="crayon-e">        </span><span class="crayon-e">auth_pass </span><span class="crayon-i">aliyun</span></div>
<div id="crayon-56e612a8cecae477615045-38" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-56e612a8cecae477615045-39" class="crayon-line"><span class="crayon-c">#VIP,在阿里云下就是刚才创建的HAVIP</span></div>
<div id="crayon-56e612a8cecae477615045-40" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-e">virtual_ipaddress</span> <span class="crayon-sy">{</span></div>
<div id="crayon-56e612a8cecae477615045-41" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-cn">192.168.1.4</span></div>
<div id="crayon-56e612a8cecae477615045-42" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-sy">}</span></div>
<div id="crayon-56e612a8cecae477615045-43" class="crayon-line"><span class="crayon-c">#本vrrp_instance所引用的脚本配置，名称就是vrrp_script 定义的容器名</span></div>
<div id="crayon-56e612a8cecae477615045-44" class="crayon-line crayon-striped-line"><span class="crayon-h">  </span><span class="crayon-e">track_script</span> <span class="crayon-sy">{</span></div>
<div id="crayon-56e612a8cecae477615045-45" class="crayon-line"><span class="crayon-h">       </span><span class="crayon-v">chk</span><span class="crayon-sy">_</span>nginx</div>
<div id="crayon-56e612a8cecae477615045-46" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-sy">}</span></div>
<div id="crayon-56e612a8cecae477615045-47" class="crayon-line"><span class="crayon-sy">}</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>BACKUP服务器（nginx2）的配置需要修改：</p>
<div id="crayon-56e612a8cecb5455868472" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8cecb5455868472-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecb5455868472-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8cecb5455868472-3">3</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8cecb5455868472-1" class="crayon-line"><span class="crayon-e">state </span><span class="crayon-i">MASTER</span>改为<span class="crayon-h">  </span><span class="crayon-e">state </span><span class="crayon-e">BACKUP</span></div>
<div id="crayon-56e612a8cecb5455868472-2" class="crayon-line crayon-striped-line"><span class="crayon-v">mcast_src</span><span class="crayon-sy">_</span>ip <span class="crayon-cn">192.168.1.1</span>改为<span class="crayon-i">backup</span>服务器实际的<span class="crayon-e">IP </span><span class="crayon-v">mcast_src</span><span class="crayon-sy">_</span>ip <span class="crayon-cn">192.168.1.2</span></div>
<div id="crayon-56e612a8cecb5455868472-3" class="crayon-line"><span class="crayon-i">priority</span> <span class="crayon-cn">101</span>改小一些，比如<span class="crayon-h">    </span><span class="crayon-i">priority</span> <span class="crayon-cn">100</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>其它保持一致即可</p>
<p>为了实现nginx服务异常的时候能够自动切换，需要自己写一个脚本，脚本没有硬性的要求，能够实现目标即可，这里 监控nginx进程数为例：</p>
<div id="crayon-56e612a8cecbb232281910" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-4">4</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-5">5</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-6">6</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-7">7</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-8">8</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-9">9</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-10">10</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-11">11</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-12">12</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-13">13</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-14">14</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-15">15</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecbb232281910-16">16</div>
<div class="crayon-num" data-line="crayon-56e612a8cecbb232281910-17">17</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8cecbb232281910-1" class="crayon-line"><span class="crayon-r">vim</span> <span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">keepalived</span><span class="crayon-o">/</span><span class="crayon-v">ck_ng</span><span class="crayon-e">.sh</span></div>
<div id="crayon-56e612a8cecbb232281910-2" class="crayon-line crayon-striped-line"><span class="crayon-c">#!/bin/bash</span></div>
<div id="crayon-56e612a8cecbb232281910-3" class="crayon-line"><span class="crayon-c">#检查nginx进程是否存在</span></div>
<div id="crayon-56e612a8cecbb232281910-4" class="crayon-line crayon-striped-line"><span class="crayon-v">count</span><span class="crayon-o">=</span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-r">ps</span> <span class="crayon-o">&#8211;</span><span class="crayon-i">C</span> <span class="crayon-v">nginx</span> <span class="crayon-o">&#8212;</span><span class="crayon-v">no</span><span class="crayon-o">&#8211;</span><span class="crayon-v">heading</span><span class="crayon-o">|</span><span class="crayon-r">wc</span> <span class="crayon-o">&#8211;</span><span class="crayon-v">l</span><span class="crayon-sy">)</span></div>
<div id="crayon-56e612a8cecbb232281910-5" class="crayon-line"><span class="crayon-c">#进程数等于0的时候</span></div>
<div id="crayon-56e612a8cecbb232281910-6" class="crayon-line crayon-striped-line"><span class="crayon-st">if</span> <span class="crayon-sy">[</span> <span class="crayon-s">&#8220;${count}&#8221;</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;0&#8221;</span> <span class="crayon-sy">]</span><span class="crayon-sy">;</span> <span class="crayon-st">then</span></div>
<div id="crayon-56e612a8cecbb232281910-7" class="crayon-line"><span class="crayon-c">#尝试启动一次nginx，停止2秒后再次检测</span></div>
<div id="crayon-56e612a8cecbb232281910-8" class="crayon-line crayon-striped-line"><span class="crayon-h">    </span><span class="crayon-e">service </span><span class="crayon-e">nginx </span><span class="crayon-e">start</span></div>
<div id="crayon-56e612a8cecbb232281910-9" class="crayon-line"><span class="crayon-e">    </span><span class="crayon-r">sleep</span> <span class="crayon-cn">2</span></div>
<div id="crayon-56e612a8cecbb232281910-10" class="crayon-line crayon-striped-line"><span class="crayon-h">   </span><span class="crayon-v">count</span><span class="crayon-o">=</span><span class="crayon-sy">$</span><span class="crayon-sy">(</span><span class="crayon-r">ps</span> <span class="crayon-o">&#8211;</span><span class="crayon-i">C</span> <span class="crayon-v">nginx</span> <span class="crayon-o">&#8212;</span><span class="crayon-v">no</span><span class="crayon-o">&#8211;</span><span class="crayon-v">heading</span><span class="crayon-o">|</span><span class="crayon-r">wc</span> <span class="crayon-o">&#8211;</span><span class="crayon-v">l</span><span class="crayon-sy">)</span></div>
<div id="crayon-56e612a8cecbb232281910-11" class="crayon-line"><span class="crayon-h">    </span><span class="crayon-st">if</span> <span class="crayon-sy">[</span> <span class="crayon-s">&#8220;${count}&#8221;</span> <span class="crayon-o">=</span> <span class="crayon-s">&#8220;0&#8221;</span> <span class="crayon-sy">]</span><span class="crayon-sy">;</span> <span class="crayon-st">then</span></div>
<div id="crayon-56e612a8cecbb232281910-12" class="crayon-line crayon-striped-line"><span class="crayon-c">#如果启动没成功，就杀掉keepalive触发主备切换</span></div>
<div id="crayon-56e612a8cecbb232281910-13" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">init</span><span class="crayon-e">.d</span><span class="crayon-o">/</span><span class="crayon-e">keepalived </span><span class="crayon-e">stop</span></div>
<div id="crayon-56e612a8cecbb232281910-14" class="crayon-line crayon-striped-line"><span class="crayon-e">    </span><span class="crayon-st">fi</span></div>
<div id="crayon-56e612a8cecbb232281910-15" class="crayon-line"><span class="crayon-st">fi</span></div>
<div id="crayon-56e612a8cecbb232281910-16" class="crayon-line crayon-striped-line"><span class="crayon-c">#增加脚本的执行权限</span></div>
<div id="crayon-56e612a8cecbb232281910-17" class="crayon-line"><span class="crayon-r">chmod</span> <span class="crayon-o">+</span><span class="crayon-i">x</span> <span class="crayon-r">vim</span> <span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">keepalived</span><span class="crayon-o">/</span><span class="crayon-v">ck_ng</span><span class="crayon-e">.sh</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="crayon-56e612a8cecc0480674347" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8cecc0480674347-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecc0480674347-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8cecc0480674347-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecc0480674347-4">4</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8cecc0480674347-1" class="crayon-line"><span class="crayon-c">#分别启动nginx1和nginx2的nginx&amp;keepalived服务：</span></div>
<div id="crayon-56e612a8cecc0480674347-2" class="crayon-line crayon-striped-line"><span class="crayon-sy">[</span><span class="crayon-v">root</span><span class="crayon-sy">@</span><span class="crayon-v">Nginx1</span> <span class="crayon-o">~</span><span class="crayon-sy">]</span><span class="crayon-c"># /etc/init.d/nginx start;/etc/init.d/keepalived start</span></div>
<div id="crayon-56e612a8cecc0480674347-3" class="crayon-line"><span class="crayon-e">Starting </span><span class="crayon-v">nginx</span><span class="crayon-o">:</span><span class="crayon-h">                                            </span><span class="crayon-sy">[</span><span class="crayon-h">  </span><span class="crayon-i">OK</span><span class="crayon-h">  </span><span class="crayon-sy">]</span></div>
<div id="crayon-56e612a8cecc0480674347-4" class="crayon-line crayon-striped-line"><span class="crayon-e">Starting </span><span class="crayon-v">keepalived</span><span class="crayon-o">:</span><span class="crayon-h">                                       </span><span class="crayon-sy">[</span><span class="crayon-h">  </span><span class="crayon-i">OK</span><span class="crayon-h">  </span><span class="crayon-sy">]</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div>
<div>测试：</div>
<div>NGINX1/192.168.1.1的priority 为101，NGINX2/192.168.1.2的priority为100，这时候访问HAVIP绑定的EIP：http://121.43.187.37/可以看到访问到了服务器NGINX1,如下：</div>
<div>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/5.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/5.jpg" alt="5" width="485" height="205" /></a></p>
<p>到HAVIP控制台查看，192.168.1.1的服务器为主服务器</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/111.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/111.png" alt="111" width="596" height="330" /></a></p>
<p>这时候我们KILL掉nginx1服务器的nginx服务</p>
</div>
</div>
<div>
<div>查看日志，发送了移除VIP的报文：</div>
<div>
<div id="crayon-56e612a8cecc6571294083" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8cecc6571294083-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8cecc6571294083-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8cecc6571294083-3">3</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8cecc6571294083-1" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">20</span><span class="crayon-o">:</span><span class="crayon-cn">01</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25019</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-i">sending</span> <span class="crayon-cn">0</span> <span class="crayon-e">priority</span></div>
<div id="crayon-56e612a8cecc6571294083-2" class="crayon-line crayon-striped-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">20</span><span class="crayon-o">:</span><span class="crayon-cn">01</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25019</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">removing </span><span class="crayon-e">protocol </span><span class="crayon-v">VIPs</span><span class="crayon-sy">.</span></div>
<div id="crayon-56e612a8cecc6571294083-3" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">20</span><span class="crayon-o">:</span><span class="crayon-cn">01</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_healthcheckers</span><span class="crayon-sy">[</span><span class="crayon-cn">25018</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">Netlink </span><span class="crayon-e">reflector </span><span class="crayon-e">reports </span><span class="crayon-i">IP</span> <span class="crayon-cn">192.168.1.3</span> <span class="crayon-v">removed</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>这时候访问<a href="http://121.43.187.37/%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0%E8%AE%BF%E9%97%AE%E8%87%AA%E5%8A%A8%E5%88%87%E6%8D%A2%E5%88%B0%E4%BA%86NGINX2">http://121.43.187.37/，可以看到访问自动切换到了NGINX2</a><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/6.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/6.jpg" alt="6" width="473" height="194" /></a></p>
</div>
<div>
<div>到HAVIP控制台查看，192.168.1.2的服务器为主服务器</div>
</div>
</div>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/2222.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/2222.png" alt="2222" width="603" height="354" /></a></p>
<div>
<div>重新启动nginx1的nginx和keepalive服务</div>
<div>查看日志可以看到keepalive重新发送了IP宣告的报文</div>
<div>
<div id="crayon-56e612a8ceccd574917624" class="crayon-syntax crayon-theme-familiar crayon-font-droid-sans-mono crayon-os-pc print-yes notranslate crayon-wrapped" data-settings=" minimize scroll-mouseover wrap">
<div class="crayon-plain-wrap"></div>
<div class="crayon-main">
<table class="crayon-table">
<tbody>
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-56e612a8ceccd574917624-1">1</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8ceccd574917624-2">2</div>
<div class="crayon-num" data-line="crayon-56e612a8ceccd574917624-3">3</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-56e612a8ceccd574917624-4">4</div>
<div class="crayon-num" data-line="crayon-56e612a8ceccd574917624-5">5</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-56e612a8ceccd574917624-1" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">Entering </span><span class="crayon-e">MASTER </span><span class="crayon-e">STATE</span></div>
<div id="crayon-56e612a8ceccd574917624-2" class="crayon-line crayon-striped-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">setting </span><span class="crayon-e">protocol </span><span class="crayon-v">VIPs</span><span class="crayon-sy">.</span></div>
<div id="crayon-56e612a8ceccd574917624-3" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">Sending </span><span class="crayon-e">gratuitous </span><span class="crayon-e">ARPs </span><span class="crayon-e">on </span><span class="crayon-e">eth0 </span><span class="crayon-st">for</span> <span class="crayon-cn">192.168.1.3</span></div>
<div id="crayon-56e612a8ceccd574917624-4" class="crayon-line crayon-striped-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">14</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_healthcheckers</span><span class="crayon-sy">[</span><span class="crayon-cn">25609</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">Netlink </span><span class="crayon-e">reflector </span><span class="crayon-e">reports </span><span class="crayon-i">IP</span> <span class="crayon-cn">192.168.1.3</span> <span class="crayon-e">added</span></div>
<div id="crayon-56e612a8ceccd574917624-5" class="crayon-line"><span class="crayon-i">Oct</span> <span class="crayon-cn">23</span> <span class="crayon-cn">17</span><span class="crayon-o">:</span><span class="crayon-cn">22</span><span class="crayon-o">:</span><span class="crayon-cn">19</span> <span class="crayon-e">iZ239aqzdi7Z </span><span class="crayon-v">Keepalived_vrrp</span><span class="crayon-sy">[</span><span class="crayon-cn">25610</span><span class="crayon-sy">]</span><span class="crayon-o">:</span> <span class="crayon-e">VRRP_Instance</span><span class="crayon-sy">(</span><span class="crayon-v">VI_1</span><span class="crayon-sy">)</span> <span class="crayon-e">Sending </span><span class="crayon-e">gratuitous </span><span class="crayon-e">ARPs </span><span class="crayon-e">on </span><span class="crayon-e">eth0 </span><span class="crayon-st">for</span> <span class="crayon-cn">192.168.1.3</span></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>重新访问http://121.43.187.37/测试，重新访问到了服务器NGINX1，到HAVIP控制台查看，192.168.1.1的服务器重新夺回了控制权，成为了为主服务器</p></div>
<div><a href="https://www.fuwuqiok.com/wp-content/uploads/2016/03/1111.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2016/03/1111.png" alt="1111" width="596" height="330" /></a></div>
<div>这样就实现了阿里云环境下的HA切换。</div>
<div>实际测试，阿里云的多个HAVIP可以绑定到同样的两台机器，可以配置多组vrrp_instance来实现双主。或者两台服务器同时为两个业务服务，避免资源浪费。同时能够做到主备</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha-2/">阿里云下配置keepalive，利用HAVIP实现HA</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91%e4%b8%8b%e9%85%8d%e7%bd%aekeepalive%ef%bc%8c%e5%88%a9%e7%94%a8havip%e5%ae%9e%e7%8e%b0ha-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>阿里云SLB健康检查的日志特殊处理</title>
		<link>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e5%81%a5%e5%ba%b7%e6%a3%80%e6%9f%a5%e7%9a%84%e6%97%a5%e5%bf%97%e7%89%b9%e6%ae%8a%e5%a4%84%e7%90%86/</link>
		<comments>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e5%81%a5%e5%ba%b7%e6%a3%80%e6%9f%a5%e7%9a%84%e6%97%a5%e5%bf%97%e7%89%b9%e6%ae%8a%e5%a4%84%e7%90%86/#comments</comments>
		<pubDate>Mon, 14 Mar 2016 14:31:09 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[aliyun服务器代维]]></category>
		<category><![CDATA[linux代维]]></category>
		<category><![CDATA[linux服务器代维]]></category>
		<category><![CDATA[linux系统代维]]></category>
		<category><![CDATA[代维]]></category>
		<category><![CDATA[服务器代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[阿里云SLB健康检查的日志特殊处理]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=3076</guid>
		<description><![CDATA[<p>SLB健康检查的频率比较高，每秒都有好几个。日积月累就带来了大量web service的日志。一来浪费存储空间 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e5%81%a5%e5%ba%b7%e6%a3%80%e6%9f%a5%e7%9a%84%e6%97%a5%e5%bf%97%e7%89%b9%e6%ae%8a%e5%a4%84%e7%90%86/">阿里云SLB健康检查的日志特殊处理</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>SLB健康检查的频率比较高，每秒都有好几个。日积月累就带来了大量web service的日志。一来浪费存储空间，二来消耗磁盘性能。除了官方建议的降低健康检查频率外，或许有一些变通的思维</p>
<p><strong>1、如果对HTTP或者TCP转发协议不挑剔，换成TCP转发并不开启http健康检查就OK了。</strong></p>
<p>优势：方便，控制台操作下就好了。</p>
<p>劣势：只是这样也失去了应用层异常的发现能力。</p>
<p><strong>2、为健康检查单独建立一个没有开启日志的virtualhost，通过不同的端口或者hostname，让健康检查请求不会请求到业务host。</strong></p>
<p>优势：web service级别的异常依然能够被健康检查发现。</p>
<p>劣势：virtualhost级别的异常，SLB健康检查就无法发现了。</p>
<p><strong>3、利用nginx等web服务器的规则，为健康检查的文件名（URI）做单独的日志配置，以Nginx为例：</strong></p>
<p>如下配置，健康检查配置一个业务上无意义的check.html。针对这个文件做的请求，不记录日志。</p>
<div class="crayon-pre">
<div id="crayon-56e5649bd2574294403245-1" class="crayon-line"><span class="crayon-v">location</span> <span class="crayon-o">~</span> <span class="crayon-o">/</span><span class="crayon-v">check</span><span class="crayon-e">.html</span></div>
<div id="crayon-56e5649bd2574294403245-2" class="crayon-line crayon-striped-line"><span class="crayon-h">        </span><span class="crayon-sy">{</span></div>
<div id="crayon-56e5649bd2574294403245-3" class="crayon-line"><span class="crayon-h">              </span><span class="crayon-e">access_log </span><span class="crayon-v">off</span><span class="crayon-sy">;</span> <span class="crayon-c">#关闭日志</span></div>
<div id="crayon-56e5649bd2574294403245-4" class="crayon-line crayon-striped-line"><span class="crayon-h">             </span> <span class="crayon-c">#access_log  /var/log/nginx/access/health_check.log main;或者健康检查的日志配置到单独的文件</span></div>
<div id="crayon-56e5649bd2574294403245-5" class="crayon-line"><span class="crayon-h">        </span><span class="crayon-sy">}</span></div>
<div class="crayon-line">
<p>优势：健康检查日志可以随意配置，且不会损失健康检查的特性。</p>
</div>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e5%81%a5%e5%ba%b7%e6%a3%80%e6%9f%a5%e7%9a%84%e6%97%a5%e5%bf%97%e7%89%b9%e6%ae%8a%e5%a4%84%e7%90%86/">阿里云SLB健康检查的日志特殊处理</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e9%98%bf%e9%87%8c%e4%ba%91slb%e5%81%a5%e5%ba%b7%e6%a3%80%e6%9f%a5%e7%9a%84%e6%97%a5%e5%bf%97%e7%89%b9%e6%ae%8a%e5%a4%84%e7%90%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
