<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Lamp on DoDoRo的梦想空间-码农,数学,算法,哲学,园艺</title>
    <link>https://dodoro.chouxiangpai.com/categories/lamp/</link>
    <description>Recent content in Lamp on DoDoRo的梦想空间-码农,数学,算法,哲学,园艺</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 10 Jun 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://dodoro.chouxiangpai.com/categories/lamp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>git提交或克隆报错fatal: unable to access ‘https://github.com/tata20191003/autowrite.git/‘: Failed to connec</title>
      <link>https://dodoro.chouxiangpai.com/archives/2022/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/2022/</guid>
      <description>&lt;p&gt;1.问题原因 报错信息：&lt;/p&gt;
&lt;p&gt;fatal: unable to access &amp;lsquo;&lt;a href=&#34;https://github.com/xxx/autowrite.git/&#34;&gt;https://github.com/xxx/autowrite.git/&lt;/a&gt;&amp;rsquo;: OpenSSL SSL_read: Connection was reset, errno 10054 1 2 又或者&lt;/p&gt;
&lt;p&gt;fatal: unable to access &amp;lsquo;&lt;a href=&#34;https://github.com/xxx/autowrite.git/&#34;&gt;https://github.com/xxx/autowrite.git/&lt;/a&gt;&amp;rsquo;: Failed to connect to github.com port 443: Timed out 1 2 因为git在拉取或者提交项目时，中间会有git的http和https代理，但是我们本地环境本身就有SSL协议了，所以取消git的https代理即可，不行再取消http的代理。&lt;/p&gt;
&lt;p&gt;后续 原因还有一个，当前代理网速过慢，所以偶尔会成功，偶尔失败。&lt;/p&gt;
&lt;p&gt;2.解决方案 1.在项目文件夹的命令行窗口执行下面代码，然后再git commit 或git clone 取消git本身的https代理，使用自己本机的代理，如果没有的话，其实默认还是用git的&lt;/p&gt;
&lt;p&gt;//取消http代理 git config &amp;ndash;global &amp;ndash;unset http.proxy //取消https代理 git config &amp;ndash;global &amp;ndash;unset https.proxy 1 2 3 4 2.科学上网（vpn） 这样就能提高服务器连接速度，能从根本解决 time out 443问题&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&#34;https://blog.csdn.net/good_good_xiu/article/details/118567249&#34;&gt;https://blog.csdn.net/good_good_xiu/article/details/118567249&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于ASP.NET Core的整洁架构</title>
      <link>https://dodoro.chouxiangpai.com/archives/1912/</link>
      <pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/1912/</guid>
      <description>&lt;p&gt;干净体系结构将业务逻辑和应用程序模型置于应用程序的中心。 而不是让业务逻辑依赖于数据访问或其他基础设施，此依赖关系被倒置：基础结构和实现细节依赖于应用程序内核。 此功能是通过在应用程序核心中定义抽象或接口来实现的，然后通过基础设施层中定义的类型实现。 将此体系结构可视化的常用方法是使用一系列同心圆，类似于洋葱。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;images/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230607112509.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1912/images/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230607112509.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;遵循依赖倒置原则以及域驱动设计原则 (DDD) 的应用程序倾向于达到类似的体系结构。 多年来，这种体系结构有多种名称。 最初的名称之一是六边形体系结构，然后是端口 - 适配器。 最近，它被称为洋葱体系结构或干净体系结构。 此电子书中将后一种名称“干净体系结构”用作此体系结构的名称。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;images/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230607112522.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1912/images/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230607112522.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在此关系图中，依赖关系流向最里面的圆。 “应用程序内核”因其位于此关系图的核心位置而得名。 从关系图上可见，该应用程序内核在其他应用程序层上没有任何依赖项。 应用程序的实体和接口位于正中心。 在外圈但仍在应用程序核心中的是域服务，它通常实现内圈中定义的接口。 在应用程序内核外面，UI 和基础结构层均依赖于应用程序内核，但不一定彼此依赖。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;images/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230607112541.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1912/images/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230607112541.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>当你在浏览器地址栏输入一个网址的时候，会发生什么?</title>
      <link>https://dodoro.chouxiangpai.com/archives/1801/</link>
      <pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/1801/</guid>
      <description>&lt;p&gt;作为一个软件开发者，你一定会对网络应用如何工作有一个完整的层次化的认知，同样这里也包括这些应用所用到的技术：像浏览器，HTTP，HTML，网络服务器，需求处理等等。&lt;/p&gt;
&lt;p&gt;本文将更深入的研究当你输入一个网址的时候，后台到底发生了一件件什么样的事&lt;/p&gt;
&lt;h2 id=&#34;1-首先你得在浏览器里输入要网址&#34;&gt;1 首先，你得在浏览器里输入要网址:&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;images/1.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1801/images/1.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;2-浏览器查找域名的ip地址&#34;&gt;2 浏览器查找域名的IP地址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;images/image13.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1801/images/image13.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下：&lt;/p&gt;
&lt;p&gt;浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是，操作系统没有告诉浏览器储存DNS记录的时间，这样不同浏览器会储存个自固定的一个时间（2分钟到30分钟不等）。&lt;/p&gt;
&lt;p&gt;系统缓存 – 如果在浏览器缓存里没有找到需要的记录，浏览器会做一个系统调用（windows里是gethostbyname）。这样便可获得系统缓存中的记录。&lt;/p&gt;
&lt;p&gt;路由器缓存 – 接着，前面的查询请求发向路由器，它一般会有自己的DNS缓存。 ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。&lt;/p&gt;
&lt;p&gt;递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索，从.com顶级域名服务器到Facebook的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名，所以到顶级服务器的匹配过程不是那么必要了。DNS递归查找如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;images/500pxAn_example_of_theoretical_DNS_recursion_svg.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1801/images/500pxAn_example_of_theoretical_DNS_recursion_svg.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;DNS有一点令人担忧，这就是像wikipedia.org 或者 facebook.com这样的整个域名看上去只是对应一个单独的IP地址。还好，有几种方法可以消除这个瓶颈：&lt;/p&gt;
&lt;p&gt;循环 DNS 是DNS查找时返回多个IP时的解决方案。举例来说，Facebook.com实际上就对应了四个IP地址。&lt;/p&gt;
&lt;p&gt;负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点一般都会使用这种昂贵的高性能负载平衡器。&lt;/p&gt;
&lt;p&gt;地理 DNS 根据用户所处的地理位置，通过把域名映射到多个不同的IP地址提高可扩展性。这样不同的服务器不能够更新同步状态，但映射静态内容的话非常好。&lt;/p&gt;
&lt;p&gt;Anycast 是一个IP地址映射多个物理主机的路由技术。 美中不足，Anycast与TCP协议适应的不是很好，所以很少应用在那些方案中。大多数DNS服务器使用Anycast来获得高效低延迟的DNS查找。&lt;/p&gt;
&lt;h2 id=&#34;3-浏览器给web服务器发送一个http请求&#34;&gt;3 浏览器给web服务器发送一个HTTP请求&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;images/image22.png&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/1801/images/image22.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;因为像Facebook主页这样的动态页面，打开后在浏览器缓存中很快甚至马上就会过期，毫无疑问他们不能从中读取。&lt;/p&gt;
&lt;p&gt;所以，浏览器将把一下请求发送到Facebook所在的服务器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET http:&lt;span style=&#34;color:#75715e&#34;&gt;//facebook.com/ HTTP/1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; User-Agent: Mozilla/&lt;span style=&#34;color:#ae81ff&#34;&gt;4.0&lt;/span&gt; (compatible; MSIE &lt;span style=&#34;color:#ae81ff&#34;&gt;8.0&lt;/span&gt;; Windows NT &lt;span style=&#34;color:#ae81ff&#34;&gt;6.1&lt;/span&gt;; WOW64; [...]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Accept-Encoding: gzip, deflate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Connection: Keep-Alive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Host: facebook.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Cookie: datr=&lt;span style=&#34;color:#ae81ff&#34;&gt;1265876274&lt;/span&gt;-[...]; locale=en_US; lsd=WW[...]; c_user=&lt;span style=&#34;color:#ae81ff&#34;&gt;2101&lt;/span&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GET 这个请求定义了要读取的URL： “&lt;a href=&#34;http://facebook.com/&#34;&gt;http://facebook.com/&lt;/a&gt;”。 浏览器自身定义 (User-Agent 头)， 和它希望接受什么类型的相应 (Accept and Accept-Encoding 头). Connection头要求服务器为了后边的请求不要关闭TCP连接。&lt;/p&gt;</description>
    </item>
    <item>
      <title>重新研究网站内容管理系统（CMS）</title>
      <link>https://dodoro.chouxiangpai.com/archives/1177/</link>
      <pubDate>Thu, 15 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/1177/</guid>
      <description>&lt;p&gt;公司是校企，今年打算跟学校合作，承接学校很多信息化建设的网站，功能基本都是信息展示和会员，如果完全重新开发，非常浪费人力资源，所以我想起了CMS系统，这是十几年前非常流行的建站系统。我毕业做的第一个产品就是CMS,当时用ASP.NET技术来开发，参考了非常流行的dedecms、phpcms等同用建站系统，所以我对内容管理系统了解非常深刻。&lt;/p&gt;
&lt;p&gt;这次我们用到的是一个迅睿CMS，也是php语言开发的内容管理系统，我曾经写过一年多的php，对这门语言也比较熟悉。原来本来打算使用微软的开源系统OrchardCMS，这款内容管理系统也非常优秀，代码经典、封装很好，我也研究过他的程序代码，加上部门的同事都是使用.NET语言，但是发现使用OrchardCMS的人不多，插件也少，站长使用不活跃，最终放弃了。&lt;/p&gt;
&lt;p&gt;迅睿CMS免费开源系统是基于PHP7语言采用最新CodeIgniter4作为开发框架生产的网站内容管理框架，提供“电脑网站+手机网站+APP接口”一体化网站技术解决方案。它拥有强大稳定底层框架，以灵活扩展为主的开发理念，二次开发方便且不破坏程序内核，为WEB 艺术家创造的PHP建站程序，堪称PHP万能建站框架。&lt;/p&gt;
&lt;p&gt;上面这段话是官方的介绍，其实我喜欢这个CMS的原因是它的开源协议很好：可以免费使用在任何地方，可以自主进行二次开发；购买授权可以免费使用插件，并且获得升级支持服务，一次授权可以无限次使用。这个就比其他内容管理系统要好，其他都不允许用于商业用途，只给小站长免费开放，购买一次只能用一个站点。&lt;/p&gt;
&lt;p&gt;说到网站内容管理系统，最核心的就是模板语言和标签系统，当然还有内容模块里的模型：通过模型可以自定义任何功能模块的数据模型，然后通过标签语言嵌套HTML页面形成模板，最后发表出来。&lt;/p&gt;
&lt;p&gt;C#和php都是我可以接受的开发语言，我对语言其实没有太大排斥。&lt;/p&gt;</description>
    </item>
    <item>
      <title>IIS如何设置反向代理</title>
      <link>https://dodoro.chouxiangpai.com/archives/720/</link>
      <pubDate>Wed, 10 Jul 2019 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/720/</guid>
      <description>&lt;p&gt;说到反向代理，很多人会想到nginx，其实iis也是可以实现方向代理的。&lt;/p&gt;
&lt;p&gt;1.安装ARR、URL Rewrite(URL重写工具2.0)&lt;/p&gt;
&lt;p&gt;注意英文和中文环境的对应：&lt;/p&gt;
&lt;p&gt;Application Request Routing 对应中文 应用程序请求路由&lt;/p&gt;
&lt;p&gt;URL Rewrite Module 对应中文 URL重写&lt;/p&gt;
&lt;p&gt;下载安装ARR（也可以在IIS管理器中，Web平台安装程序-&amp;gt;产品-&amp;gt;搜索框中搜索&amp;quot;arr&amp;quot;-&amp;gt;应用程序请求路由3.0 Beta-&amp;gt;添加-&amp;gt;安装）: &lt;a href=&#34;http://www.iis.net/downloads/microsoft/application-request-routing&#34;&gt;http://www.iis.net/downloads/microsoft/application-request-routing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载安装URL Rewrite Module（也可以在IIS管理器中，Web平台安装程序-&amp;gt;产品-&amp;gt;搜索框中搜索&amp;quot;url&amp;quot;-&amp;gt;url重写工具2.0-&amp;gt;添加-&amp;gt;安装）: &lt;a href=&#34;http://www.microsoft.com/en-us/download/details.aspx?id=7435&#34;&gt;http://www.microsoft.com/en-us/download/details.aspx?id=7435&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里推荐使用IIS自带的Web安装包工具，微软还是很强大的。&lt;/p&gt;
&lt;p&gt;2.启用ARR：双击ARR(Application Request Routing)-&amp;gt;点击右侧Server Proxy Settings&amp;hellip;-&amp;gt;选中Enabel proxy-&amp;gt;点击右侧“应用”;&lt;/p&gt;
&lt;p&gt;3.启用URL重写，可以通过web.config配置，也可以通过界面设置（web.config最终也可以使用界面来查看和操作），比如web.config样例:&lt;/p&gt;
&lt;p&gt;此时 &lt;a href=&#34;https://www.baidu.com/api&#34;&gt;www.baidu.com/api&lt;/a&gt; 或者 &lt;a href=&#34;https://www.baidu.com/api/xxxx&#34;&gt;www.baidu.com/api/xxxx&lt;/a&gt; 都被代理到 &lt;a href=&#34;https://www.proxy.com&#34;&gt;www.proxy.com&lt;/a&gt; 或者 &lt;a href=&#34;https://www.proxy.com/xxx&#34;&gt;www.proxy.com/xxx&lt;/a&gt;，如果不想过滤掉&amp;quot;baidu&amp;quot;，只需要把match url 改成 &amp;ldquo;^(baidu(/?|.*))$&amp;rdquo;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=”1.0” encoding=”UTF-8”?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;system.webServer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;rewrite&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;rules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;rule&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”bdProxy”&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;stopProcessing=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”true”&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”^baidu(/?|.*)$”&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;conditions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;add&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;input=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”{HTTP_HOST}”&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pattern=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”www.baidu.com”&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/conditions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;action&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”Rewrite”&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”http://www.baidu.com{R:1}“&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;serverVariables&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;name=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”HTTP_X_FORWARDED_HOST”&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;value=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;”{HTTP_HOST}”&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/serverVariables&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/rules&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/rewrite&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/system.webServer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里要特别注意了：由于使用了变量 HTTP_X_FORWARDED_HOST，所以需要在 url重写-&amp;gt;查看服务器变量-&amp;gt;添加-&amp;gt;添加HTTP_X_FORWARDED_HOST&lt;/p&gt;</description>
    </item>
    <item>
      <title>[转]使用Censys 查询CDN/如Cloudflare后面的真实服务器IP地址与对应防范</title>
      <link>https://dodoro.chouxiangpai.com/archives/698/</link>
      <pubDate>Fri, 14 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/698/</guid>
      <description>&lt;p&gt;Censys是一个可恨又可爱的搜索联网设备信息的新型搜索引擎, 利用他可以搜索到很多有用的信息, 比如通过ssl证书查找到CDN后面背后的真实IP.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;images/kB8m4I.md_.png&#34;&gt;&lt;img alt=&#34;kB8m4I.md&#34; loading=&#34;lazy&#34; src=&#34;https://dodoro.chouxiangpai.com/archives/698/images/kB8m4I.md_-300x238.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;防范: 1, 建议屏蔽所有Censys段&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://censys.io/ipv4?q=censys.io&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://censys.io/ipv4?q=censys.io&#34;&gt;https://censys.io/ipv4?q=censys.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;搜索censys的ip段并屏蔽.&lt;/p&gt;
&lt;p&gt;如下面两个段&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;198.108.0.0/16 141.212.0.0/16&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2, 或者屏蔽除了CDN以外所有IP访问. (推荐, 但请注意操作, 别把自己给屏蔽了)&lt;/p&gt;
&lt;p&gt;CentOS 7 firewall防火墙屏蔽除指定IP外的所有IP&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.openos.org/post/340/&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://www.openos.org/post/340/&#34;&gt;https://www.openos.org/post/340/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3, 如果是cloudflare用户, 也可以使用argo-tunnel&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com/zh-cn/products/argo-tunnel/&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://www.cloudflare.com/zh-cn/products/argo-tunnel/&#34;&gt;https://www.cloudflare.com/zh-cn/products/argo-tunnel/&lt;/a&gt; &lt;a href=&#34;https://developers.cloudflare.com/argo-tunnel/quickstart/&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://developers.cloudflare.com/argo-tunnel/quickstart/&#34;&gt;https://developers.cloudflare.com/argo-tunnel/quickstart/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其他查询Cloudflare源IP的相关工具&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.crimeflare.org/&#34;&gt;&lt;/a&gt;&lt;a href=&#34;http://www.crimeflare.org&#34;&gt;http://www.crimeflare.org&lt;/a&gt;:82/ &lt;a href=&#34;https://securitytrails.com/&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://securitytrails.com&#34;&gt;https://securitytrails.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;cloudflare 服务器IP地址&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com/ips/&#34;&gt;&lt;/a&gt;&lt;a href=&#34;https://www.cloudflare.com/ips/&#34;&gt;https://www.cloudflare.com/ips/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IPv4 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/12 172.64.0.0/13 131.0.72.0/22&lt;/p&gt;
&lt;p&gt;IPv6 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32&lt;/p&gt;</description>
    </item>
    <item>
      <title>mysql数据库报错：找不到mysql.sock导致无法连接</title>
      <link>https://dodoro.chouxiangpai.com/archives/690/</link>
      <pubDate>Thu, 13 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/690/</guid>
      <description>&lt;p&gt;mysql.sock默认的是在/var/lib/mysql, 如果发现确实是在该目录下，可以在[mysqld]下面加入mysql.sock的path vi /etc/my.cnf（my.cnf也可能在其他路径下）&lt;/p&gt;
&lt;p&gt;[mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock&lt;/p&gt;
&lt;p&gt;但是要保证使用mysql的用户具有对该目录的写权限，否则这样的改动由于权限限制仍然会报错。&lt;/p&gt;
&lt;p&gt;所以为了避免权限问题也可以使用软链接为/var/lib/mysql/mysql.sock创建一个到/tmp/mysql.sock的联接&lt;/p&gt;
&lt;p&gt;ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock&lt;/p&gt;
&lt;p&gt;由于/tmp/文件夹默认对other有w权限，这样就可以避免权限问题。&lt;/p&gt;
&lt;p&gt;此外，如果发现mysql.sock不在默认的/var/lib/mysql位置，一种解决方法是使用find命令搜索mysql.sock的位置，然后按前面两种解决方案挑一种做即可。&lt;/p&gt;
&lt;p&gt;或者进行初始化：/usr/local/mysql/bin/mysql_install_db &amp;ndash;user=mysql&lt;/p&gt;</description>
    </item>
    <item>
      <title>php-fpm找不到php-cgi.sock</title>
      <link>https://dodoro.chouxiangpai.com/archives/688/</link>
      <pubDate>Wed, 12 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/688/</guid>
      <description>&lt;p&gt;这两天整理centos服务器，为了节省空间清理了不少文件，没想到不小心把/tmp/下的目录清除了，导致程序报错：php-fpm找不到php-cgi.sock。&lt;/p&gt;
&lt;p&gt;php-fpm有两种listen方式，一种是通过端口来操作，一种是sock文件。&lt;/p&gt;
&lt;p&gt;在nginx的server配置当中，如果设置为fastcgi_pass unix:/tmp/php-cgi.sock的话，有可能会出现502错误，这是以为nginx此项没有找到php-cgi.sock文件或者权限问题导致的,我们也可以改成fastcgi_pass:127.0.0.1:9000来修正这个错误 。&lt;/p&gt;
&lt;p&gt;当我们用php-fpm来管理我们的php启动时，按照如下的配置，就会自动生成/tmp/php-cgi.sock文件，然后再访问的话就不回出现502 Gateway错误了。配置如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;global&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /var/run/php-fpm.pid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;error_log &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /var/log/php-fpm.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log_level &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; notice
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;www&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;listen &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /tmp/php-cgi.sock
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; www
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;group &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; www
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dynamic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm.max_children &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm.start_servers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm.min_spare_servers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm.max_spare_servers &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注：将php.ini里的cgi.fix_pathinfo设置为0,不然会有漏洞。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS6 yum 安装memcached,CentOS6 安装Memcached PHP安装Memcache扩展</title>
      <link>https://dodoro.chouxiangpai.com/archives/586/</link>
      <pubDate>Thu, 03 Dec 2015 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/586/</guid>
      <description>&lt;p&gt;#############&lt;/p&gt;
&lt;p&gt;centos 6 第一二步省略，直接yum安装&lt;/p&gt;
&lt;p&gt;1. 安装第三方软件库 wget &lt;a href=&#34;http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.5.2-2.rf.src.rpm&#34;&gt;http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.5.2-2.rf.src.rpm&lt;/a&gt; rpm -ivh rpmforge-release-0.5.2-2.rf.src.rpm&lt;/p&gt;
&lt;p&gt;2. 查找Memcached yum search memcached&lt;/p&gt;
&lt;p&gt;3. 安装Memcached yum -y install memcached&lt;/p&gt;
&lt;p&gt;4. 验证安装 memcached -h 应该会输出一些帮助信息&lt;/p&gt;
&lt;p&gt;5. 将memcache加入启动列表 chkconfig &amp;ndash;level 2345 memcached on&lt;/p&gt;
&lt;p&gt;6. 配置Memcache vi /etc/sysconfig/memcached 文件中内容如下 PORT=”11211″ 端口 USER=”root” 使用的用户名 MAXCONN=”1024″ 同时最大连接数 CACHESIZE=”64″ 使用的内存大小 OPTIONS=”&amp;quot; 附加参数&lt;/p&gt;
&lt;p&gt;7. 查看memcache状态 memcached-tool [Memcache Server IP]:[Memcache Server Port] stats 如：memcached-tool 127.0.0.1:11211 stats&lt;/p&gt;
&lt;p&gt;=====至此，我们将Memcache服务配置完毕，接着我们配置PHP的扩展，以便在程序中来调用=====&lt;/p&gt;
&lt;p&gt;PHP共有2种Memcache扩展，一个叫Memcache（2002年发布），另一个叫Memcached（2008年发布） Memcached比较新，它依赖于limemcached库才能运行，不过它能完成基于Memcache服务的几乎所有功能，比如：Memcached::getResultCode ，它能返回上一次操作Memcache的结果，而Memcache则没有这个功能 Memcache（没有d）不依赖任何库就能运行，安装相对简单，同时也能完成Memcache服务的大部分主要功能。 下面分别介绍2者的安装方式。&lt;/p&gt;
&lt;p&gt;8. 安装PHP的Memcache扩展（yum安装php已安装此扩展） wget &lt;a href=&#34;http://pecl.php.net/get/memcache-2.2.6.tgz&#34;&gt;http://pecl.php.net/get/memcache-2.2.6.tgz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;wget &lt;a href=&#34;http://pecl.php.net/get/memcache-3.0.6.tgz&#34;&gt;http://pecl.php.net/get/memcache-3.0.6.tgz&lt;/a&gt; tar vxzf memcache-2.2.6.tgz cd memcache-2.2.6 /usr/bin/phpize （如果不知道phpize在什么位置，可以用find / -name phpize查找） ./configure –enable-memcache –with-php-config=/usr/bin/php-config –with-zlib-dir make make install 记录下安装成功后的提示，类似于： Installing shared extensions: /usr/lib/php/modules/ 把这个地址记录下来&lt;/p&gt;</description>
    </item>
    <item>
      <title>[转]MySQL性能优化的简单说明</title>
      <link>https://dodoro.chouxiangpai.com/archives/579/</link>
      <pubDate>Thu, 16 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/579/</guid>
      <description>&lt;p&gt;原文链接  http://teddysun.com/424.html&lt;/p&gt;
&lt;p&gt;MySQL 作为 LAMP 组件中的重要一环，在网站架构中担当关于数据处理的重任。作为目前流行最为广泛的开源数据库，网络上已经有相当多的各种优化教程。本文将试着从改善 MySQL 配置入手，进一步提升 MySQL 的性能。 关于如何优化数据库结构及 SQL 语句不在本次讨论范围之内。 MySQL 性能优化我打算分为三个部分，一是物理硬件的优化，二是 MySQL 安装时的编译优化，三是 MySQL 的配置文件 my.cnf 的优化。 一、物理硬件的优化 磁盘 I/O 是制约 MySQL 性能的最大因素之一。 采用 SSD 的服务器肯定会比普通 HDD 硬盘性能要好；采用 RAID10 的肯定要比单盘的性能要好。 所谓物理硬件的优化，其实也就是服务器（VPS）硬件的堆砌。更多的内存，更快的磁盘，更强的 CPU 无疑就是最佳的。&lt;/p&gt;
&lt;p&gt;二、MySQL 安装时的编译优化 一般情况下不建议直接 yum 安装 MySQL ，一来不能定制功能，二来版本比较老。所以我一般会采取编译安装的方式。 源码编译安装的前提条件（依赖包）： 1、CMake。官网：http://www.cmake.org/ 2、GCC，A working ANSI C++ compiler. GCC 4.2.1 or later。官网：http://www.gnu.org/software/gcc/ 3、bison，2.1 or newer。官网：http://www.gnu.org/software/bison/ 4、m4。官网：http://www.gnu.org/software/m4/ 5、tar。官网：http://www.gnu.org/software/tar/&lt;/p&gt;
&lt;p&gt;编译参数： MySQL 5.5.x &lt;a href=&#34;http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html&#34;&gt;http://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MySQL 5.6.x &lt;a href=&#34;http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html&#34;&gt;http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LAMP 一键安装脚本里对 MySQL 编译的参数如下： -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=complex -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_EMBEDDED_SERVER=1&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS下安装pure-ftpd</title>
      <link>https://dodoro.chouxiangpai.com/archives/568/</link>
      <pubDate>Mon, 05 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/568/</guid>
      <description>&lt;p&gt;安装pure-ftpd&lt;/p&gt;
&lt;p&gt;1.下载 wget &lt;a href=&#34;http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.32.tar.gz&#34;&gt;http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.32.tar.gz&lt;/a&gt; 2.解压 tar -zxvf pure-ftpd-1.0.32.tar.gz 3.编译安装 tar -zxvf pure-ftpd-1.0.32.tar.gz cd pure-ftpd-1.0.32 ./configure \ &amp;ndash;prefix=/usr/local/pureftpd \ &amp;ndash;without-inetd \ &amp;ndash;with-altlog \ &amp;ndash;with-puredb \ &amp;ndash;with-throttling \ &amp;ndash;with-peruserlimits \ &amp;ndash;with-tls make &amp;amp;&amp;amp; make install&lt;/p&gt;
&lt;p&gt;配置 pure-ftpd&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;1. 修改配置&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;cd configuration-file mkdir -p /usr/local/pureftpd/etc/ cp pure-ftpd.conf /usr/local/pureftpd/etc/pure-ftpd.conf cp pure-config.pl /usr/local/pureftpd/sbin/pure-config.pl chmod 755 /usr/local/pureftpd/sbin/pure-config.pl 2.配置文件&lt;/p&gt;
&lt;p&gt;vi /usr/local/pureftpd/etc/pure-ftpd.conf //修改其中两处： PureDB /usr/local/pureftpd/etc/pureftpd.pdb PIDFile /usr/local/pureftpd/var/run/pure-ftpd.pid 启动pure-ftpd&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;/usr/local/pureftpd/sbin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf&lt;/p&gt;
&lt;p&gt;Running: /usr/local/pureftpd/sbin/pure-ftpd -A -c50 -B -C8 -D -fftp -H -I15 -lpuredb:/usr/local/pureftpd/etc/pureftpd.pdb -L3136:8 -m4 -s -U133:022 -u100 -g/usr/local/pureftpd/var/run/pure-ftpd.pid -k99 -Z //显示这个就没问题了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nginx0.8.x&#43;PHP5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器（第6版）[转]</title>
      <link>https://dodoro.chouxiangpai.com/archives/565/</link>
      <pubDate>Sun, 04 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/565/</guid>
      <description>&lt;h4 id=&#34;nginx-08x--php-5213fastcgi搭建胜过apache十倍的web服务器第6版&#34;&gt; Nginx 0.8.x + PHP 5.2.13（FastCGI）搭建胜过Apache十倍的Web服务器（第6版）&lt;/h4&gt;
&lt;p&gt;原文链接：&lt;a href=&#34;http://blog.zyan.cc/nginx_php_v6/&#34;&gt;http://blog.zyan.cc/nginx_php_v6/&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;说明：转载，有备无患。&lt;/p&gt;
&lt;p&gt;Nginx (&amp;ldquo;engine x&amp;rdquo;) 是一个高性能的 HTTP 和反向代理服务器，也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的，它已经在该站点运行超过三年了。Igor 将源代码以类BSD许可证的形式发布。&lt;/p&gt;
&lt;p&gt;Nginx 超越 Apache 的高性能和稳定性，使得国内使用 Nginx 作为 Web 服务器的网站也越来越多，其中包括新浪博客、新浪播客、网易新闻、腾讯网、搜狐博客等门户网站频道，六间房、56.com等视频分享网站，Discuz!官方论坛、水木社区等知名论坛，盛大在线、金山逍遥网等网络游戏网站，豆瓣、人人网、YUPOO相册、金山爱词霸、迅雷在线等新兴Web 2.0网站。 Nginx 的官方中文维基：http://wiki.nginx.org/NginxChs 在高并发连接的情况下，Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果，Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 可以承受3万以上的并发连接数，相当于同等环境下Apache的10倍。&lt;/p&gt;
&lt;p&gt;根据我的经验，4GB内存的服务器+Apache（prefork模式）一般只能处理3000个并发连接，因为它们将占用3GB以上的内存，还得为系统预留1GB的内存。我曾经就有两台Apache服务器，因为在配置文件中设置的MaxClients为4000，当Apache并发连接数达到3800时，导致服务器内存和Swap空间用满而崩溃。&lt;/p&gt;
&lt;p&gt;而这台 Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 服务器在3万并发连接下，开启的10个Nginx进程消耗150M内存（15M*10=150M），开启的64个php-cgi进程消耗1280M内存（20M*64=1280M），加上系统自身消耗的内存，总共消耗不到2GB内存。如果服务器内存较小，完全可以只开启25个php-cgi进程，这样php-cgi消耗的总内存数才500M。&lt;/p&gt;
&lt;p&gt;在3万并发连接下，访问Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 服务器的PHP程序，仍然速度飞快。下图为Nginx的状态监控页面，显示的活动连接数为28457（关于Nginx的监控页配置，会在本文接下来所给出的Nginx配置文件中写明）：&lt;/p&gt;
&lt;p&gt;点击在新窗口中浏览此图片&lt;/p&gt;
&lt;p&gt;我生产环境下的两台Nginx + PHP5（FastCGI）服务器，跑多个一般复杂的纯PHP动态程序，单台Nginx + PHP5（FastCGI）服务器跑PHP动态程序的处理能力已经超过“700次请求/秒”，相当于每天可以承受6000万（700*60*60*24=60480000）的访问量（更多信息见此），而服务器的系统负载也不高：&lt;/p&gt;
&lt;p&gt;点击在新窗口中浏览此图片&lt;/p&gt;
&lt;p&gt;2009年9月3日下午2：30，金山游戏《剑侠情缘网络版叁》临时维护1小时（http://kefu.xoyo.com/gonggao/jx3/2009-09-03/750438.shtml），大量玩家上官网，论坛、评论、客服等动态应用Nginx服务器集群，每台服务器的Nginx活动连接数达到2.8万，这是笔者遇到的Nginx生产环境最高并发值。&lt;/p&gt;
&lt;p&gt;点击在新窗口中浏览此图片 下面是用100个并发连接分别去压生产环境中同一负载均衡器VIP下、提供相同服务的两台服务器，一台为Nginx，另一台为Apache，Nginx每秒处理的请求数是Apache的两倍多，Nginx服务器的系统负载、CPU使用率远低于Apache：&lt;/p&gt;
&lt;p&gt;你可以将连接数开到10000～30000，去压Nginx和Apache上的phpinfo.php，这是用浏览器访问Nginx上的phpinfo.php一切正常，而访问Apache服务器的phpinfo.php，则是该页无法显示。4G内存的服务器，即使再优化，Apache也很难在“webbench -c 30000 -t 60 &lt;a href=&#34;http://xxx.xxx.xxx.xxx/phpinfo.php&#34;&gt;http://xxx.xxx.xxx.xxx/phpinfo.php&lt;/a&gt;”的压力情况下正常访问，而调整参数优化后的Nginx可以。&lt;/p&gt;</description>
    </item>
    <item>
      <title>[转]如何在github上传自己的代码</title>
      <link>https://dodoro.chouxiangpai.com/archives/504/</link>
      <pubDate>Tue, 08 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/504/</guid>
      <description>&lt;p&gt;注册GitHub后你就会有0.3G的免费空间，不过只能创建公开项目，这也满足代码分享的目的，我最喜欢的倒是它的代码展示方式，可以直接浏览你的代码，代码是经过高亮、添加行号处理过的，十分漂亮，体验一流，比如这个&lt;a href=&#34;https://github.com/webpy/webpy&#34;&gt;Webpy托管&lt;/a&gt;的地方。而作为想要了解你代码的人，可以选择直接在线浏览自己感兴趣的，也可以直接下载压缩包，或者直接使用Git clone到本地。&lt;/p&gt;
&lt;p&gt;因为GitHub是基于Git版本控制系统，所以你上传修改代码什么的，都需要使用Git工具。我这里主要是用来分享和展示代码，所以不想在版本控制方面做过多的阐述，下面就简单讲解一下怎么在GitHub上新建一个项目，还有把自己的代码传上去。下面的前提是你已经注册了GitHub和下载安装了Git——&lt;a href=&#34;http://git-scm.com/download&#34;&gt;Git下载&lt;/a&gt;、&lt;a href=&#34;http://code.google.com/p/msysgit/downloads/list&#34;&gt;Windows版本下载&lt;/a&gt;。&lt;/p&gt;
&lt;h4 id=&#34;上传分享代码&#34;&gt;上传分享代码&lt;/h4&gt;
&lt;p&gt;1.在GitHub上建立项目&lt;/p&gt;
&lt;p&gt;登录GitHub后，你可以在右边靠中那里找到一个按钮“New Repository”，点击过后，填入项目名称、说明和网址过后就可以创建了，然后会出现一个提示页面，记下类似&lt;code&gt;git@github.com:XXX/XXX.git&lt;/code&gt;的地址，这个就是你这个项目的地址了。&lt;/p&gt;
&lt;p&gt;2.配置Git以及上传代码&lt;/p&gt;
&lt;p&gt;安装Git成功后，如果是Windows下，选择Git Bash，在命令行中完成一切，可能开始有点麻烦，不过就那几条命令行，用几次就记住啦。首先初始设置Git：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 git config --global user.name &amp;#34;Your Real Name&amp;#34;
2 git config --global user.email you@email.address
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后开始进行最麻烦的一步了，你需要上传文件到GitHub的Git系统上，得需要一个SSH密匙来认证，下面就开始生成密钥和提交密钥。打开Git Bash,创建SSH key:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 ssh-keygen -C &amp;#39;your@email.address&amp;#39; -t rsa
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后要你输入SSH密匙的存放位置，可以不管，直接回车使用默认路径。再输入你想要的密码，SSH key就生成了。现在你需要将这个Key提交到GitHub，首先打开Key保存的位置，里面会有三个文件，找到id_rsa.pub，用文本编辑器打开，复制里面的全部字符。到GitHub，在右上方工具栏里找到Account Settings。在这个页面上有一个SSH Public Keys标签，选择Add another public key。Title可以随便填一个，Key就粘贴刚才的字符，提交。&lt;/p&gt;
&lt;p&gt;完成这些工作后，就可以上传自己的代码了。找到自己要分享上传的代码文件夹，右击选择Git Bash，或者在Git Bash中进入这个文件夹。建立一个仓库：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 git init
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;选择要添加进仓库的文件：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 git add .
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;一般如果你想分享这个文件夹里的所有代码，就在 add后面加“.”，上面的例子就是这样，如果传指定的，只需要把“.”改为文件名即可，现在只是选择了要加入仓库的文件，下面才是添加进入仓库：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1 git commit -m &amp;#39;Test&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-m后面跟一个参数，表示说明，将代码提交到GitHub后，将会在代码文件信息上显示这个说明，如下图标记的地方。&lt;/p&gt;
&lt;p&gt;搞了这么久，现在才开始把本地仓库上传到GitHub了，下面两行命令搞定问题：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1    
2 git remote add origin git@github.com:XXX/XXX.git
3 git push -u origin master
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个&lt;code&gt;git@github.com:XXX/XXX.git&lt;/code&gt;就是上面创建项目是生成的地址。现在打开你的项目网址，你就可以发现你的代码已经展示出来了。如果你要更新代码的话，就重复上面的吧。&lt;/p&gt;
&lt;p&gt;如果提交了敏感信息，比如代码中设置的自己的密码什么的忘删除就上传上去了怎么办？重新修改过后上传依然有历史记录，而使用Git删除历史记录貌似很麻烦，于是就采用删除项目吧，删除了再重新上传。删除项目需要在GitHub网站上右上方找到admin按钮，进去后右边最下面有个删除的按钮，这样就可以删除了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>svn命令copy使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/291/</link>
      <pubDate>Tue, 20 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/291/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn copy — 拷贝工作拷贝的一个文件或目录到版本库。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn copy SRC DST
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;拷贝工作拷贝的一个文件或目录到版本库。_&lt;code&gt;SRC&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;DST&lt;/code&gt;_既可以是工作拷贝（WC）路径也可以是URL：&lt;/p&gt;
&lt;p&gt;WC -&amp;gt; WC&lt;/p&gt;
&lt;p&gt;拷贝并且预定一个添加的项目（包含历史）。&lt;/p&gt;
&lt;p&gt;WC -&amp;gt; URL&lt;/p&gt;
&lt;p&gt;将WC或URL的拷贝立即提交。&lt;/p&gt;
&lt;p&gt;URL -&amp;gt; WC&lt;/p&gt;
&lt;p&gt;检出URL到WC，并且加入到添加计划。&lt;/p&gt;
&lt;p&gt;URL -&amp;gt; URL&lt;/p&gt;
&lt;p&gt;完全的服务器端拷贝，通常用在分支和标签。&lt;/p&gt;
&lt;h3 id=&#34;注意&#34;&gt;注意&lt;/h3&gt;
&lt;p&gt;你只可以在单个版本库中拷贝文件，Subversion还不支持跨版本库的拷贝。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;cp&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;如果目标是URL则包括版本库。&lt;/p&gt;
&lt;p&gt;如果目标是WC路径，则是工作拷贝。&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;如果目标是版本库，或者需要查看修订版本号，则会访问版本库。&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--message (-m) TEXT
--file (-F) FILE
--revision (-r) REV
--quiet (-q)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--force-log
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;拷贝工作拷贝的一个项目（只是预定要拷贝—在提交之前不会影响版本库）：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn copy foo.txt bar.txt
A         bar.txt
$ svn status
A  +   bar.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;拷贝你的工作拷贝的一个项目到版本库的URL（直接的提交，所以需要提供一个提交信息）：&lt;/p&gt;</description>
    </item>
    <item>
      <title>svn命令delete使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/293/</link>
      <pubDate>Tue, 20 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/293/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn delete — 从工作拷贝或版本库删除一个项目。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn delete PATH...
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn delete URL...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;_&lt;code&gt;PATH&lt;/code&gt;_指定的项目会在下次提交删除，文件（和没有提交的目录）会立即从版本库删除，这个命令不会删除任何未版本化或已经修改的项目；使用&lt;code&gt;--force&lt;/code&gt;选项可以覆盖这种行为方式。&lt;/p&gt;
&lt;p&gt;URL指定的项目会在直接提交中从版本库删除，多个URL的提交是原子操作。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;del, remove, rm&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;如果操作对象是文件则是工作拷贝变化，对象是URL则会影响版本库。&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;对URL操作时访问&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--force
--force-log
--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--targets FILENAME
--username USER
--password PASS
--no-auth-cache
--non-interactive
--editor-cmd EDITOR
--encoding ENC
--config-dir DIR
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;使用&lt;strong&gt;svn&lt;/strong&gt;从工作拷贝删除文件只是预定要删除，当你提交，文件才会从版本库删除。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn delete myfile
D         myfile

$ svn commit -m &amp;#34;Deleted file &amp;#39;myfile&amp;#39;.&amp;#34;
Deleting       myfile
Transmitting file data .
Committed revision 14.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然而直接删除一个URL，你需要提供一个日志信息：&lt;/p&gt;</description>
    </item>
    <item>
      <title>svn命令diff使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/295/</link>
      <pubDate>Tue, 20 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/295/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn diff — 比较两条路径的区别。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;diff [-r N[:M]] [TARGET[@REV]...]
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;diff [-r N[:M]] --old OLD-TGT[@OLDREV] [--new NEW-TGT[@NEWREV]] [PATH...]
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;diff OLD-URL[@OLDREV] NEW-URL[@NEWREV]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;显示两条路径的区别，&lt;strong&gt;svn diff&lt;/strong&gt;有三种使用方式：&lt;/p&gt;
&lt;p&gt;**svn diff [-r N[:M]] [&amp;ndash;old OLD-TGT] [&amp;ndash;new NEW-TGT] [PATH&amp;hellip;]**会显示_&lt;code&gt;OLD-TGT&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;NEW-TGT&lt;/code&gt;&lt;em&gt;的区别。如果给定路径&lt;/em&gt;&lt;code&gt;PATH&lt;/code&gt;&lt;em&gt;，它会被看作&lt;/em&gt;&lt;code&gt;OLD-TGT&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;NEW-TGT&lt;/code&gt;&lt;em&gt;的相对路径，输出也会限制在这些路径的区别上。&lt;/em&gt;&lt;code&gt;OLD-TGT&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;NEW-TGT&lt;/code&gt;&lt;em&gt;可以是工作拷贝路径或者是&lt;/em&gt;&lt;code&gt;URL&lt;/code&gt;&lt;em&gt;&lt;code&gt;[@&lt;/code&gt;&lt;/em&gt;&lt;code&gt;REV&lt;/code&gt;&lt;em&gt;&lt;code&gt;]&lt;/code&gt;。&lt;/em&gt;&lt;code&gt;OLD-TGT&lt;/code&gt;&lt;em&gt;缺省是当前工作目录，而&lt;/em&gt;&lt;code&gt;NEW-TGT&lt;/code&gt;&lt;em&gt;缺省是&lt;/em&gt;&lt;code&gt;OLD-TGT&lt;/code&gt;&lt;em&gt;。&lt;/em&gt;&lt;code&gt;N&lt;/code&gt;&lt;em&gt;缺省是&lt;code&gt;BASE&lt;/code&gt;，&lt;/em&gt;&lt;code&gt;M&lt;/code&gt;&lt;em&gt;缺省时当前目录的版本，但如果&lt;/em&gt;&lt;code&gt;NEW-TGT&lt;/code&gt;&lt;em&gt;是一个URL，则默认是&lt;code&gt;HEAD&lt;/code&gt;。&lt;strong&gt;svn diff -r N&lt;/strong&gt;设置&lt;/em&gt;&lt;code&gt;OLD-TGT&lt;/code&gt;&lt;em&gt;的修订版本为&lt;/em&gt;&lt;code&gt;N&lt;/code&gt;&lt;em&gt;，&lt;strong&gt;svn diff -r N:M&lt;/strong&gt;设置&lt;/em&gt;&lt;code&gt;NEW-TGT&lt;/code&gt;&lt;em&gt;的修订版本是&lt;/em&gt;&lt;code&gt;M&lt;/code&gt;_。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;svn diff [-r N[:M]] URL1[@N] URL2[@M]&lt;strong&gt;是&lt;/strong&gt;svn diff [-r N[:M]] &amp;ndash;old=URL1 &amp;ndash;new=URL2&lt;/strong&gt;的缩写。&lt;/p&gt;
&lt;p&gt;_&lt;code&gt;TARGET&lt;/code&gt;_是一个URL，然后可以使用前面提到的&lt;code&gt;--revision&lt;/code&gt;或“@”符号来指定N和M。&lt;/p&gt;
&lt;p&gt;如果_&lt;code&gt;TARGET&lt;/code&gt;_是工作拷贝路径，则&lt;code&gt;--revision&lt;/code&gt;选项的含义是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--revision N:M&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;服务器比较 &lt;em&gt;&lt;code&gt;TARGET&lt;/code&gt;&lt;/em&gt;@&lt;em&gt;&lt;code&gt;N&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;TARGET&lt;/code&gt;&lt;/em&gt;@&lt;em&gt;&lt;code&gt;M&lt;/code&gt;&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--revision N&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;客户端比较_&lt;code&gt;TARGET&lt;/code&gt;&lt;em&gt;@&lt;/em&gt;&lt;code&gt;N&lt;/code&gt;_和工作拷贝。&lt;/p&gt;
&lt;p&gt;（无&lt;code&gt;--revision&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;客户端比较base和 &lt;em&gt;&lt;code&gt;TARGET&lt;/code&gt;&lt;em&gt;的&lt;/em&gt;&lt;code&gt;TARGET&lt;/code&gt;&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;如果使用其他语法，服务器会比较_&lt;code&gt;URL1&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;URL2&lt;/code&gt;&lt;em&gt;各自的&lt;/em&gt;&lt;code&gt;N&lt;/code&gt;&lt;em&gt;和&lt;/em&gt;&lt;code&gt;M&lt;/code&gt;&lt;em&gt;。如果省掉&lt;/em&gt;&lt;code&gt;N&lt;/code&gt;&lt;em&gt;或&lt;/em&gt;&lt;code&gt;M&lt;/code&gt;_，会假定为&lt;code&gt;HEAD&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;缺省情况下，&lt;strong&gt;svn diff&lt;/strong&gt;忽略文件的祖先，只会比较两个文件的内容。如果你使用&lt;code&gt;--notice-ancestry&lt;/code&gt;，比较修订版本（也就是，当你运行&lt;strong&gt;svn diff&lt;/strong&gt;比较两个内容相同，但祖先历史不同的对象会看到所有的内容被删除又再次添加）时就会考虑路径的祖先。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;di&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;获得工作拷贝非&lt;code&gt;BASE&lt;/code&gt;修订版本的区别时会&lt;/p&gt;</description>
    </item>
    <item>
      <title>svn命令add使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/277/</link>
      <pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/277/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn add — 添加文件、目录或符号链。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn add PATH...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;添加文件、目录或符号链到你的工作拷贝并且预定添加到版本库。它们会在下次提交上传并添加到版本库，如果你在提交之前改变了主意，你可以使用&lt;strong&gt;svn revert&lt;/strong&gt;取消预定。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;工作拷贝&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;否&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--targets FILENAME
--non-recursive (-N)
--quiet (-q)
--config-dir DIR
--auto-props
--no-auto-props
--force
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;添加一个文件到工作拷贝：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn add foo.c 
A         foo.c
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当添加一个目录，&lt;strong&gt;svn add&lt;/strong&gt;缺省的行为方式是递归的：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn add testdir
A         testdir
A         testdir/a
A         testdir/b
A         testdir/c
A         testdir/d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;你可以只添加一个目录而不包括其内容：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn add --non-recursive otherdir
A         otherdir
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通常情况下，命令&lt;strong&gt;svn add *&lt;strong&gt;会忽略所有已经在版本控制之下的目录，有时候，你会希望添加所有工作拷贝的未版本化文件，包括那些隐藏在深处的文件，可以使用&lt;/strong&gt;svn add&lt;/strong&gt;的&lt;code&gt;--force&lt;/code&gt;递归到版本化的目录下：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn add * --force
A         foo.c
A         somedir/bar.c
A         otherdir/docs/baz.doc
[...]
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>svn命令blame使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/283/</link>
      <pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/283/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn blame — 显示特定文件和URL内嵌的作者和修订版本信息。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn blame TARGET...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;显示特定文件和URL内嵌的作者和修订版本信息。每一行文本在开头都放了最后修改的作者（用户名）和修订版本号。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;praise、annotate、ann&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;是&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--revision (-r) REV
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
--verbose
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;如果你希望在测试版本库看到blame标记的&lt;code&gt;readme.txt&lt;/code&gt;源代码：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn blame http://svn.red-bean.com/repos/test/readme.txt
     3      sally This is a README file.
     5      harry You should read this.
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>svn命令checkout使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/279/</link>
      <pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/279/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn checkout — 从版本库取出一个工作拷贝。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn checkout URL[@REV]... [PATH]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;从版本库取出一个工作拷贝，如果省略_&lt;code&gt;PATH&lt;/code&gt;_，URL的基名称会作为目标，如果给定多个URL，每一个都会检出到PATH的子目录，使用URL基名称的子目录名称。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;co&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;创建一个工作拷贝。&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;是&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--revision (-r) REV
--quiet (-q)
--non-recursive (-N)
--username USER
--password PASS
--no-auth-cache
--non-interactive
--config-dir DIR
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;取出一个工作拷贝到&lt;code&gt;mine&lt;/code&gt;：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn checkout file:///tmp/repos/test mine
A  mine/a
A  mine/b
Checked out revision 2.
$ ls
mine
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检出两个目录到两个单独的工作拷贝：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn checkout file:///tmp/repos/test  file:///tmp/repos/quiz
A  test/a
A  test/b
Checked out revision 2.
A  quiz/l
A  quiz/m
Checked out revision 2.
$ ls
quiz  test
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;检出两个目录到两个单独的工作拷贝，但是将两个目录都放到&lt;code&gt;working-copies&lt;/code&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>svn命令cleanup使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/275/</link>
      <pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/275/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn cleanup — 递归清理工作拷贝。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn cleanup [PATH...]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;递归清理工作拷贝，删除未完成的操作锁定。如果你得到一个“工作拷贝已锁定”的错误，运行这个命令可以删除无效的锁定，让你的工作拷贝再次回到可用的状态。&lt;/p&gt;
&lt;p&gt;如果，因为一些原因，运行外置的区别程序（例如，用户输入或是网络错误）有时候会导致一个&lt;strong&gt;svn update&lt;/strong&gt;失败，使用&lt;code&gt;--diff3-cmd&lt;/code&gt;选项可以完全清除你的外置区别程序所作的合并，你也可以使用&lt;code&gt;--config-dir&lt;/code&gt;指定任何配置目录，但是你应该不会经常使用这些选项。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;工作拷贝&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;否&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--diff3-cmd CMD
--config-dir DIR
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;svn cleanup&lt;/strong&gt;没有输出，没有太多的例子，如果你没有传递路径，会使用“&lt;code&gt;.&lt;/code&gt;”。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn cleanup

$ svn cleanup /path/to/working-copy
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>svn命令commit使用</title>
      <link>https://dodoro.chouxiangpai.com/archives/281/</link>
      <pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/281/</guid>
      <description>&lt;h2 id=&#34;名称&#34;&gt;名称&lt;/h2&gt;
&lt;p&gt;svn commit — 将修改从工作拷贝发送到版本库。&lt;/p&gt;
&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;svn commit [PATH...]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;描述&#34;&gt;描述&lt;/h2&gt;
&lt;p&gt;将修改从工作拷贝发送到版本库。如果你没有使用&lt;code&gt;--file&lt;/code&gt;或&lt;code&gt;--message&lt;/code&gt;提供一个提交日志信息，&lt;strong&gt;svn&lt;/strong&gt;会启动你的编辑器来编写一个提交信息，见&lt;a href=&#34;http://svndoc.iusesvn.com/svnbook/1.1/svn-ch-7.html#svn-ch-7-sect-1.3.2&#34; title=&#34;config&#34;&gt;“config”一节&lt;/a&gt;的&lt;code&gt;editor-cmd&lt;/code&gt;小节。&lt;/p&gt;
&lt;h3 id=&#34;提示&#34;&gt;提示&lt;/h3&gt;
&lt;p&gt;如果你开始一个提交并且Subversion启动了你的编辑器来编辑提交信息，你仍可以退出而不会提交你的修改，如果你希望取消你的提交，只需要退出编辑器而不保存你的提交信息，Subversion会提示你是选择取消提交、空信息继续还是重新编辑信息。&lt;/p&gt;
&lt;h2 id=&#34;别名&#34;&gt;别名&lt;/h2&gt;
&lt;p&gt;ci（“check in”的缩写；不是“checkout”的缩写“co”。）&lt;/p&gt;
&lt;h2 id=&#34;变化&#34;&gt;变化&lt;/h2&gt;
&lt;p&gt;工作拷贝，版本库&lt;/p&gt;
&lt;h2 id=&#34;是否访问版本库&#34;&gt;是否访问版本库&lt;/h2&gt;
&lt;p&gt;是&lt;/p&gt;
&lt;h2 id=&#34;选项&#34;&gt;选项&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--message (-m) TEXT
--file (-F) FILE
--quiet (-q)
--non-recursive (-N)
--targets FILENAME
--force-log
--username USER
--password PASS
--no-auth-cache
--non-interactive
--encoding ENC
--config-dir DIR
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;例子&#34;&gt;例子&lt;/h2&gt;
&lt;p&gt;使用命令行提交一个包含日志信息的文件修改，当前目录（“&lt;code&gt;.&lt;/code&gt;”）是没有说明的目标路径：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn commit -m &amp;#34;added howto section.&amp;#34;
Sending        a
Transmitting file data .
Committed revision 3.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;提交一个修改到&lt;code&gt;foo.c&lt;/code&gt;（在命令行明确指明），并且&lt;code&gt;msg&lt;/code&gt;文件中保存了提交信息：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ svn commit -F msg foo.c
Sending        foo.c
Transmitting file data .
Committed revision 5.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果你希望使用在&lt;code&gt;--file&lt;/code&gt;选项中使用在版本控制之下的文件作为参数，你需要使用&lt;code&gt;--force-log&lt;/code&gt;选项：&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用手机版WordPress界面插件 - WPtouch</title>
      <link>https://dodoro.chouxiangpai.com/archives/142/</link>
      <pubDate>Wed, 10 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://dodoro.chouxiangpai.com/archives/142/</guid>
      <description>&lt;p&gt;WPtouch 支持 iPod, iPhone, iPad, Android, 黑莓, Palm OS 等常用的触摸设备浏览器. 而且强大如一个网站管理工具, 免费版就可以进行一些常规的页面修改, 如选择是否显示文章 Tags, 分类, 作者信息, view more 链接, 菜单管理, 搜索, 分享按钮等常规的功能.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
