<?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>Original | Easton Man's Blog</title>
	<atom:link href="https://blog.eastonman.com/blog/tag/original/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.eastonman.com</link>
	<description>临渊羡鱼，不如退而结网</description>
	<lastBuildDate>Sat, 07 Aug 2021 14:31:15 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://blog.eastonman.com/wp-content/uploads/2021/02/cropped-Logo-e1613298891313-32x32.png</url>
	<title>Original | Easton Man's Blog</title>
	<link>https://blog.eastonman.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>论大学之义</title>
		<link>https://blog.eastonman.com/blog/2021/08/meaning-of-university/</link>
					<comments>https://blog.eastonman.com/blog/2021/08/meaning-of-university/#comments</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Sat, 07 Aug 2021 14:31:14 +0000</pubDate>
				<category><![CDATA[生活]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/?p=847</guid>

					<description><![CDATA[<p>每个备战高考的学子都曾想过：为什么上大学？对这个问题的回答将直接指引青年的人生，指引他们在进入大学生活后的行动。</p>
The post <a href="https://blog.eastonman.com/blog/2021/08/meaning-of-university/">论大学之义</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 16 分钟</p>
<p>此演讲稿经授权首发于本站，任何转载或引用需署名并保留原文链接。</p>



<p>强调大学之义有其现实因素。青年兴则国家兴，青年强则国家强。提高青年学习和奋斗的自觉性是谈论大学之义的原因之一。大学前奋发图强，大学后碌碌无为，乃当今大学生的常态。我所属大学在广东乃至全国的分数都不低，工科亦属中国第二，世界第四；但是身边许多大学生仍没有自己的人生目标，入大学如出狱般无拘无束。我们学院衡水中学进来的十数名学生，以其分数若在广东，实是清北之材；但他们的大学成绩排在倒数，只因大学后早上旷课，晚上喝酒，学业荒废。“衡水模式”之弊在于，过度注重时间管理和考试，以至学生没有空余时间来思考人生真正的意义，发掘自己真正的兴趣所在，让学生变成了在高压管理制度之下随波逐流的机器。但这样的惯性在大学无以为继，因为上大学后，没有衡水的老师家长推着学生学习。只有想通了上大学的意义，在大学才有动力去奋斗。</p>



<p>谈论大学之义的必要性之二，在中国经济发展对大学生的专业选择提出了新要求。现在某些职校生比普通大学生更容易就业。这主要是因为经过改革开放，社会经济条件产生巨变。四十年前“唯学历论”盛行，因为彼时大学生很少，能上大学的往往在智商上，自觉性上，更胜他人；现今大学生很多，除“物以稀为贵”的影响外，当下中国不再是四十年前敢闯敢拼就能干出一番事业的社会。生产力的提升与社会分工的日渐细化互为因果，而分工细化导致在大学综合水平相差无几的情况下，选择一个好的专业比一所名气更大的大学，对人生的影响要更为正面。转行在当下显得不那么容易。一个学化学的学生如果从来没有接触过计算机，完全不知道计算机的体系架构和组成原理，那么他将无法满足企业的需求。倘若他想对计算机基本原理了解个大概，则需要许多时间；若要精通则又要数年时间。企业几乎不可能聘用一个不熟悉业务甚至可能带来损失的人，因为当下有诸多熟悉业务的大学生可供选择。分工细化和私营企业的增多，私有制经济的蓬勃发展，导致社会“唯学历论”向“唯能力论”的转变。甚至于国企也开始进行整合重组，加强对内部员工的能力要求。现今中国社会需要的是干实事的人，需要的是某领域的专才。以名气为主的大学选择方式日渐式微，而只有想清楚自己上大学的真正原因，青年学生才能正确选择专业，发展特长，过属于自己的人生。</p>



<p>“大学之道，在明明德，在亲民，在止于至善”。私以为今日之大学，也应承大学之道。中国大学是青年学生提高知识水平的地方，是青年学生培养专业能力的地方，也是青年学生提高思想觉悟的地方。欧洲最初的大学是一帮知识分子为了摆脱教会的束缚，为获取学术自由，为讨论学术观点聚集而成的组织，后来逐渐演化为教育机构。故当今大学担负两个责任：一是教书育人，即培养本科生和研究生；二是研究考察，即探索世界，发掘知识。二者之间，孰轻孰重？从大学的发源上讲，研究考察为重；从大学承担的社会功能来看，教书育人为重。教书育人一是传授知识，而是建设思想。传授知识必非纸上谈兵，空有理论；而是理论与实践相结合，以提高学生的动手能力为首要。目前中国大学有延续高中填鸭式教育的现象，而缺失技能的培养。直接证明即中国大学普遍不重视实验，没有像美国大学那样的课程大作业。所谓“大作业”就是实践过程，要求学生利用学到的知识做出实际的东西，包括但不限于社会调查研究（社会类学科课程）、可运行程序（计算机类）、对某个数理化问题的探究结论（数理化课程）等。这些大作业不只是对创新性的培养，也是对技能的培养。如果不上机写程序，C语言课教的永远只是理论上的C语言；如果不做问题探究，不做实验室里的实验，化学永远只是纸上的化学，生物课也不能教会学生怎么制造生物试剂。除传授知识和培育技能外，大学的目的既然是培养中国之栋梁，非外国之栋梁，那么仍需要对学生进行思想建设，培养家国情怀和社会责任。综合而论，传递知识、技能、思想这三点共同构成了大学在青年学生的人生中扮演的角色。</p>



<p>“见贤思齐焉，见不贤而内自省也”。很多人知道在大学能见天下贤士，拓展自身见识，即大学相比高中能为青年学生提供更加广阔的视野和资源。人们觉得这就是上清北的好处，即能够见识到全国各地最顶尖的学生。这样的说法正确在于北京的确有最顶尖的人才和学生，错误在于认为其他大学没有顶尖的学生。此种认识的根源在于“唯分数论”，在于单一的人才评定标准。其谬误在于以高考成绩作为评价学生是否优秀的唯一标准，而在当今中国“唯学历论”向“唯能力论”转化的情势之下，显然是站不住脚的。鼓励上清北的真正原因在于清北作为首都学校，拥有全国最丰富的资源。这一点从每年国家的经费拨款就能看出来。但资源丰富不代表任何人都能享有，在人类社会中存在资源向少数集中的趋势，大多数勉强上清北的学生会被边缘化。我自己在理学院的成绩排名第四，但如果放在计算机系则排不上号。正因如此我在理学院给辅导员和教师提的意见大部分都得到采纳；而我在计算机课上提的意见基本均被无视。做机器学习需要专门的显卡，我作为理学院的学生向老师申请就能拿到6张；而在计算机学院则根本找不到这样的渠道。同时，资源也包含教师资源——这体现在专业选择上。对要学人工智能和机器学习的学生，最优秀的选择是南京大学，因为南京大学有全国最顶级的教授周志华，南京大学的人工智能学院也是他亲手筹办，课程设置和培养体系可谓是全国典范。所以要知道具体上哪所大学，必先了解该大学具备的资源，包括硬件资源和教师资源，而不可人云亦云。即专业比学校更重要。</p>



<p>专业选好了能保证学生的知识水平和在社会上的被需要程度，但这只是大学里第三重要的。第二重要的是能力的培养。这里能力广泛地指在学科领域的能力，在人际交往上的能力，在自我管理上的能力，在深入思考社会问题上的能力等。由于“唯能力论”的当下社会要求，只知学习与工业需求脱节的大学课程是行不通的。这也是当下这么多人选择读研的原因。读研热潮的根本在于本科无法锻炼业界真正需要的能力，只能把出来工作的时间往后拖延，期望读研时能够学到更多实践能力。其实这纯粹是空想。在中国，知识的传授方式沿袭苏联的灌输式传统。研究生唯一的优势就是项目和实验做得多，即动手实践机会多。那么为何不在本科就更多地进行实践活动？“纸上得来终觉浅，绝知此事要躬行”。能力是在实践中培养的，真正的知识也是在实践中获取的。比如在学微积分这件事情上，如果一个人终其一生均是平凡的屠夫，那么学微积分对他无半点大用。只有成为工程师，成为数学家，成为物理学家，把不论是所谓思维方式还是微积分本身在生活中真正地实践出来，才算是真正懂得了微积分，微积分才算是真正地影响了他的人生。但实践需要平台和资源，所以在大学要跟对导师，要主动跟导师做项目。导师的作用就是给学生实践的机会。同时实践并不仅限于学科领域的实践，也涉及到人际交往的实践，社会活动意义上的实践如义工活动等。这一点每个青年学生须自行发掘其中方法，但首要是形成这样的认识，即提升自我能力的迫切需要，而非践行“大学享乐主义”。</p>



<p>思想是行动的指南，在大学中最重要的正是青年学生的思想。为什么人当为国奉献？如果想不通这个问题，青年学生必不能发自真心地为人民服务。从人类物质与精神追求的关系来看，物质富足的人必然要寻求自我价值的实现，否则内心就会感到空虚。为人民服务正是青年实现自我价值的最好方法。当个人在群体中奉献自我，他才会感受到社会认同。人生的意义只存在于人类群体当中，而不存在于个人；或者说只有当一个人置身于社会之中时，他所做的除开谋生之外的一切事情，才能够说是有意义的，因为人对意义的感知正是在群体当中发源的。古代无数文人志士为民请命，正是此种奉献精神的体现。从个人成就的来源上讲，每个人生活在社会中，他们所取得任何成就都不仅来源于他们自己。现代互联网大亨的成功更多是国家政策的扶持，是当今中国的经济条件给了他们机会，而这个条件是全体人民共同劳动的结果。如果没有大家的共同劳动，社会生产力就不能得到提升，互联网就没有市场需求，他们就不会成为富翁。同样，学生享有的教育资源是所有老师和学生共同努力建设的结果，也是国家政策扶持，社会群众支持的结果。学校的钱来自于国家，国家的钱来自于纳税人，而纳税人就是全体劳动人民。因此人不回馈社会则与“不孝子孙”同，任何人特别是青年学生，应当以服务社会为己任。这在学生的身份上落实正是服务老师，服务学生。看见学校的课程办得不合理，青年应当勇于提出建议；看见其他学生对专业的就业方向感到迷茫，有能力的可以主动站出来为其他人开设讲座，解除疑惑；没打过竞赛的学生在赛前感到无所适从，有经验的学生可以主动请缨传授自己的方法，也可以像学院老师建议请业界工程师前来开讲；学校某些政策制定不得人心，青年学生也应当站出来维护公理。为人民服务的方法除此之外仍有许多，但以形成其意识为首要。</p>



<p>“路漫漫其修远兮，吾将上下而求索”。认识到位了，更重要的是行动。所谓“知行合一”，知而不行则不为真知。“行”是唯一“知”，实践出真知。在繁忙的高三学业中抽出时间来思考自己的人生价值，思考自己的大学选择，是非常必要的。</p>



<p><strong>作者简介：</strong>徐兆彬，2019年广东实验中学南山一班毕业，现就读于哈尔滨工业大学（深圳）理学院，目前成绩排学院第四，曾获BDCI（CCF大数据与计算智能大赛）全国第七名，第九届泰迪杯数据挖掘挑战赛全国二等奖，CCPC（中国大学生程序设计竞赛）威海站银牌，全国大学生数学竞赛黑龙江省省级一等奖，Kaggle平台上两场比赛的第一名。大一入学即进实验室跟随户保田教授做自然语言处理的文本生成领域，目前已向人工智能领域顶级会议ICLR投稿一篇论文。曾任微软俱乐部主席，为学生开展多次竞赛讲座。同时在理学院建立竞赛群体分享竞赛经验，帮学生提升自身能力，明了专业未来发展方向；也曾多次向学院提出课程改革建议并得到采纳。</p>



<p>此演讲稿是经大佬授权首发于本站，希望能够使更多的人得到启发，任何转载或引用需署名并保留原文链接。</p>The post <a href="https://blog.eastonman.com/blog/2021/08/meaning-of-university/">论大学之义</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2021/08/meaning-of-university/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>服务器性能监控实践（一）—— 技术选型</title>
		<link>https://blog.eastonman.com/blog/2019/02/fu-wu-qi-xing-neng-jian-kong-shi-jian-1/</link>
					<comments>https://blog.eastonman.com/blog/2019/02/fu-wu-qi-xing-neng-jian-kong-shi-jian-1/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Mon, 11 Feb 2019 21:46:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2019/02/11/fu-wu-qi-xing-neng-jian-kong-shi-jian-1/</guid>

					<description><![CDATA[<p>本文主要介绍现阶段可快速构建的服务器性能监控系统，通过对比选出适用于作者所用场景的轻量级、可扩展性强的监控系统</p>
The post <a href="https://blog.eastonman.com/blog/2019/02/fu-wu-qi-xing-neng-jian-kong-shi-jian-1/">服务器性能监控实践（一）—— 技术选型</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 8 分钟</p>
<p></p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="960" height="273" src="https://blog.eastonman.com/wp-content/uploads/2020/07/3713134454-1.png" alt="" class="wp-image-77" srcset="https://blog.eastonman.com/wp-content/uploads/2020/07/3713134454-1.png 960w, https://blog.eastonman.com/wp-content/uploads/2020/07/3713134454-1-300x85.png 300w, https://blog.eastonman.com/wp-content/uploads/2020/07/3713134454-1-768x218.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>
</div></div>



<p>本文基于的应用场景是作者个人维护十数台可用性要求不是很高的非生产环i8境服务器（个人博客，团队git服务器等）。</p>



<p>那么这样的应用场景要求选用的系统尽量满足一下特性：</p>



<ul class="wp-block-list"><li>免费/开源/便宜</li><li>快速</li><li>轻量</li><li>可扩展性强</li></ul>



<p>目前作者接触到的服务器监控系统大概有那么几个，全部都基于开源软件。传统老牌监控系统Zabbix和Nagios、基于Prometheus的监控系统解决方案和基于InfluxDB的解决方案。对比了这些方案后，作者选出了一种最适合的系统，只想看结论的同学请直接翻到文末。</p>



<h1 class="wp-block-heading" id="zabbix-nagios">Zabbix 和 Nagios</h1>



<h2 class="wp-block-heading" id="zabbix">Zabbix</h2>



<div class="wp-block-image kg-card kg-image-card"><figure class="aligncenter size-large is-resized"><img decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/3751213830.png" alt="" class="wp-image-112" width="370" height="255" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/3751213830.png 968w, https://blog.eastonman.com/wp-content/uploads/2020/08/3751213830-300x206.png 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/3751213830-768x528.png 768w" sizes="(max-width: 370px) 100vw, 370px" /></figure></div>



<div class="wp-block-image kg-card kg-image-card"><figure class="aligncenter size-large is-resized"><img decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/1522319286.png" alt="" class="wp-image-113" width="341" height="303" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/1522319286.png 970w, https://blog.eastonman.com/wp-content/uploads/2020/08/1522319286-300x267.png 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/1522319286-768x684.png 768w" sizes="(max-width: 341px) 100vw, 341px" /></figure></div>



<p>Zabbix 作为老牌的企业级服务器监控系统，功能非常强大。<br>官方介绍有许多功能，包括：</p>



<ul class="wp-block-list"><li>几乎所有协议和数据结构的数据来源（包括SNMP, IPMI等基础设施管理协议）</li><li>极其丰富的配置项</li><li>丰富的API控制</li><li>完全的用户权限和认证系统，提供PAM支持</li><li>一站式的解决方案，可提供图表绘制、日志审查、报警等所有可能用到的健康度监控工具</li><li>自动发现设备和数据来源</li><li>自动化维护和检查</li><li>可自定义的前端样式</li></ul>



<p>功能强大的同时也相应的会带来重量级的问题，官方文档给出的要求是100个监控项的数量级至少需要128MB内存和256M硬盘来安装，实际使用中一般需要1GB内存和100G左右的硬盘来保证比较良好的可用性。<br>不过这样的问题仅仅是对于小规模应用场景来说的，真正企业级的应用中zabbix还是属于相当轻量的，也是当之无愧的首选。<br>Zabbix虽然提供了高度的可定制性和多到令人厌烦的配置选项，但是作为一站式方案的系统，系统耦合度很高，不利于大型、实力强的企业做二次开发和组件替换。<br>我个人在一年多前使用过一会zabbix，安装并不困难，甚至比Mysql的安装配置都简单，但是完成后监控配置十分负复杂，对于两位数的机器没有必要如此细致的配置。Zabbix适用于中型企业专门雇有2-3人运维团队的场景，对于个人非专职而言全套系统一一配置下来还是显得过于繁杂。<br>当然，Zabbix仍然不失为一个优秀的监控系统。</p>



<h1 class="wp-block-heading" id="nagios">Nagios</h1>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/765332687.png" alt="" class="wp-image-114" width="266" height="185"/></figure>



<p>Nagios相比于Zabbix似乎更为的重量级，至少需要1GB的内存和8GB的硬盘来完成一次完整的安装。<br>与Zabbix提供的一体式解决方案不同，Nagios的系统更加组件化，提供给大型企业更大的自定义空间，组件间耦合度较Zabbix低。<br>我自己未安装使用过Nagios，因此不作过多评价。</p>



<p>总体而言，Zabbix和Nagios都是企业级的监控方案，主要面对企业用户开发，也适用于企业的应用场景。但是其部署和配置的过程十分烦琐，不符合我们“快速”的宗旨，所以不是特别合适。</p>



<h1 class="wp-block-heading" id="-">第三方监控服务</h1>



<p>第三方提供的监控服务从简单到复杂，从免费到收费，几乎应有尽有，只要你肯出钱，没有找不到的解决方案。如果你比较不愿意自己动手搭建，或者不愿意雇佣专职运维，这样的外包服务在公司规模较小的情况下还是很常见的。<br>当然，这很难满足我们“免费/便宜”原则，可扩展性相比于前文的两个企业解决方案更差。所以第三方的监控服务更适用于希望能够直接外包运维的非互联网甚至非技术型企业。</p>



<h1 class="wp-block-heading" id="-prometheus">基于Prometheus</h1>



<p>基于Prometheus的监控系统架构一般如下</p>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/2917840214-1024x615.png" alt="" class="wp-image-141" width="524" height="314" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/2917840214-1024x615.png 1024w, https://blog.eastonman.com/wp-content/uploads/2020/08/2917840214-300x180.png 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/2917840214-768x461.png 768w, https://blog.eastonman.com/wp-content/uploads/2020/08/2917840214.png 1351w" sizes="(max-width: 524px) 100vw, 524px" /></figure>



<p>或是这个简化版</p>



<figure class="wp-block-image size-large kg-card kg-image-card"><img loading="lazy" decoding="async" width="960" height="273" src="https://blog.eastonman.com/wp-content/uploads/2020/08/3713134454-1-1.png" alt="" class="wp-image-142" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/3713134454-1-1.png 960w, https://blog.eastonman.com/wp-content/uploads/2020/08/3713134454-1-1-300x85.png 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/3713134454-1-1-768x218.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<p>Prometheus本身是一个时序数据库套件，提供了监控系统中的数据收集服务端和数据库的角色（也就是上图中的Prometheus Server部分），官方还提供了报警管理的模块（上图中Alert Manager)，因此我们还额外需要数据展示和数据收集的客户端（上图中Prometheus Target和Data Visualization）。</p>



<p>这一额外的部分有很多的选择。对于Target 可以有各种Exporter 在官方页面有列举。甚至任何支持metric格式输出的数据收集端，比如nNetdata、statsd等。数据可视化我们一般会选择Grafana，当然其它如Grafite等只要支持PromQL查询的都可以。</p>



<p>此套解决方案我不久前部署过，它的优点很多，包括了全部开源，模块化，可扩展性强，可以docker部署，部署非常简单。它也较为的轻量，完全部署仅需30M左右的内存。当然硬盘占用是跟随着数据量的增大而增大的，无数据情况下大约占用200-300M的硬盘空间。</p>



<h1 class="wp-block-heading" id="-influxdb">基于InfluxDB</h1>



<h2 class="wp-block-heading" id="tick-">TICK栈</h2>



<figure class="wp-block-image size-large kg-card kg-image-card"><img loading="lazy" decoding="async" width="970" height="500" src="https://blog.eastonman.com/wp-content/uploads/2020/08/2353643527.jpg" alt="" class="wp-image-144" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/2353643527.jpg 970w, https://blog.eastonman.com/wp-content/uploads/2020/08/2353643527-300x155.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/2353643527-768x396.jpg 768w" sizes="(max-width: 970px) 100vw, 970px" /></figure>



<p>TICK是InfluxData官方主推的监控技术栈。<br>Telegraf+InfluxDB+Chronograf+Kapacitor，将整套系统拆分成为四个模块，模块化特征明显。因此任意支持InfluxDB读写的数据收集或者监控模块都可以使用。<br>TICK当然也可以使用docker-compose管理，无论是部署还是迁移都很方便。<br>Telegraf提供了近百种不同的系统健康信息收集，若是还不够用也可以自己写插件，具有非常强大的可扩展性。<br>Chronograf集成了Kapacitor的管理功能、InfluxDB的直接查询和Dashboard数据展示功能。不仅如此，前端设计也非常养眼。<br>同样地，TICK栈也拥有与Prometheus媲美的优势——轻量、可扩展性强等等。下面我们就会讲到使用Grafana扩展数据可视化的功能。</p>



<h2 class="wp-block-heading" id="ticgk-">TICGK栈</h2>



<p>虽然官方开发的Chronograf已经拥有精美的图表可以显示，但是论数据可视化，Grafana是难以逾越的强大开源方案。因此我们在TICK中加入Grafana，成为TICGK栈，这样一来几乎所有的优点都被涵盖了。虽然五个容器会带来磁盘和内存占用增大的影响，但是对比于异常强大的功能和简单易用的界面，这个技术栈完全适合作者的应用场景。也许在高并发和大数据量的场景下TICGK栈表现会下降，但是作为个人使用，担心并发无疑是杞人忧天。</p>



<p>毫无疑问，最后作者选择部署的就是TICGK栈，使用docker-compose管理（就几个容器没必要k8s吧）。目前状况良好，总体内存占用60M左右，设置了5s的时间粒度，15天周期后预计的硬盘使用是4GB，还是可以接受的。存在一个现象就是5s的粒度会带来Telegraf内存占用问题，开了很多Buffer，但是事实上Buffer什么的并不真正影响啊。</p>



<p>看完作者的选型，你有什么想法呢？欢迎在评论区交流。<br>才疏学浅，若有错漏，也恳请指正。</p>



<p>敬请期待下一篇——服务器性能监控（二）</p>The post <a href="https://blog.eastonman.com/blog/2019/02/fu-wu-qi-xing-neng-jian-kong-shi-jian-1/">服务器性能监控实践（一）—— 技术选型</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2019/02/fu-wu-qi-xing-neng-jian-kong-shi-jian-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tideways与Xhgui实现PHP性能分析实践</title>
		<link>https://blog.eastonman.com/blog/2018/11/use-tideways-and-xhgui-to-analyze-php-performance/</link>
					<comments>https://blog.eastonman.com/blog/2018/11/use-tideways-and-xhgui-to-analyze-php-performance/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Sat, 10 Nov 2018 08:01:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2018/11/10/use-tideways-and-xhgui-to-analyze-php-performance/</guid>

					<description><![CDATA[<p>预计阅读时间： 7 分钟 对于生产环境下php响应缓慢的问题，一般我们可以把分析流程拆分为如下几步操作： 1. [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2018/11/use-tideways-and-xhgui-to-analyze-php-performance/">Tideways与Xhgui实现PHP性能分析实践</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 7 分钟</p>
<p>对于生产环境下php响应缓慢的问题，一般我们可以把分析流程拆分为如下几步操作：</p>



<p>1.分析开发环境下执行是否会慢；</p>



<p>如果是代码问题，在开发环境下就能检测出来；</p>



<p>2.分析测试机器执行是否会慢；</p>



<p>如果是数据库或者第三方扩展问题，在测试阶段就能检查出来。</p>



<p>3.从生产环境下线一台机器，分析代码执行慢的原因；</p>



<p>如果是机器的问题，在这一步才能检查出来。</p>



<p>1，2，3步骤都需要去分析代码，看哪部分执行时间长。如果迫不得已在生产环境下调试代码，不但要耗费大量时间还可能导致用户流失。</p>



<p>大多时候我们会使用第三方的分析工具xhprof来快速发现问题。‌‌xhprof是由facebook开发的一款非侵入式php性能分析框架。但是官方已经不在维护，也没有跟进php7，只能在php5上运行，tideways则是一直由商业公司在xhprof停止维护后fork出的版本，开源在<a href="https://github.com/tideways/php-xhprof-extension">Github</a>上（托管服务需付费，自行搭建免费），支持PHP7。‌‌显而易见，tideways是我们的选择。</p>



<p>tideways扩展能把每条请求生成详细的执行日志，通过对日志做简单的分析就能看到程序哪部分耗时最长，这里可以使用xhprof的UI程序（xhprof生成的日志和tideways生成的日志格式通用），交互虽然不大友好但是够用了。‌‌当然，也可按照本文介绍使用xhgui来进行可视化的分析。</p>



<h2 class="wp-block-heading" id="-">先决条件</h2>



<p>本文部署所用环境为Ubuntu 18.04 LTS，其它环境请自行研究类似的配置。</p>



<h2 class="wp-block-heading" id="-tideways">安装Tideways</h2>



<p>由于部署环境php采用编译安装，故Tideways也采用编译安装。‌‌如果采用apt安装，也可以直接使用apt安装php-tideways。‌‌还可以使用pecl安装，具体方法不详细讲了。</p>



<pre class="wp-block-code"><code>‌git clone https://github.com/tideways/php-xhprof-extension
cd php-xhprof-extension phpize ./configure make make install //sudo make install if not root</code></pre>



<p>配置php.ini，加入</p>



<pre class="wp-block-code"><code>extension=tideways_xhprof.so tideways.auto_prepend_library=0 //optional </code></pre>



<p>注意最好加上后面那行，因为如果不加，tideways会调试所有经过php-fpm的请求，包括xhgui的请求，而这些请求不是我们想看的。</p>



<h2 class="wp-block-heading" id="-xhgui">安装xhgui</h2>



<p>其实xhgui就是一个网站程序，建过站的同学都知道大概怎么回事，只不过数据库换用了mongodb而已。</p>



<h3 class="wp-block-heading" id="-mongodb">安装mongodb</h3>



<p>因为xhgui需要储存由tideways传入的信息，所以需要安装mongodb。‌‌另有人维护了一个mysql版本的<a href="https://github.com/preinheimer/xhprof">xhgui</a>，如果不喜欢mongodb可以换用。‌‌部署环境使用了oneinstack安装lnmp栈，所以也使用oneinstack安装mongodb</p>



<pre class="wp-block-code"><code>wget http://mirrors.linuxeye.com/oneinstack.tar.gz tar zxf oneinstack.tar.gz
cd oneinstack ./install.sh // sudo install.sh if not root </code></pre>



<p>按照提示交互式安装mongodb就行了。‌‌如果你不想这么麻烦或者非生产环境部署，也可以直接使用apt安装：apt install mongodb<code> </code></p>



<p>如果没有在php中加入mongodb扩展，则需继续安装mongodb扩展。</p>



<pre class="wp-block-code"><code>git clone https://github.com/mongodb/mongo-php-driver.git
cd mongo-php-driver
git submodule update --init phpize ./configure make make install // add sudo if not root >‌</code></pre>



<p>同样地，在php.ini中添加extension=mongodb.so<code> </code></p>



<p>官方基于性能建议我们为mongodb添加索引</p>



<pre class="wp-block-code"><code>$ mongo "use xhprof";
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } ) &amp;gt;
db.results.ensureIndex( { 'profile.main().wt' : -1 } ) &amp;gt;
db.results.ensureIndex( { 'profile.main().mu' : -1 } ) &amp;gt;
db.results.ensureIndex( { 'profile.main().cpu' : -1 } ) &amp;gt;
db.results.ensureIndex( { 'meta.url' : 1 } ) &amp;gt;
db.results.ensureIndex( { 'meta.simple_url' : 1 } )</code></pre>



<p>至此mongodb算是安装完毕。‌‌注意生产环境安装还需要为mongodb配置访问权限，此处不详细讨论了。</p>



<h3 class="wp-block-heading" id="-xhgui-1">下载xhgui</h3>



<pre class="wp-block-code"><code>‌ git clone https://github.com/perftools/xhgui</code></pre>



<p>代码下载完以后上传到网站目录，具体操作因环境而异，若不熟悉请先熟悉lnmp架构。‌‌上传完后执行</p>



<pre class="wp-block-code"><code>‌ php /wwwroot/install.php</code></pre>



<h2 class="wp-block-heading" id="-nginx">配置Nginx</h2>



<p>假设我们需要调试的网站位于dev.fqdn‌‌而xhgui位于xhgui.fqdn</p>



<p>则需要在dev.fqdn配置文件的location段加入</p>



<pre class="wp-block-code"><code>‌fastcgi_param PHP_VALUE "auto_prepend_file=/wwwroot of xhfui.fqdn/xhgui/external/header.php"; </code></pre>



<p>此配置的作用是在dev.fqdn下的每个php经过fastcgi的时候自动在开头加入这个xhgui/external/header.php‌‌而这个文件的作用是运行你的代码前调用tideways开启调试‌‌你的代码运行完毕后结束调试并把结果传入mongodb等待查看。</p>



<p>xhgui.fqdn配置则是正常php网站的配置，不赘述了。‌‌注意需有这一行</p>



<p>‌                              <code>location / {     try_files $uri $uri/ /index.php?$args; } </code></p>



<h2 class="wp-block-heading" id="-tideways-1">配置tideways</h2>



<p>tideways的配置文件位于/config/config.php‌‌安装时这个文件不存在，故需要把默认配置复制到这个文件</p>



<p>‌                              <code>cp &lt;wwwroot>/config/config.default.php &lt;wwwroot>/config/config.php </code></p>



<p>除了mongodb链接配置（一般无需调整）‌‌主要关注这一个回调函数</p>



<p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<code>// In config/config.php return array( &nbsp; &nbsp; // Other config &nbsp; &nbsp; 'profiler.enable' =&gt; function() { &nbsp; &nbsp; &nbsp; &nbsp; return rand(1, 100) === 42; &nbsp; &nbsp; } ); </code></p>



<ul class="wp-block-list"><li>‌</li></ul>



<p>默认配置的此函数仅仅做了节流，截取1%的流量进行分析。这是基于生产环境的性能考虑，如果我们仅仅是在开发环境中使用，就不需要管这么多了。‌‌例如</p>



<p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<code>// In config/config.php return array( &nbsp; &nbsp; // Other config &nbsp; &nbsp; 'profiler.enable' =&gt; function() { &nbsp; &nbsp; &nbsp; &nbsp; return true; &nbsp; &nbsp; } ); </code></p>



<ul class="wp-block-list"><li>‌</li></ul>



<p>这个配置就会把所有流量全部截取分析。‌‌令人哭笑不得的是，这所有流量包括了xhgui.fqdn的流量，这显然不是我们想要分析的。‌‌还有的时候我们也不想看到dev.fqdn中管理界面的流量，这就需要一些进阶配置了。‌‌例如</p>



<p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<code>'profiler.enable' =&gt; function() { &nbsp; &nbsp; &nbsp; &nbsp; $url = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; &nbsp; &nbsp; &nbsp; &nbsp; if (strpos($url, 'dev.fqdn/admin') === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false; &nbsp; &nbsp; &nbsp; &nbsp; } elseif (strpos($url, 'dev.kucloud.win') === 0) { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true; &nbsp; &nbsp; &nbsp; &nbsp; } &nbsp; &nbsp; &nbsp; &nbsp; return false; &nbsp; &nbsp; }, </code></p>



<ul class="wp-block-list"><li>‌</li></ul>



<p>这样一来就只会看到我们希望分析的请求了。</p>



<p>参考：‌‌</p>



<p><a href="https://phperzh.com/articles/3235">phperzh</a>‌‌</p>



<p><a href="https://github.com/perftools/xhgui/blob/master/README.md">Xhgui </a></p>



<p><a href="https://github.com/perftools/xhgui/blob/master/README.md">Readme</a></p>The post <a href="https://blog.eastonman.com/blog/2018/11/use-tideways-and-xhgui-to-analyze-php-performance/">Tideways与Xhgui实现PHP性能分析实践</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2018/11/use-tideways-and-xhgui-to-analyze-php-performance/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Typecho性能优化实践</title>
		<link>https://blog.eastonman.com/blog/2018/07/typecho-performance-optimisation/</link>
					<comments>https://blog.eastonman.com/blog/2018/07/typecho-performance-optimisation/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Thu, 05 Jul 2018 08:02:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2018/07/05/typecho-performance-optimisation/</guid>

					<description><![CDATA[<p>预计阅读时间： 5 分钟 本文将从全栈角度分析typecho性能提升关键，并最终实现首屏时间缩短到1s以内 文 [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2018/07/typecho-performance-optimisation/">Typecho性能优化实践</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 5 分钟</p>
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>本文将从全栈角度分析typecho性能提升关键，并最终实现首屏时间缩短到1s以内</p>



<p></p>



<p>文中服务器是用的是tsukaeru 日本2核1G内存 50G SSD 100Mbps网络的KVM架构vps 到国内电信延迟约150ms<br>IO约170MB/s(超过1Gbps), UnixBench 双核跑分1400左右<br>对于个人网站来说算是中等偏上的配置</p>



<h1 class="wp-block-heading" id="-">后端</h1>



<h2 class="wp-block-heading" id="php">PHP</h2>



<p>php版本毋庸置疑地影响着以php架构的typecho的运行<br>php7 相比于php5.x 性能的提升是质的飞跃<br>同样的typecho版本分别在两个版本的php下执行时间想去甚远<br>在typecho根目录下执行index.php时间对比</p>



<pre class="wp-block-code"><code>user@fqdn:# time php index.php > /dev/null 2>&amp;1 
real    0m1.525s
user    0m0.180s
sys     0m0.036s
# php5.6.33
</code></pre>



<pre class="wp-block-code"><code>user@fqdn:# time php index.php > /dev/null 2>&amp;1 
real    0m0.178s
user    0m0.067s
sys     0m0.006s
# php7.2.7
</code></pre>



<p>php性能直接影响TTFB(首字节时间)，趁早升级吧。</p>



<h2 class="wp-block-heading" id="opcache">Opcache</h2>



<p><code>Opcache</code>是php缓存器，类似的还有<code>eAccelerater</code>等。<br><code>Opcache</code>加入编译可以进一步加速高并发时php的效率<br>通常而言php官方源中已经加入Opcache，各大一键lnmp脚本或管理面板都会安装Opcache<br>以下是多次执行后再次执行index.php的耗时</p>



<pre class="wp-block-code"><code>user@fqdn:# time php index.php > /dev/null 2>&amp;1 
real    0m0.093s
user    0m0.037s
sys     0m0.007s
# php7.2.7 第二次执行
</code></pre>



<p>可以看出，此时php执行已经非常快了，若是在国内或是香港的vps上，TTFB已经可以缩短到通常建议的300ms以下了</p>



<h2 class="wp-block-heading" id="mencached">Mencached</h2>



<p>通常大型php站点都会配置页面缓存，这样在高并发下的性能优势非常突出。<br>typecho作为轻量级博客框架，并没有自带Memcached缓存的功能。好在插件总是万能的<br>推荐一个<a href="https://github.com/phpgao/TpCache">TpCache插件</a><br>支持Memcache, Memcached和Redis，功能算是比较完善的了。<br>开启缓存插件后高并发瓶颈从cpu性能变成了网络带宽(100Mbps占满)。</p>



<p>下图是在loader.io压测下1700并发一分钟的结果</p>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/2526434504-1024x875.jpg" alt="" class="wp-image-195" width="278" height="237" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/2526434504-1024x875.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2020/08/2526434504-300x256.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/2526434504-768x656.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2020/08/2526434504.jpg 1076w" sizes="(max-width: 278px) 100vw, 278px" /></figure>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/3243333678-1024x736.jpg" alt="" class="wp-image-197" width="286" height="206" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/3243333678-1024x736.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2020/08/3243333678-300x216.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/3243333678-768x552.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2020/08/3243333678.jpg 1080w" sizes="(max-width: 286px) 100vw, 286px" /></figure>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/2497857299-1024x987.jpg" alt="" class="wp-image-196" width="265" height="255" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/2497857299-1024x987.jpg 1024w, https://blog.eastonman.com/wp-content/uploads/2020/08/2497857299-300x289.jpg 300w, https://blog.eastonman.com/wp-content/uploads/2020/08/2497857299-768x740.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2020/08/2497857299.jpg 1079w" sizes="(max-width: 265px) 100vw, 265px" /></figure>



<p>安利一下loader.io，这是一个sendgrid旗下的压力测试工具，免费版最高可以使用美每秒850新链接。</p>



<p>此时服务器cpu占用仍维持在80%左右，nginx两个worker process 各30% ，memcached 和php-fpm 均在10%以下<br>mysql为0%</p>



<p>实际可以达到的并发数大概在1000~1100并发左右，这对于个人网站来说，除非遭到ddcc，根本不可能有如此大的并发数。</p>



<h2 class="wp-block-heading" id="nginx">Nginx</h2>



<h3 class="wp-block-heading" id="worker-process">Worker Process</h3>



<p>一般而言推荐保持和CPU核心数一样，比如2。<br>默认的配置是1，如果在多核服务器上这会导致CPU仅利用一核。<br>也可以配置为auto。</p>



<h3 class="wp-block-heading" id="tcpfastopen">TcpFastOpen</h3>



<p>TFO 可以使在session过期前再次发起tcp链接的时候不需要再次进行3次握手，直接传输数据，对于服务器放在国外的网站还是很有用的，tcp握手通常需要花费200ms以上的时间，这对于1s左右的加载时间还是不可忽视的。</p>



<p>在Nginx配置的server段监听端口后添加tcpfastopen=3</p>



<p>如</p>



<pre class="wp-block-code"><code>listen 443 ssl tcpfastopen=3 ;
</code></pre>



<h2 class="wp-block-heading" id="linux-kernel">Linux Kernel</h2>



<p>同样也有tcpfastopen 设置，开启方法大家google一下</p>



<p>推荐开启BBR tcp拥塞算法<br>对于Ubuntu 16.04, 可以执行</p>



<pre class="wp-block-code"><code>echo 'net.core.default_qdisc=fq' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' >> /etc/sysctl.conf
</code></pre>



<p>如果系统默认的文件打开数太小，可以扩大一些<br>比如Ubuntu默认1024，高并发时可能会出现文件打开数过多的错误。<br>使用以下命令</p>



<pre class="wp-block-code"><code>ulimit -n 50000
</code></pre>



<p>可以添加到启动脚本以实现每次开机自动调整nofile限制。</p>



<h1 class="wp-block-heading" id="--1">前端</h1>



<h2 class="wp-block-heading" id="js-">js异步加载</h2>



<p>非异步加载的JavaScript会阻塞DOM load事件，因为js可以修改dom tree 故浏览器在js执行时不会进行渲染。<br>但是其实很多js都是不操作dom树的，比如用户统计所用的js和页面交互的js。我们可以使用 async 和defer 使得这些js的加载不阻塞浏览器渲染</p>



<h2 class="wp-block-heading" id="css-">CSS 压缩</h2>



<p>css压缩是用gulp-minify 实现的，在主题发布时已经完成。</p>



<h2 class="wp-block-heading" id="pjax">PJAX</h2>



<p>PJAX = pushState + AJAX<br>事实上就是ajax异步传输页面内容后用pushState更新浏览器历史记录，统计数据等。<br>这样使得我们不需要重新渲染页脚，侧栏等页面共有的部分。<br>实现方法可以参考New Material主题。<br>盲目地全页面pjax反倒是适得其反的。</p>



<h2 class="wp-block-heading" id="lazyload">Lazyload</h2>



<p>非首屏图片懒加载，也就是直到图片进入视野中时才加载图面，这样在加载首屏时就可以节省很多时间。<br>实现方法也可以参考New Material主题。</p>



<h1 class="wp-block-heading" id="--2">最终效果</h1>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/811845698-993x1024.jpg" alt="" class="wp-image-198" width="381" height="392" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/811845698-993x1024.jpg 993w, https://blog.eastonman.com/wp-content/uploads/2020/08/811845698-291x300.jpg 291w, https://blog.eastonman.com/wp-content/uploads/2020/08/811845698-768x792.jpg 768w, https://blog.eastonman.com/wp-content/uploads/2020/08/811845698.jpg 1047w" sizes="(max-width: 381px) 100vw, 381px" /></figure>



<figure class="wp-block-image size-large is-resized kg-card kg-image-card"><img loading="lazy" decoding="async" src="https://blog.eastonman.com/wp-content/uploads/2020/08/2004830255.jpg" alt="" class="wp-image-199" width="312" height="322" srcset="https://blog.eastonman.com/wp-content/uploads/2020/08/2004830255.jpg 655w, https://blog.eastonman.com/wp-content/uploads/2020/08/2004830255-290x300.jpg 290w" sizes="(max-width: 312px) 100vw, 312px" /></figure>



<p>可以看到，在这样的网络延迟下，DOM树加载完毕仅在html下载完成后一百多毫秒，ttfb也是接近网络延迟，服务器处理时间仅有二十几毫秒。这次的性能优化还是很有效果的。</p>



<p>水平有限，如有错误之处欢迎指正。</p>
</div></div>



<p></p>The post <a href="https://blog.eastonman.com/blog/2018/07/typecho-performance-optimisation/">Typecho性能优化实践</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2018/07/typecho-performance-optimisation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>博客搬迁拾遗</title>
		<link>https://blog.eastonman.com/blog/2018/06/blog-migration-note-0/</link>
					<comments>https://blog.eastonman.com/blog/2018/06/blog-migration-note-0/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Fri, 08 Jun 2018 08:13:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2018/06/08/blog-migration-note-0/</guid>

					<description><![CDATA[<p>预计阅读时间： 4 分钟 最近把博客从RFCHost家的洛杉矶GIA CN2小鸡上搬到tsukaeru的日本I [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2018/06/blog-migration-note-0/">博客搬迁拾遗</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 4 分钟</p>
<p><!--kg-card-begin: markdown--></p>
<p>最近把博客从RFCHost家的洛杉矶GIA CN2小鸡上搬到tsukaeru的日本IIJ线路的VPS上，价格相差无几，但tsukaeru家的适合建站，所以我就把博客搬过来了</p>
<p>GIA CN2虽然线路很好，但是配置实在有点低(估计主要跨Wa11上网用)。tsu家这台IO非常不错，接近bwg家的1Gbps<br />
,还给免费50G备份空间，2H1G 50G SSD。原来那台是1H512M 10G SSD ,装完lnmp就60%占用了！最近tsu促销，果断搬迁博客。<br />
以下是搬迁过程中遇到的问题和解决方案</p>
<h2 id="accessdeniednoinputfilefound">Access denied &amp; No input file found</h2>
<p>这个是老问题了，网上也有很多地方有解释，官方安装教程也有。<br />
就是那个<code>cgi.fix_pathinfo</code><br />
把<code>php.ini</code>文件中的<code>cgi.fix_pathinfo=0</code>改成<code>cgi.fix_pathinfo=1</code>就行了<br />
<code>php.ini</code>文件在哪里？<br />
对于oneinstack安装的php，在<code>/usr/local/php/etc/php.ihi</code><br />
对于ubuntu系统自带的php在<code>/etc/php/fpm/php.ini</code><br />
实在找不到可以放大招：<code>phpinfo();</code><br />
在命令行使用交互模式(php -a)输入<code>phpinfo();</code>仔细找一找<code>php.ini</code>的位置<br />
什么？输出太多不想找？<br />
那只好系统帮我找一找了</p>
<pre><code>echo 'phpinfo();' &gt; 1.php
php 1.php | grep 'php.ini'
</code></pre>
<p>当然你也可以暴力一些</p>
<pre><code>find php.ini /
</code></pre>
<h2 id="404">首页正常二级页面全部404</h2>
<p>这是typecho伪静态的问题，需要向nginx配置文件http-&gt;server的内部添加</p>
<pre><code>if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php$1 last;
}
</code></pre>
<h2 id="fastcgi_params">fastcgi_params配置</h2>
<p>nginx给出的默认配置文件在http-&gt;server-&gt;location块使用</p>
<pre><code>fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
include        fastcgi_params;
</code></pre>
<p>但是Oneinstack的处理是将SCRIPT_FILENAME加入fastcgi_params中，我个人认为这种做法更清晰明了，推荐这样的做法。</p>
<h2 id="">目录权限</h2>
<p>我每次安装typecho都是直接clone项目在复制的(反正最近的commit都是修bug)，有时会有权限问题<br />
根目录下</p>
<pre><code>var
usr/themes
usr/uploads
usr/plugins
</code></pre>
<p>这些目录最好都<br />
<code>chown -R www:www</code></p>
<h2 id="tpcache">缓存插件TpCache</h2>
<p><a href="https://github.com/phpgao/TpCache">Github项目</a><br />
这个插件应该是比较完善的，据作者readme,原生评论测试过可以更新缓存。第三方评论就更加没所谓啦。</p>
<p>启用之前要先在服务器安装好Memcached、memcache或Redis，据说Memcached在键值较大时性能较优，本博客就选择的是Memcached。<br />
当然一键包啦，安装和php扩展一并搞定。<br />
哦对了，推荐一键包Oneinstack<br />
直接下载<a href="http://mirrors.linuxeye.com/oneinstack.tar.gz">Oneinstack不含源码版</a><br />
个人认为比军哥的lnmp.org的要好(而且开源)</p>
<h2 id="comment2mail">Comment2Mail</h2>
<p>这是常规啦<br />
只是为什么总是发件人Root root@localhost<br />
我明明配置的是Sendgrid的smtp发信啊<br />
难道源码有问题？<br />
有谁知道吗？</p>
<h2 id="">数据迁移</h2>
<p>typecho自带的导出导入已经基本够用了<br />
但是之前曾经用过iviews插件，修改过数据库结构(也不告诉我&#8230;&#8230;)到了导入的时候出错了(typecho也真是奇怪，导出不检查数据库结构，导入检查)<br />
不想改动数据库，干脆在原来那里删了那张views表<br />
嗯<br />
所以还是我的NewMaterial主题好，用自定义字段统计，不乱改数据库。</p>
<p>暂时想到的就这些吧<br />
其他的服务器安全加固等等就不写在这里了</p>
<p><!--kg-card-end: markdown--></p>The post <a href="https://blog.eastonman.com/blog/2018/06/blog-migration-note-0/">博客搬迁拾遗</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2018/06/blog-migration-note-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP7.0+中isset()函数的行为变更</title>
		<link>https://blog.eastonman.com/blog/2018/06/isset-function-implement-change-in-php7/</link>
					<comments>https://blog.eastonman.com/blog/2018/06/isset-function-implement-change-in-php7/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Mon, 04 Jun 2018 12:19:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2018/06/04/isset-function-implement-change-in-php7/</guid>

					<description><![CDATA[<p>预计阅读时间： 2 分钟 最近写模板又遇到问题了，同样的代码在测试机上正常工作，换到线上又出错了，后来一看，是 [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2018/06/isset-function-implement-change-in-php7/">PHP7.0+中isset()函数的行为变更</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 2 分钟</p>
<p>最近写模板又遇到问题了，同样的代码在测试机上正常工作，换到线上又出错了，后来一看，是php7的锅&#8230;&#8230;</p>
<figure class="kg-card kg-image-card"><img decoding="async" src="https://blog.geekman.dev/wp-content/uploads/2020/08/5b42ef5037aa3.jpg" class="kg-image"></figure>
<p>php7+中isset()函数在判断类成员是否设置时的行为与php5.6有所不同。 我们先来看看php的官方git commit message</p>
<pre><code>
PHP 7 has fixed a bug with __isset which affects both the native isset and empty methods. This causes specific issues 
with checking isset or empty on relations in Eloquent. In PHP 7 checking if a property exists on an unloaded relation, 
for example isset($this-&gt;relation-&gt;id) is always returning false because unlike PHP 5.6, PHP 7 is now checking the offset of each attribute before chaining to the next one. In PHP 5.6 it would eager load the relation 
without checking the offset. This change brings back the intended behavior of the core Eloquent model __isset method 
for PHP 7 so it works like it did in PHP 5.6.

For reference, please check the following link, specifically Nikita Popov's comment (core PHP dev) - https://bugs.php.net/bug.php?id=69659

</code></pre>
<p>假设我们有如下php代码</p>
<pre><code>&lt;?php

class Post
{
    protected $attributes = ['foo' =&gt; 'bar'];

    public function __get($key)
    {
        if (isset($this-&gt;attributes[$key])) {
            return $this-&gt;attributes[$key];
        }
    }
}

$post = new Post();
echo isset($post-&gt;foo);  // false

</code></pre>
<p>我们会发现无论如何isset总是返回false<br />因为变量foo不是类Post的成员<br />也就是说，PHP7开始，isset执行前不会先执行-&gt;<br />也就是__get()函数</p>
<p>当然也可使用魔术方法__isset解决此问题</p>
<pre><code>
&lt;?PHP
class Post
{
    protected $attributes = ['foo' =&gt; 'bar'];

    public function __get($key)
    {
        if (isset($this-&gt;attributes[$key])) {
            return $this-&gt;attributes[$key];
        }
    }

    public function __isset($key)
    {
        if (isset($this-&gt;attributes[$key])) {
            return true;
        }

        return false;
    }
}

$post = new Post();
echo isset($post-&gt;foo);   //true

</code></pre>
<p>此时我们可以看到isset()返回了true<br />因为我们对类Post执行isset()时调用了我们定义的__isset()函数，而__isset()函数中的isset()是可以访问foo的，故此处返回true</p>
<p>当遇到<code>isset($widget-&gt;fields-&gt;$var)</code><br />这样的写法时<br />php5.6 和以前会先执行<code>$widget-&gt;fields-&gt;$var</code><br />php7则会在每次调用前执行isset<br />于是typecho常用的判断自定义字段是否为空的代码<br /><code>isset($widget-&gt;fields-&gt;$var)</code><br />总是返回false<br />网上大多数判断typecho自定义字段是否设置的教程都直接使用isset函数，当然会在php7的线上环境下出问题啊。<br />从兼容性角度考虑，建议还是写</p>
<pre><code>if ($widget-&gt;fields-&gt;$var !== NULL){
    //code...
}
</code></pre>
<p>比较保险。</p>The post <a href="https://blog.eastonman.com/blog/2018/06/isset-function-implement-change-in-php7/">PHP7.0+中isset()函数的行为变更</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2018/06/isset-function-implement-change-in-php7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SSH公钥配置&#8211;从github导入</title>
		<link>https://blog.eastonman.com/blog/2018/04/ssh-public-key-import-from-github/</link>
					<comments>https://blog.eastonman.com/blog/2018/04/ssh-public-key-import-from-github/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Fri, 06 Apr 2018 12:43:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2018/04/06/ssh-public-key-import-from-github/</guid>

					<description><![CDATA[<p>预计阅读时间： 1 分钟 原理 主要利用的是Github的公钥公开地址‌‌比如我的是Github keys‌‌ [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2018/04/ssh-public-key-import-from-github/">SSH公钥配置–从github导入</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 1 分钟</p>
<p><!--kg-card-begin: markdown--></p>
<h1 id="">原理</h1>
<p><!--kg-card-end: markdown--></p>
<p>主要利用的是Github的公钥公开地址‌‌比如我的是<a href="https://github.com/manyang901.keys">Github keys</a>‌‌形如<code>https://githib.com/{username}.keys</code></p>
<h1 id="-">使用</h1>
<p>每次只要执行curl https://&#8230;. &gt;&gt; .ssh/authorized_keys‌‌就可以快速搞定了</p>
<p>还要注意权限问题，如果原本就有.ssh/authorzied_keys就没什么问题‌‌若是新创建的要.ssh 700‌‌.ssh/authorized_keys 600‌‌ssh对公钥读写还是有安全要求的。</p>
<p>居然有大佬写了个脚本？<a href="https://github.com/KiritoMiao/SSHKEY_Installer">SSHKEY_Installer</a></p>
<p>一阵无语&#8230;&#8230;</p>
<p>这个脚本有一个好，顺便帮忙关了密码登录。搞定了.ssh目录下的权限问题。</p>The post <a href="https://blog.eastonman.com/blog/2018/04/ssh-public-key-import-from-github/">SSH公钥配置–从github导入</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2018/04/ssh-public-key-import-from-github/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Telegram Bot 创建</title>
		<link>https://blog.eastonman.com/blog/2018/02/create-telegram-bot/</link>
					<comments>https://blog.eastonman.com/blog/2018/02/create-telegram-bot/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Mon, 05 Feb 2018 14:42:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2018/02/05/create-telegram-bot/</guid>

					<description><![CDATA[<p>预计阅读时间： 1 分钟 Telegram Bot 创建 在telegram中找到@Botfather（他是所 [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2018/02/create-telegram-bot/">Telegram Bot 创建</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 1 分钟</p>
<h2 id="telegram-bot-">Telegram Bot 创建</h2>
<p>在telegram中找到<a href="https://t.me/botfather">@Botfather</a><br />（他是所有bot的爸爸所以叫botfather）<br />所有的bot都要通过他产生</p>
<p>给他发 <code>/newbot</code>就可以开始创建一个bot</p>
<p>跟随指引输入bot名字和用户名就成功了</p>
<figure class="kg-card kg-image-card"><img decoding="async" src="/content/images/2019/10/3332594919.jpg" class="kg-image" alt="Screenshot_20180205-224610__01.jpg"></figure>
<p>随后你会获得一个webapi的token</p>
<p>拿着这个token就可以开始玩耍了</p>
<h2 id="-chat-id">获取自己的Chat Id</h2>
<p>很多情况下若是给自己使用的bot都会需要自己的chat id<br />这里提供一个简单的获取办法<br /><a href="https://t.me/userinfobot">@userinfobot</a> &#8212; 获取chat id 的bot</p>
<p>发任意内容即可获得自己的chat id</p>
<h2 id="bot-">bot 能干什么呢？</h2>
<p>可以用来提醒</p>
<figure class="kg-card kg-image-card"><img decoding="async" src="/content/images/2019/10/4189671647.jpg" class="kg-image" alt="Screenshot_20180205-225452__01.jpg"></figure>
<p>还有很多功能<br />比如teleshell，可以通过telegram远程在服务器上执行shell命令。</p>The post <a href="https://blog.eastonman.com/blog/2018/02/create-telegram-bot/">Telegram Bot 创建</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2018/02/create-telegram-bot/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>使用hexo创建个人博客</title>
		<link>https://blog.eastonman.com/blog/2017/10/use-hexo-to-setup-a-personal-blog/</link>
					<comments>https://blog.eastonman.com/blog/2017/10/use-hexo-to-setup-a-personal-blog/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Sun, 29 Oct 2017 05:18:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2017/10/29/use-hexo-to-setup-a-personal-blog/</guid>

					<description><![CDATA[<p>预计阅读时间： 3 分钟 本站采用的就是hexo，主题是next 如何用hexo建立个人博客 下载和安装hex [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2017/10/use-hexo-to-setup-a-personal-blog/">使用hexo创建个人博客</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 3 分钟</p>
<p><s>本站采用的就是hexo，主题是next</s></p>
<h1 id="-hexo-">如何用hexo建立个人博客</h1>
<h2 id="-hexo">下载和安装hexo</h2>
<p>hexo需要node.js的支持，前往<a href="https://nodejs.org/en/">node.js官网</a>或<a href="http://nodejs.cn">node.js中文网</a>下载和安装。<br />在官网上有安装指导和问题解答，选择LTS版本安装，因为作者本人曾因为装了最新版的导致hexo不兼容安装失败<br />hexo官方网站在<a href="https://hexo.io/">hexo.io</a>，去官网上按照指引安装</p>
<p>npm install hexo-cli -g</p>
<p>hexo init blog</p>
<p>cd blog</p>
<p>hexo s</p>
<p>如果在本地4000端口看到了hexo的界面说明安装成功了</p>
<hr>
<h2 id="-">新建文章</h2>
<p>hexo new 文章名字</p>
<p>如果文章名字中间有空格那就必须加引号</p>
<p>hexo new &#8220;文章   名字&#8221;</p>
<p>hexo就会在source/_post/下创建一个&#8221;文章名字.md&#8221;<br />然后就可以直接用记事本编辑，也可以用各类markdown编辑器编辑。注意hexo采用的是Github Favored Markdown，书写规范与标准Markdown有微小区别，可以查阅github上的说明</p>
<hr>
<h2 id="--1">发布文章</h2>
<h3 id="github-pages-git-">Github Pages和各类git发布</h3>
<p>Github Pages是一个免费的静态博客托管平台，国内外也有很多其它的静态博客托管平台是采用git方式提交页面的，所以常用的就是git-deploy</p>
<p>安装hexo插件</p>
<p>npm install hexo-deployer-git &#8211;save</p>
<p>修改__站点配置文件__中的deploy字段(尽量使用ssh方式连接服务器，防止在windows命令行中http连接错误)</p>
<pre><code>deploy:
  type: git
  repo:"git@github.com:manyang901manyang901.github.io"

</code></pre>
<p>当然要先在git bash中配置好ssh私钥，保证可以通过ssh连接到服务器</p>
<hr>
<h2 id="--2">通用的发布方法</h2>
<p>在hexo生成的blog文件夹，使用</p>
<p>hexo generate</p>
<p>hexo就会在文件夹里生成一个新的文件夹public，这个文件夹里包含了所有需要的静态文件，直接复制这个文件夹的所有文件到服务器上就可以了</p>
<h2 id="tags-categories-">tags与categories分类</h2>
<p>hexo中可以使用tags标签或categories分类来对文章进行整理，两者其实区别不大，此处以tags为例介绍如何使用。<br />首先在欲分类的post的md文件的font里面找到（没有的新增）tags键，添加想要的键值，注意遵循YAML标准（也可以用JSON编写），注意冒号后面有一个空格，如</p>
<pre><code>
---
title: 使用hexo创建个人博客
date: 2016-10-21 21:30:38
tags: tech
---

</code></pre>
<p>然后输入命令</p>
<p>hexo new page tags</p>
<p>hexo会在source文件夹下生成tags文件夹，新建index.md，修改这个md文件的font，如下</p>
<pre><code>---
title: tags
date: 2016-11-11 20:23:38
type: "tags"
comments: false
---

</code></pre>
<p>然后照常更新和布署就可以看到有一个tags（标签）页面出现，并且自动生成好各个tag的文章</p>The post <a href="https://blog.eastonman.com/blog/2017/10/use-hexo-to-setup-a-personal-blog/">使用hexo创建个人博客</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2017/10/use-hexo-to-setup-a-personal-blog/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>在Daocloud上部署私有云</title>
		<link>https://blog.eastonman.com/blog/2017/10/deploy-private-cloud-service-on-daocloud/</link>
					<comments>https://blog.eastonman.com/blog/2017/10/deploy-private-cloud-service-on-daocloud/#respond</comments>
		
		<dc:creator><![CDATA[Easton Man]]></dc:creator>
		<pubDate>Sun, 29 Oct 2017 02:13:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">https://blog.eastonman.com/2017/10/29/deploy-private-cloud-service-on-daocloud/</guid>

					<description><![CDATA[<p>预计阅读时间： 4 分钟 Daocloud目前免费提供两个docker容器供大家免费使用，有没有想过用它们来干 [&#8230;]</p>
The post <a href="https://blog.eastonman.com/blog/2017/10/deploy-private-cloud-service-on-daocloud/">在Daocloud上部署私有云</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wpwc-reading-time">预计阅读时间： 4 分钟</p>
<p>Daocloud目前免费提供两个docker容器供大家免费使用，有没有想过用它们来干些什么？<br />Daocloud目前提供2个docker容器共免费使用，所以就可以自己做一个小小的私有云啦！要是你想要更多的空间或是更快的响应速度和带宽，可以购买更多容器集群，14元rmb一个容器每月。</p>
<hr>
<h2 id="-">为什么要选择私有云</h2>
<p>有人可能会问，既然百度、360、微云都已经做的可以了，速度不算太慢，存储空间甚至大的恐怖，那为什么还要使用私有云啊？<br />使用公有云有几个弊端：</p>
<ul>
<li>个人隐私难以保证。百度等云盘有“秒传”功能，实际上就是在上传前先检测在服务器上是否有相同的文件，然后把这个文件转到你的盘里。可是这样一来，你的数据毫无隐私可言了。国外的云盘一般都会保证不查看用户数据，但可惜都被墙了</li>
<li>数据安全难以保证。有没有发现你分享的文件可能过几个月甚至几天就失效啦？由于相关法律和规定删除了文件？国内的网盘都有这样的问题</li>
<li>对纯浏览器用户不友好。“高速下载请先安装百度云管家”“下载请用客户端登录”，怎么就不能直接下载呢？</li>
<li>捆绑的广告多。“试用加速包”“开通会员”，还有各种广告泛滥，怎么这么烦人啊</li>
</ul>
<p>这就是为什么我们需要私有云，私有云克服了几乎以上所有缺点：</p>
<ul>
<li>个人隐私保证。</li>
<li>数据掌握在自己手里。</li>
<li>无需客户端直接上传下载。</li>
<li>绝对干净无广告。</li>
<li>免费自带离线下载功能。</li>
<li>在线打开文件。</li>
<li>多用户管理。</li>
</ul>
<p>当然私有云也有缺点：</p>
<ul>
<li>免费空间少，多空间需付费。</li>
<li>响应相对慢。</li>
<li>需要一些技术知识</li>
</ul>
<p>当然相信看到这里的都是技术客，就不需要担心技术问题了</p>
<h2 id="--1">注册帐号</h2>
<p>注册这种事情就不说了，相信大家都懂</p>
<h2 id="-mysql">新建服务MySQL</h2>
<p>添加一个新的集成服务MySQL，Daocloud提供的两个容器其中一个就用在这里，可以获得128MB内存，2GB存储的MySQL服务，这时记住服务的内网IP地址、数据库名、用户名和密码。<br />如果喜欢postgreSQL可以换为postgreSQL，步骤基本相同</p>
<h2 id="-owncloud">新建镜像Owncloud</h2>
<p>在daocloud的镜像仓库里找到owncloud的镜像直接布署，或者如果你想要离线下载功能的话，可以找别人的owncloud-with-osdownload镜像布署，版本选最新的</p>
<h2 id="--2">绑定服务</h2>
<p>镜像布署完毕后选择绑定服务，绑定之前创建的MySQL</p>
<h2 id="-owncloud-1">配置owncloud</h2>
<p>通过Daocloud给的访问地址访问owncloud，会看到owncloud的配置界面，这时设置管理员帐号和密码，数据库选择MySQL/MariaDB（布署了postgreSQL的选择postgreSQL）输入刚才记下的服务IP、数据库名、用户名和密码，等待owncloud配置好数据库就可以啦，刷新页面就可以看到自己的owncloud私有云了</p>
<h2 id="--3"><s>这个私有云很安全稳定</s></h2>
<p>鉴于Daocloud的免费服务很不稳定，owncloud镜像每隔几天就要重新启动一次，也就是说每隔几天就要重新配置数据库，虽然数据不会丢失，但是总要配置很烦，所以还是建议大家想要稳定私有云的同志购买付费服务。或者购买vps</p>The post <a href="https://blog.eastonman.com/blog/2017/10/deploy-private-cloud-service-on-daocloud/">在Daocloud上部署私有云</a> first appeared on <a href="https://blog.eastonman.com">Easton Man's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.eastonman.com/blog/2017/10/deploy-private-cloud-service-on-daocloud/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
