<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>DInG_BloG</title>
  
  <subtitle>静以致远</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://www.grapedlinux.cn/"/>
  <updated>2020-02-18T15:18:05.259Z</updated>
  <id>http://www.grapedlinux.cn/</id>
  
  <author>
    <name>Graped</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Nginx Rewrite和Return </title>
    <link href="http://www.grapedlinux.cn/2020/02/18/Nginx-Rewrite%E5%92%8CReturn/"/>
    <id>http://www.grapedlinux.cn/2020/02/18/Nginx-Rewrite和Return/</id>
    <published>2020-02-18T15:16:20.000Z</published>
    <updated>2020-02-18T15:18:05.259Z</updated>
    
    <content type="html"><![CDATA[<p>[TOC]</p><h1 id="Rewrite配置（一）"><a href="#Rewrite配置（一）" class="headerlink" title="Rewrite配置（一）"></a>Rewrite配置（一）</h1><blockquote><p>nginx的rewrite配置是nginx配置中比较核心的部分，rewrite可以实现域名跳转（重定向）、URL重写（伪静态）、动静分离（跳转域名，并接入CDN实现加速）。rewrite依赖pcre库，用到的模块是ngx_http_rewrite_module。</p></blockquote><h2 id="rewrite相关指令"><a href="#rewrite相关指令" class="headerlink" title="rewrite相关指令"></a>rewrite相关指令</h2><h3 id="if指令"><a href="#if指令" class="headerlink" title="if指令"></a>if指令</h3><p>格式： if （条件判断） { 具体的rewrite规则 }</p><ul><li><p>条件举例</p><blockquote><ol><li>条件判断语句有nginx内置变量、逻辑判断符号和目标字符串三部分组成。</li><li>其中，内置变量是nginx固定的非自定义的变量，如$request_method、$request_uri等。</li><li>逻辑判断符号有 =、!=、~、~<em>、!~、!~</em>。</li><li>!表示取反，~为匹配符号，它右侧为正则表达式，区分大小写，而~*为不区分大小写匹配。</li><li>目标字符串可以是正则表达式，通常不用加引号，但表达式中有特殊符号时，比如空格、花括号、分号等，需要用单引号引起来。</li></ol></blockquote></li><li><p>示例1：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable">$request_method</span> = POST)     <span class="comment"># 当请求的方法为POST时，直接返回405状态码。if中支持用return指令。</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">return</span> 405；</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例2：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable">$http_user_agent</span> ~ MSIE )    <span class="comment"># 当user_agent带有MSIE（IE浏览器）字符的请求，直接返回403状态码。</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">return</span> 403；</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>如果想同时限制多个user_agent，还可以写成这样：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable">$http_user_agent</span> ~ <span class="string">"MSIE|firefox|spider"</span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="built_in">return</span> 403；</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><ul><li><p>示例3：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (!-f <span class="variable">$request_filename</span>)      <span class="comment"># 当请求的文件不存在时，将会执行下面的rewrite规则。</span></span><br><span class="line">&#123;</span><br><span class="line">    rewrite 语句；</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例4：</p></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (<span class="variable">$request_uri</span> ~* <span class="string">'gid=\d&#123;9,12&#125;/'</span>)  <span class="comment"># \d表示数字，&#123;9,12&#125;表示数字出现的次数是9到12次，比如gid=123456789是符合条件的，就会执行下面的rewrite规则。</span></span><br><span class="line">&#123;</span><br><span class="line">    rewrite 语句；</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="break和last指令"><a href="#break和last指令" class="headerlink" title="break和last指令"></a>break和last指令</h3><p>两个指令用法相同，但含义不同，需要放到rewrite规则的末尾，用来控制重写后的链接是否继续被nginx配置执行（主要是rewrite、return指令）。</p><ul><li>示例1：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;                 <span class="comment">#打开rewrite日志，在error.log中</span></span><br><span class="line">    rewrite /1.html /2.html;</span><br><span class="line">    rewrite /2.html /3.html;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>访问测试：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/1.html</span><br><span class="line">333333              <span class="comment"># 说明已经从1.html跳转到3.html，实际访问到的是3.html。</span></span><br></pre></td></tr></table></figure></p><p>查看日志:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">2020/02/18 15:58:35 [notice] 4229<span class="comment">#0: *56 "/1.html" matches "/1.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 15:58:35 [notice] 4229<span class="comment">#0: *56 rewritten data: "/2.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 15:58:35 [notice] 4229<span class="comment">#0: *56 "/2.html" matches "/2.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 15:58:35 [notice] 4229<span class="comment">#0: *56 rewritten data: "/3.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br></pre></td></tr></table></figure></p><ul><li>示例2：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line">    rewrite /1.html /2.html <span class="built_in">break</span>;</span><br><span class="line">    rewrite /2.html /3.html;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>访问测试：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/1.html  <span class="comment"># 说明这一次是从1.html跳转到2.html，没有继续往下面跳转。</span></span><br><span class="line">222222</span><br></pre></td></tr></table></figure></p><p>查看日志:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2020/02/18 16:15:51 [notice] 4522<span class="comment">#0: *60 "/1.html" matches "/1.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:15:51 [notice] 4522<span class="comment">#0: *60 rewritten data: "/2.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br></pre></td></tr></table></figure></p><ul><li>示例3：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line">    rewrite /1.html /2.html last;</span><br><span class="line">    rewrite /2.html /3.html;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>访问测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/1.html   <span class="comment"># 说明这一次也是从1.html跳转到2.html，没有继续往下面跳转。在server部分配置break和last作用一致</span></span><br><span class="line">222222</span><br></pre></td></tr></table></figure></p><p>查看日志:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2020/02/18 16:15:51 [notice] 4522<span class="comment">#0: *60 "/1.html" matches "/1.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:15:51 [notice] 4522<span class="comment">#0: *60 rewritten data: "/2.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br></pre></td></tr></table></figure></p><ul><li>示例4：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">    rewrite /1.html /2.html;</span><br><span class="line">    rewrite /2.html /3.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /2.html &#123;</span><br><span class="line">    rewrite /2.html /a.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /3.html &#123;</span><br><span class="line">    rewrite /3.html /b.html;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>访问测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/1.html</span><br><span class="line"></span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;&lt;title&gt;404 Not Found&lt;/title&gt;&lt;/head&gt;</span><br><span class="line">&lt;body bgcolor=<span class="string">"white"</span>&gt;</span><br><span class="line">&lt;center&gt;&lt;h1&gt;404 Not Found&lt;/h1&gt;&lt;/center&gt;</span><br><span class="line">&lt;hr&gt;&lt;center&gt;nginx&lt;/center&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure></p><p>查看日志:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 "/1.html" matches "/1.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 rewritten data: "/2.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 "/2.html" matches "/2.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 rewritten data: "/3.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 "/3.html" matches "/3.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 rewritten data: "/b.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 "/1.html" does not match "/b.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [notice] 4564<span class="comment">#0: *64 "/2.html" does not match "/b.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:23:04 [error] 4564<span class="comment">#0: *64 open() "/data/wwwroot/www.1.com/b.html" failed (2: No such file or directory), client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br></pre></td></tr></table></figure></p><p>首先匹配到1.html，1.html跳转到2.html；再匹配到2.html，2.html又跳转到3.html；接下来匹配到3.html，3.html跳转到b.html；b.html还会继续匹配，但没有匹配到，所以访问b.html，因为b.html不存在，所以返回404状态码。</p><ul><li>示例5：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">    rewrite /1.html /2.html <span class="built_in">break</span>;</span><br><span class="line">    rewrite /2.html /3.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /2.html &#123;</span><br><span class="line">    rewrite /2.html /a.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /3.html &#123;</span><br><span class="line">    rewrite /3.html /b.html;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>访问测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/1.html</span><br><span class="line">222222</span><br></pre></td></tr></table></figure></p><p>查看日志:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">2020/02/18 16:26:02 [notice] 4608<span class="comment">#0: *1 "/1.html" matches "/1.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:26:02 [notice] 4608<span class="comment">#0: *1 rewritten data: "/2.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br></pre></td></tr></table></figure></p><p>可以看到，只rewrite一次，从1.html跳转到2.html就直接退出，后面的location部分也不再执行了。</p><ul><li>示例6:<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">    rewrite /1.html /2.html last;</span><br><span class="line">    rewrite /2.html /3.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /2.html &#123;</span><br><span class="line">    rewrite /2.html /a.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    location /3.html &#123;</span><br><span class="line">    rewrite /3.html /b.html;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>访问测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/1.html</span><br><span class="line"></span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;&lt;title&gt;404 Not Found&lt;/title&gt;&lt;/head&gt;</span><br><span class="line">&lt;body bgcolor=<span class="string">"white"</span>&gt;</span><br><span class="line">&lt;center&gt;&lt;h1&gt;404 Not Found&lt;/h1&gt;&lt;/center&gt;</span><br><span class="line">&lt;hr&gt;&lt;center&gt;nginx&lt;/center&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure></p><p>查看日志：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">2020/02/18 16:27:02 [notice] 4614<span class="comment">#0: *2 "/1.html" matches "/1.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:27:02 [notice] 4614<span class="comment">#0: *2 rewritten data: "/2.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:27:02 [notice] 4614<span class="comment">#0: *2 "/2.html" matches "/2.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:27:02 [notice] 4614<span class="comment">#0: *2 rewritten data: "/a.html", args: "", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:27:02 [notice] 4614<span class="comment">#0: *2 "/1.html" does not match "/a.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:27:02 [notice] 4614<span class="comment">#0: *2 "/2.html" does not match "/a.html", client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br><span class="line">2020/02/18 16:27:02 [error] 4614<span class="comment">#0: *2 open() "/data/wwwroot/www.1.com/a.html" failed (2: No such file or directory), client: 127.0.0.1, server: www.1.com, request: "GET HTTP://www.1.com/1.html HTTP/1.1", host: "www.1.com"</span></span><br></pre></td></tr></table></figure></p><p>先从1.html跳转到2.html，因为有last，所以本location段内的下面的内容不再执行，但是会继续执行下面的location段，最后匹配到2.html（因为比 / 更精准），从2.html跳转到a.html，因为a.html不存在，所以返回404状态码。</p><p>综上，我们可以得到结论：</p><blockquote><ul><li><p>当rewrite规则在location{}外，break和last作用一样，遇到break或last后，其后续的rewrite/return语句不再执行。但后续有location{}的话，还会近一步执行location{}里面的语句,当然前提是请求必须要匹配该location。</p></li><li><p>当rewrite规则在location{}里，遇到break后，本location{}与其他location{}的所有rewrite/return规则都不再执行。</p></li><li><p>当rewrite规则在location{}里，遇到last后，本location{}里后续rewrite/return规则不执行，但重写后的url再次从头开始执行所有规则，哪个匹配执行哪个。</p></li></ul></blockquote><h1 id="Nginx-rewrite配置（二）"><a href="#Nginx-rewrite配置（二）" class="headerlink" title="Nginx rewrite配置（二）"></a>Nginx rewrite配置（二）</h1><p>格式：rewrite regex replacement [flag]</p><blockquote><ul><li><p>rewrite配置可以在server、location以及if配置段内生效</p></li><li><p>regex是用于匹配的正则表达式，其不会匹配到$host（域名）</p></li><li><p>replacement是目标跳转的uri，可以以http://或https://开头，也可以省略掉$host，直接写$request_uri部分（即请求链接）</p></li><li><p>flag，用来设置rewrite对uri的处理行为，其中有break、last、redirect、permanent。redirect和permanent的区别在于，redirect是临时重定向（302），而permanent是永久重定向（301）。对于用户访问来说，两者效果一致；但对于搜索引擎爬虫来说，使用301更利于SEO。所以，建议replacement是以http://或https://开头的，flag使用permanent</p></li></ul></blockquote><ul><li><p>示例1：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">location / &#123;</span><br><span class="line">    rewrite /(.*) http://www.123.com/<span class="variable">$1</span> permanent;  <span class="comment"># 说明：.* 为正则表达式，用()括起来，在后面的URL中可以调用它，第一次出现的()用$1调用，第二次出现的()用$2调用，依次类推。</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例2:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">location / &#123;</span><br><span class="line">    rewrite /.* http://www.123.com<span class="variable">$request_uri</span> permanent; <span class="comment"># 说明：在replacement中，支持变量，这里的$request_uri就是客户端请求的链接。</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>示例3：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    service_name www.123.com;</span><br><span class="line">    root /tmp/123.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    rewrite /(.*) /abc/<span class="variable">$1</span> redirect;  <span class="comment"># 注明：本例中的rewrite规则有问题，会造成连续循环，而nginx有个最大50次限制，循环超过50次会失败。</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>修改配置：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.2.com.conf </span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.2.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.2.com;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        rewrite /(.*) /abc/<span class="variable">$1</span> redirect;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>访问测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.2.com/1.html</span><br><span class="line"></span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;&lt;title&gt;302 Found&lt;/title&gt;&lt;/head&gt;</span><br><span class="line">&lt;body bgcolor=<span class="string">"white"</span>&gt;</span><br><span class="line">&lt;center&gt;&lt;h1&gt;302 Found&lt;/h1&gt;&lt;/center&gt;</span><br><span class="line">&lt;hr&gt;&lt;center&gt;nginx&lt;/center&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.2.com/1.html -L</span><br><span class="line">curl: (47) Maximum (50) redirects followed</span><br><span class="line"></span><br><span class="line">url -x127.0.0.1:80 www.2.com/1.html -I</span><br><span class="line"></span><br><span class="line">HTTP/1.1 302 Moved Temporarily</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 22 Apr 2019 13:41:15 GMT</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Content-Length: 154</span><br><span class="line">Location: http://www.2.com/abc/1.html</span><br><span class="line">Connection: keep-alive</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.2.com/abc/1.html -I</span><br><span class="line"></span><br><span class="line">HTTP/1.1 302 Moved Temporarily</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 22 Apr 2019 13:41:27 GMT</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Content-Length: 154</span><br><span class="line">Location: http://www.2.com/abc/abc/1.html</span><br><span class="line">Connection: keep-alive</span><br></pre></td></tr></table></figure></p><p>可以看到，一直在循环 /abc ，直到循环超过50次。</p><ul><li>示例：4<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    service_name www.123.com;</span><br><span class="line">    root /tmp/123.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    rewrite /(.*) /abc/<span class="variable">$1</span> <span class="built_in">break</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>说明：在rewrite中使用break，可以避免循环。</p><ul><li>示例5:<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    service_name www.123.com;</span><br><span class="line">    root /tmp/123.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$request_uri</span> !~ <span class="string">'^/abc/'</span>)   </span><br><span class="line">    &#123;</span><br><span class="line">        rewrite /(.*) /abc/<span class="variable">$1</span> redirect;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>说明：增加一个条件判断，也可以避免循环。</p><p>修改配置：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.2.com.conf </span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.2.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.2.com;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$request_uri</span> !~ <span class="string">'^/abc/'</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        rewrite /(.*) /abc/<span class="variable">$1</span> redirect;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>访问测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.2.com/1.html -I</span><br><span class="line"></span><br><span class="line">HTTP/1.1 302 Moved Temporarily</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 22 Apr 2019 13:48:42 GMT</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Content-Length: 154</span><br><span class="line">Location: http://www.2.com/abc/1.html</span><br><span class="line">Connection: keep-alive</span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 www.2.com/abc/1.html -I</span></span><br><span class="line"></span><br><span class="line">HTTP/1.1 404 Not Found</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 22 Apr 2019 13:50:21 GMT</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Content-Length: 162</span><br><span class="line">Connection: keep-alive</span><br></pre></td></tr></table></figure></p><h2 id="nginx全局变量"><a href="#nginx全局变量" class="headerlink" title="nginx全局变量"></a>nginx全局变量</h2><blockquote><p>nginx常用全局变量：</p></blockquote><table><thead><tr><th>变量</th><th>说明</th></tr></thead><tbody><tr><td>$args</td><td>请求中的参数，如 <a href="http://www.123.com/1.php?a=1&amp;b=2" target="_blank" rel="noopener">www.123.com/1.php?a=1&amp;b=2</a> 的$args就是 a=1&amp;b=2</td></tr><tr><td>$content_length</td><td>http请求信息里的“Content-Length”</td></tr><tr><td>$content_type</td><td>http请求信息里的“Content-Type”</td></tr><tr><td>$content_root</td><td>nginx虚拟主机配置文件中的 root参数对应的值</td></tr><tr><td>$document_uri</td><td>当前请求中不包含指令的URI，如 <a href="http://www.123.com/1.php?a=1&amp;b=2" target="_blank" rel="noopener">www.123.com/1.php?a=1&amp;b=2</a> 的 $document_uri 就是1.php，不包含后面的参数</td></tr><tr><td>$host</td><td>主机头，即域名</td></tr><tr><td>$http_user_agent</td><td>客户端的详细信息，也就是浏览器的标识，用curl -A可以指定</td></tr><tr><td>$http_cookie</td><td>客户端的cookie信息</td></tr><tr><td>$limit_rate</td><td>如果nginx服务器使用limit_rate配置了显示网络速率，则会显示，没有设置则显示为0</td></tr><tr><td>$remote_addr</td><td>客户端公网ip</td></tr><tr><td>$remote_port</td><td>客户端的port</td></tr><tr><td>$remote_user</td><td>如果nginx有配置认证，该变量代表客户端认证的用户名</td></tr><tr><td>$request_body_file</td><td>做反向代理时发给后端服务器的本地资源的名称</td></tr><tr><td>$request_method</td><td>请求资源的方式，GET/PUT/DELETE等</td></tr><tr><td>$request_filename</td><td>当前请求的资源文件的路径名称，相当于是 $document_root/$document_uri 的组合</td></tr><tr><td>$request_uri</td><td>请求的链接，包括 $document_uri 和 $args</td></tr><tr><td>$scheme</td><td>请求的协议，如ftp,http,https</td></tr><tr><td>$server_protocol</td><td>客户端请求资源使用的协议的版本，如HTTP/1.0，HTTP/1.1，HTTP/2.0等</td></tr><tr><td>$server_addr</td><td>服务器IP地址</td></tr><tr><td>$server_name</td><td>服务器的主机名</td></tr><tr><td>$server_port</td><td>服务器的端口号</td></tr><tr><td>$uri</td><td>和$document_uri相同</td></tr><tr><td>$http_referer</td><td>客户端请求时的referer，通俗讲就是该请求是通过哪个链接跳过来的，用curl -e可以指定</td></tr></tbody></table><h1 id="return用法"><a href="#return用法" class="headerlink" title="return用法"></a>return用法</h1><p>return指令一般用于对请求的客户端直接返回响应状态码。在该作用域内return后面的所有nginx配置都是无效的。可以使用在server、location以及if配置中。</p><p>除了支持跟状态码，还可以跟字符串和url链接。</p><h2 id="返回状态码"><a href="#返回状态码" class="headerlink" title="返回状态码"></a>返回状态码</h2><ul><li>示例1:<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    <span class="built_in">return</span> 403;</span><br><span class="line">    rewrite /(.*) /abc/<span class="variable">$1</span>;               <span class="comment">#该行配置不会被执行</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>.<em> 表示所有，$1表示前面的.</em></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/default.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80 default_server;</span><br><span class="line">    <span class="built_in">return</span> 403;</span><br><span class="line">    rewrite /(.*) /abc/<span class="variable">$1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># /usr/local/nginx/sbin/nginx -s reload</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 e2rwejqw.com</span></span><br><span class="line"></span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;               <span class="comment">#返回403</span></span><br><span class="line">&lt;body bgcolor=<span class="string">"white"</span>&gt;</span><br><span class="line">&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;</span><br><span class="line">&lt;hr&gt;&lt;center&gt;nginx&lt;/center&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><ul><li>示例2:<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">......</span><br><span class="line">    <span class="keyword">if</span> ( <span class="variable">$request_uri</span> ~ <span class="string">"\.htpasswd|\.bak"</span> ) &#123;</span><br><span class="line">        <span class="built_in">return</span> 405;</span><br><span class="line">        rewrite /(.*) /aaa.txt;               <span class="comment">#该行配置不会被执行    </span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">#如果下面还有其他配置，会被执行</span></span><br><span class="line">    ......</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> ( <span class="variable">$request_uri</span> ~ <span class="string">"\.htpasswd|\.bak"</span> ) &#123;</span><br><span class="line">        <span class="built_in">return</span> 405;</span><br><span class="line">        rewrite /(.*) /aaa.txt;                                   </span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># /usr/local/nginx/sbin/nginx -s reload</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 www.1.com/123/.htpasswd -I</span></span><br><span class="line"></span><br><span class="line">HTTP/1.1 405 Not Allowed                <span class="comment">#返回405</span></span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 11 Mar 2019 08:20:55 GMT</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Content-Length: 166</span><br><span class="line">Connection: keep-alive</span><br></pre></td></tr></table></figure><h2 id="返回字符串"><a href="#返回字符串" class="headerlink" title="返回字符串"></a>返回字符串</h2><ul><li>示例3：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    <span class="built_in">return</span> 200 <span class="string">"hello"</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><p>如果想返回字符串，必须加上状态码，否则会报错。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> ( <span class="variable">$request_uri</span> ~ <span class="string">"\.htpasswd|\.bak"</span> ) &#123;</span><br><span class="line">        <span class="built_in">return</span> 200 <span class="string">"error"</span>;</span><br><span class="line">        rewrite /(.*) /aaa.txt;                                   </span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># /usr/local/nginx/sbin/nginx -s reload</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 www.1.com/123/.htpasswd -I</span></span><br><span class="line"></span><br><span class="line">HTTP/1.1 200 OK</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 11 Mar 2019 08:26:58 GMT</span><br><span class="line">Content-Type: application/octet-stream</span><br><span class="line">Content-Length: 5</span><br><span class="line">Connection: keep-alive</span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 www.1.com/123/.htpasswd</span></span><br><span class="line">error</span><br></pre></td></tr></table></figure></p><p>另外还可以支持JSON数据；支持写一个变量；支持html代码。</p><ul><li>场景实战<br>背景：网站被黑，凡是在百度点击到本网站的请求，全部都跳转到一个赌博网站。</li></ul><p>通过nginx解决：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    <span class="keyword">if</span> ( <span class="variable">$http_referer</span> ~ <span class="string">'baidu.com'</span> ) &#123;</span><br><span class="line">        <span class="built_in">return</span> 200 <span class="string">"&lt;html&gt;&lt;script&gt;window.location.href='//<span class="variable">$host</span><span class="variable">$request_uri</span>';&lt;/script&gt;&lt;/html&gt;"</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>如果写成：return http://$host$reauest_uri;，这在浏览器中会提示“重定向的次数过多”。</p><p>测试:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com/123/.htpasswd -I</span><br><span class="line"></span><br><span class="line">HTTP/1.1 200 OK</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 11 Mar 2019 08:54:17 GMT</span><br><span class="line">Content-Type: application/octet-stream</span><br><span class="line">Content-Length: 79</span><br><span class="line">Connection: keep-alive</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.1.com/123/.htpasswd</span><br><span class="line"></span><br><span class="line">&lt;html&gt;&lt;script&gt;window.location.href=<span class="string">'//www.1.com/123/.htpasswd'</span>;&lt;/script&gt;&lt;/html&gt;</span><br></pre></td></tr></table></figure></p><h2 id="返回url"><a href="#返回url" class="headerlink" title="返回url"></a>返回url</h2><ul><li>示例4：</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    <span class="built_in">return</span> http://www.baidu.com;        <span class="comment">#注意：return后面的url必须是以http://或者https://开头的。</span></span><br><span class="line">    rewrite /(.*) /abc/<span class="variable">$1</span>;              <span class="comment">#该行配置不会被执行</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> ( <span class="variable">$request_uri</span> ~ <span class="string">"\.htpasswd|\.bak"</span> ) &#123;</span><br><span class="line">        <span class="built_in">return</span> http://www.baidu.com;</span><br><span class="line">        rewrite /(.*) /abc/<span class="variable">$1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"> /usr/<span class="built_in">local</span>/nginx/sbin/nginx -s reload</span><br><span class="line"></span><br><span class="line"> curl -x127.0.0.1:80 www.1.com/123/.htpasswd -I</span><br><span class="line"></span><br><span class="line">HTTP/1.1 302 Moved Temporarily</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 11 Mar 2019 08:44:07 GMT</span><br><span class="line">Content-Type: text/html</span><br><span class="line">Content-Length: 154</span><br><span class="line">Connection: keep-alive</span><br><span class="line">Location: http://www.baidu.com              <span class="comment">#临时重定向到www.baidu.com</span></span><br></pre></td></tr></table></figure><p>url前面也可以加状态码，但只能是301或302，如果是200，这url会变成字符串返回。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    index index.html;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line"></span><br><span class="line">    rewrite_log on;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> ( <span class="variable">$request_uri</span> ~ <span class="string">"\.htpasswd|\.bak"</span> ) &#123;</span><br><span class="line">        <span class="built_in">return</span> 200 http://www.baidu.com;</span><br><span class="line">        rewrite /(.*) /abc/<span class="variable">$1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># /usr/local/nginx/sbin/nginx -s reload</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 www.1.com/123/.htpasswd -I</span></span><br><span class="line"></span><br><span class="line">HTTP/1.1 200 OK</span><br><span class="line">Server: nginx</span><br><span class="line">Date: Mon, 11 Mar 2019 09:02:15 GMT</span><br><span class="line">Content-Type: application/octet-stream</span><br><span class="line">Content-Length: 20</span><br><span class="line">Connection: keep-alive</span><br><span class="line"></span><br><span class="line"><span class="comment"># curl -x127.0.0.1:80 www.1.com/123/.htpasswd</span></span><br><span class="line">http://www.baidu.com</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id=&quot;Rewrite配置（一）&quot;&gt;&lt;a href=&quot;#Rewrite配置（一）&quot; class=&quot;headerlink&quot; title=&quot;Rewrite配置（一）&quot;&gt;&lt;/a&gt;Rewrite配置（一）&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;ngin
      
    
    </summary>
    
      <category term="运维技巧" scheme="http://www.grapedlinux.cn/categories/%E8%BF%90%E7%BB%B4%E6%8A%80%E5%B7%A7/"/>
    
    
      <category term="Nginx" scheme="http://www.grapedlinux.cn/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>Nginx 虚拟主机</title>
    <link href="http://www.grapedlinux.cn/2020/02/18/Nginx-%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA/"/>
    <id>http://www.grapedlinux.cn/2020/02/18/Nginx-虚拟主机/</id>
    <published>2020-02-18T05:01:33.000Z</published>
    <updated>2020-02-18T05:02:23.462Z</updated>
    
    <content type="html"><![CDATA[<p>[TOC]</p><h1 id="Nginx虚拟主机配置"><a href="#Nginx虚拟主机配置" class="headerlink" title="Nginx虚拟主机配置"></a>Nginx虚拟主机配置</h1><blockquote><p>同一台机器上可能跑多个站点，即多个域名。在生产环境下，我们通常会配置虚拟主机来满足需求。</p></blockquote><h2 id="Nginx默认虚拟主机"><a href="#Nginx默认虚拟主机" class="headerlink" title="Nginx默认虚拟主机"></a>Nginx默认虚拟主机</h2><p><strong>默认虚拟主机</strong> 就是不管什么域名解析到该服务器上，都会访问到默认虚拟主机。</p><p>前面讲过，nginx主配置文件 ==nginx.conf== 中每一个 ==server{}== 都是一个虚拟主机（站点）。一般情况下，如果没有指定，那么第一个 ==server{}== 就是默认虚拟主机的配置。</p><p>当然， 我们还可以指定，可以在 ==server{==} 里面的 ==listen 80== 后面加上 ==default_server== ，这样就指明这个 ==server{}== 是默认虚拟主机。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">linsten 80 default_server;        <span class="comment">#以80端口为例</span></span><br></pre></td></tr></table></figure><p>通常为了规范，并不会在主配置文件下配置好多个 ==server{}== ，而是在 ==conf== 目录下面创建 ==vhost==目录，然后在 ==vhost== 目录下创建虚拟主机的配置文件，只需要在主配置文件中加上一行：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">cat /nginx/conf/nginx.conf</span><br><span class="line">user nobody;</span><br><span class="line">worker_processes 8;</span><br><span class="line"></span><br><span class="line">events &#123;</span><br><span class="line">    worker_connections  1024;</span><br><span class="line">&#125;</span><br><span class="line">http &#123;</span><br><span class="line">    include       mime.types;</span><br><span class="line">    default_type  application/octet-stream;</span><br><span class="line">    sendfile        on;</span><br><span class="line">    keepalive_timeout  65;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#    server &#123;</span></span><br><span class="line"><span class="comment">#        listen       80;</span></span><br><span class="line"><span class="comment">#        server_name  localhost;</span></span><br><span class="line"><span class="comment">#        location / &#123;</span></span><br><span class="line"><span class="comment">#            root   html;</span></span><br><span class="line"><span class="comment">#            index  index.html index.htm;</span></span><br><span class="line"><span class="comment">#        &#125;</span></span><br><span class="line"><span class="comment">#        error_page   500 502 503 504  /50x.html;</span></span><br><span class="line"><span class="comment">#        location = /50x.html &#123;</span></span><br><span class="line"><span class="comment">#            root   html;</span></span><br><span class="line"><span class="comment">#        &#125;</span></span><br><span class="line"><span class="comment">#    &#125;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">include vhost/*.conf;   <span class="comment"># 新增行</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>下面来简单测试一下：</p><ul><li><p>创建两个server{}配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">mkdir -pv /data/wwwroot/www.1.com /data/wwwroot/www.2.com</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"www.1.com"</span> &gt; /data/wwwroot/www.1.com/index.html</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"www.2.com"</span> &gt; /data/wwwroot/www.2.com/index.html</span><br><span class="line"></span><br><span class="line">mkdir /usr/<span class="built_in">local</span>/nginx/conf/vhost</span><br><span class="line"></span><br><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.1.com.conf          <span class="comment">#写入下面内容</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.1.com;</span><br><span class="line">    root /data/wwwroot/www.1.com;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/www.2.com.conf          <span class="comment">#写入下面内容</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name www.2.com;</span><br><span class="line">    root /data/wwwroot/www.2.com;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>重载Nginx配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">/usr/<span class="built_in">local</span>/nginx/sbin/nginx -t</span><br><span class="line">nginx: the configuration file /usr/<span class="built_in">local</span>/nginx/conf/nginx.conf syntax is ok</span><br><span class="line">nginx: configuration file /usr/<span class="built_in">local</span>/nginx/conf/nginx.conf <span class="built_in">test</span> is successful</span><br><span class="line"></span><br><span class="line">/usr/<span class="built_in">local</span>/nginx/sbin/nginx -s reload</span><br></pre></td></tr></table></figure></li><li><p>访问测试</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com</span><br><span class="line">www.1.com</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.2.com</span><br><span class="line">www.2.com</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.3.com          <span class="comment">#可以看出来，www.1.com是默认虚拟主机，虽然我们没有指定</span></span><br><span class="line">www.1.com</span><br></pre></td></tr></table></figure></li></ul><p>一般情况下，我们需要指定默认虚拟主机，因为不指定就是排在第一个的 ==server{}== 是默认虚拟主机，这样有点不稳定。</p><ul><li><p>指定默认虚拟主机</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/<span class="built_in">local</span>/nginx/conf/vhost/default.conf             <span class="comment">#写入下面内容</span></span><br><span class="line">server &#123;</span><br><span class="line">    listen 80 default_server;                            <span class="comment">#指定默认虚拟主机</span></span><br><span class="line">    deny all;                                            <span class="comment">#将非该服务器上的站点访问拒绝</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>访问测试</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[root@LenovoBox ~] nginx -t</span><br><span class="line">nginx: the configuration file /usr/<span class="built_in">local</span>/nginx/conf/nginx.conf syntax is ok</span><br><span class="line">nginx: configuration file /usr/<span class="built_in">local</span>/nginx/conf/nginx.conf <span class="built_in">test</span> is successful</span><br><span class="line"></span><br><span class="line">[root@LenovoBox ~] nginx -s reload</span><br><span class="line"></span><br><span class="line">[root@LenovoBox ~] curl -x127.0.0.1:80 www.3.com</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;                   <span class="comment"># 访问被拒绝</span></span><br><span class="line">&lt;hr&gt;&lt;center&gt;nginx/1.16.1&lt;/center&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure></li></ul><p>这样看起来就比较合理，服务器上没有的站点一律拒绝访问，而不是指向默认虚拟主机。</p><h2 id="虚拟主机配置规范"><a href="#虚拟主机配置规范" class="headerlink" title="虚拟主机配置规范"></a>虚拟主机配置规范</h2><p>一般规范来说，在主配置文件中 ==include== 虚拟主机配置文件，然后在 ==conf== 目录下创建 ==vhost== 目录，在 ==vhost==目录下定义虚拟主机配置，也就是 ==server{}== 配置部分。</p><p>上面在指定默认虚拟主机前的访问我们在 ==<a href="http://www.1.com.conf==" target="_blank" rel="noopener">www.1.com.conf==</a> 和 ==<a href="http://www.2.com.conf==" target="_blank" rel="noopener">www.2.com.conf==</a> 中没有指定index（索引页），它默认会访问 ==index.html== ，那如果指定的index不是 ==index.html== 呢？</p><ul><li><p>指定index</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">cat www.1.com.conf </span><br><span class="line">server &#123;</span><br><span class="line">listen 80;</span><br><span class="line">server_name www.1.com;</span><br><span class="line">index 2.html;</span><br><span class="line">root /data/wwwroot/www.1.com;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>访问测试：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">nginx -s reload</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.1.com</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;&lt;title&gt;403 Forbidden&lt;/title&gt;&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;center&gt;&lt;h1&gt;403 Forbidden&lt;/h1&gt;&lt;/center&gt;             <span class="comment">#提示403禁止访问，索引页有个特性：找不到会提示403，而不是404</span></span><br><span class="line">&lt;hr&gt;&lt;center&gt;nginx/1.16.1&lt;/center&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"2.html"</span> &gt; /data/wwwroot/www.1.com/2.html</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:80 www.1.com   </span><br><span class="line">2.html                                              <span class="comment">#有了1.html之后就会默认访问到索引页</span></span><br></pre></td></tr></table></figure></li></ul><p>同时， ==server{}== 配置部分还支持域名泛解析，一个主域名下面可能会有很多个二级域名，这就会用到泛解析。</p><ul><li><p>指定泛解析</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">cat graped.com.conf </span><br><span class="line">server &#123;</span><br><span class="line">listen 80;</span><br><span class="line">server_name graped.com  *.graped.com;          <span class="comment"># 连主域名一起访问到index，可以以空格分隔域名：</span></span><br><span class="line">root /data/wwwroot/graped.com;</span><br><span class="line">index index.html;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">mkdir -pv /data/wwwroot/graped.com</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"graped"</span> &gt; /data/wwwroot/graped.com/index.html</span><br></pre></td></tr></table></figure></li><li><p>访问测试</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 graped.com</span><br><span class="line">graped</span><br><span class="line">curl -x127.0.0.1:80 1.graped.com</span><br><span class="line">graped</span><br><span class="line">curl -x127.0.0.1:80 2.graped.com</span><br><span class="line">graped</span><br><span class="line">curl -x127.0.0.1:80 sdfasdfasdklasdopweriqweorisdaf.graped.com</span><br><span class="line">graped</span><br></pre></td></tr></table></figure></li></ul><h2 id="基于不同端口的虚拟主机"><a href="#基于不同端口的虚拟主机" class="headerlink" title="基于不同端口的虚拟主机"></a>基于不同端口的虚拟主机</h2><p>虚拟主机不一定是监听80端口，只不过同一端口下的域名不能重复，不同端口下的域名是可以重复的。</p><ul><li><p>定义同端口相同域名：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">cat www.1.com.bak.conf </span><br><span class="line">server &#123;</span><br><span class="line">listen 80;</span><br><span class="line">server_name www.1.com;</span><br><span class="line">index index.html;</span><br><span class="line">root /data/wwwroot/www.1.com.bak;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"> cat www.1.com.conf </span><br><span class="line">server &#123;</span><br><span class="line">listen 80;</span><br><span class="line">server_name www.1.com;</span><br><span class="line">index 2.html;</span><br><span class="line">root /data/wwwroot/www.1.com;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">nginx -t </span><br><span class="line">nginx: [warn] conflicting server name <span class="string">"www.1.com"</span> on 0.0.0.0:80, ignored    <span class="comment">#会有报错提示，server name 冲突</span></span><br><span class="line">nginx: the configuration file /usr/<span class="built_in">local</span>/nginx/conf/nginx.conf syntax is ok</span><br><span class="line">nginx: configuration file /usr/<span class="built_in">local</span>/nginx/conf/nginx.conf <span class="built_in">test</span> is successful</span><br></pre></td></tr></table></figure></li><li><p>定义不同端口相同域名：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">cat www.1.com.conf </span><br><span class="line">server &#123;</span><br><span class="line">listen 80;</span><br><span class="line">server_name www.1.com;</span><br><span class="line">index 2.html;</span><br><span class="line">root /data/wwwroot/www.1.com;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">cat www.1.com.bak.conf </span><br><span class="line">server &#123;</span><br><span class="line">listen 8080;</span><br><span class="line">server_name www.1.com;</span><br><span class="line">index index.html;</span><br><span class="line">root /data/wwwroot/www.1.com.bak;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">mkdir -pv /data/wwwroot/www.1.com.bak</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"www.1.com:8080"</span> &gt; /data/wwwroot/www.1.com.bak/index.html</span><br></pre></td></tr></table></figure></li><li><p>访问测试</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">curl -x127.0.0.1:80 www.1.com</span><br><span class="line">www.1.com</span><br><span class="line"></span><br><span class="line">curl -x127.0.0.1:8080 www.1.com</span><br><span class="line">www.1.com:8080</span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id=&quot;Nginx虚拟主机配置&quot;&gt;&lt;a href=&quot;#Nginx虚拟主机配置&quot; class=&quot;headerlink&quot; title=&quot;Nginx虚拟主机配置&quot;&gt;&lt;/a&gt;Nginx虚拟主机配置&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;同一台机器上可能
      
    
    </summary>
    
      <category term="运维技巧" scheme="http://www.grapedlinux.cn/categories/%E8%BF%90%E7%BB%B4%E6%8A%80%E5%B7%A7/"/>
    
    
      <category term="Nginx" scheme="http://www.grapedlinux.cn/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>Nginx配置文件详解</title>
    <link href="http://www.grapedlinux.cn/2020/01/05/Nginx%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/"/>
    <id>http://www.grapedlinux.cn/2020/01/05/Nginx配置文件详解/</id>
    <published>2020-01-04T16:05:24.000Z</published>
    <updated>2020-01-04T16:52:48.847Z</updated>
    
    <content type="html"><![CDATA[<h1 id="nginx-conf全局配置"><a href="#nginx-conf全局配置" class="headerlink" title="nginx.conf全局配置"></a>nginx.conf全局配置</h1><p>user nobody;</p><blockquote><p>定义运行nginx服务的用户,还可以加上组,如 user nobody nobody;</p></blockquote><p>worker_processes 1;</p><blockquote><p>定义nginx子进程数量，即提供服务的进程数量，该数值建议和服务cpu核数保持一致。<br>除了可以定义数字外，还可以定义为auto，表示让系统自动调整。</p></blockquote><p>error_log logs/error.log;</p><blockquote><p>定义错误日志的路径，可以是相对路径（相对prefix路径的），也可以是绝对路径。</p></blockquote><blockquote><p>该配置可以在此处定义，也可以定义到http、server、location里</p></blockquote><p>error_log logs/error.log notice;</p><blockquote><p>定义错误日志路径以及日志级别.</p></blockquote><blockquote><p>错误日志级别：常见的错误日志级别有[debug|info|notice|warn|error|crit|alert|emerg]，级别越高记录的信息越少。</p></blockquote><blockquote><p>如果不定义默认是error</p></blockquote><p>pid logs/nginx.pid;</p><blockquote><p>定义nginx进程pid文件所在路径，可以是相对路径，也可以是绝对路径。</p></blockquote><p>worker_rlimit_nofile 100000;</p><blockquote><p>定义nginx最多打开文件数限制。如果没设置的话，这个值为操作系统（ulimit -n）的限制保持一致。</p></blockquote><blockquote><p>把这个值设高，nginx就不会有“too many open files”问题了。</p></blockquote><h1 id="events配置部分"><a href="#events配置部分" class="headerlink" title="events配置部分"></a>events配置部分</h1><p>worker_connections 1024;</p><blockquote><p>定义每个work_process同时开启的最大连接数，即允许最多只能有这么多连接。</p></blockquote><p>accept_mutex on;</p><blockquote><p>当某一个时刻只有一个网络连接请求服务器时，服务器上有多个睡眠的进程会被同时叫醒，这样会损耗一定的服务器性能。</p></blockquote><blockquote><p>Nginx中的accept_mutex设置为on，将会对多个Nginx进程（worker processer）接收连接时进行序列化，防止多个进程争抢资源。<br>默认就是on。</p></blockquote><p>multi_accept on;</p><blockquote><p>nginx worker processer可以做到同时接收多个新到达的网络连接，前提是把该参数设置为on。</p></blockquote><blockquote><p>默认为off，即每个worker process一次只能接收一个新到达的网络连接。</p></blockquote><p>use epoll;</p><blockquote><p>Nginx服务器提供了多个事件驱动器模型来处理网络消息。其支持的类型有：select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。</p></blockquote><blockquote><ul><li>select：只能在Windows下使用，这个事件模型不建议在高负载的系统使用</li><li>poll:Nginx默认首选，但不是在所有系统下都可用</li><li>kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的</li><li>epoll: 这种方式是在Linux 2.6+内核中最高效的方式</li><li>rtsig:实时信号，可用在Linux 2.2.19的内核中，但不适用在高流量的系统中</li><li>/dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式</li><li>eventport: Solaris 10最高效的方式</li></ul></blockquote><h2 id="http配置部分"><a href="#http配置部分" class="headerlink" title="http配置部分"></a>http配置部分</h2><blockquote><p>官方文档 <a href="http://nginx.org/en/docs/" target="_blank" rel="noopener">http://nginx.org/en/docs/</a><br>参考链接： <a href="https://segmentfault.com/a/1190000012672431" target="_blank" rel="noopener">https://segmentfault.com/a/1190000012672431</a><br>参考链接： <a href="https://segmentfault.com/a/1190000002797601" target="_blank" rel="noopener">https://segmentfault.com/a/1190000002797601</a><br>参考链接：http的header <a href="https://kb.cnblogs.com/page/92320/" target="_blank" rel="noopener">https://kb.cnblogs.com/page/92320/</a></p></blockquote><p>MIME-Type</p><blockquote><p>include       mime.types;  //cat conf/mime.types<br>定义nginx能识别的网络资源媒体类型（如，文本、html、js、css、流媒体等）</p></blockquote><p>default_type  application/octet-stream;</p><blockquote><p>定义默认的type，如果不定义改行，默认为text/plain.</p></blockquote><p>log_format<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">log_format main  &apos;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &apos;</span><br><span class="line">                  &apos;$status $body_bytes_sent &quot;$http_referer&quot; &apos;</span><br><span class="line">                  &apos;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&apos;;</span><br></pre></td></tr></table></figure></p><blockquote><p>其中main为日志格式的名字，后面的为nginx的内部变量组成的一串字符串。</p></blockquote><p>access_log logs/access.log main;</p><blockquote><p>定义日志的路径以及采用的日志格式，该参数可以在server配置块中定义。</p></blockquote><p>sendfile on;</p><blockquote><p>是否调用sendfile函数传输文件，默认为off，使用sendfile函数传输，可以减少user mode和kernel mode的切换，从而提升服务器性能。<br>对于普通应用设为 on，如果用来进行下载等应用磁盘IO重负载应用，可设置为off，以平衡磁盘与网络I/O处理速度，降低系统的负载。</p></blockquote><p>sendfile_max_chunk 128k;</p><blockquote><p>该参数限定Nginx worker process每次调用sendfile()函数传输数据的最大值，默认值为0，如果设置为0则无限制。</p></blockquote><p>tcp_nopush on;</p><blockquote><p>当tcp_nopush设置为on时，会调用tcp_cork方法进行数据传输。<br>使用该方法会产生这样的效果：当应用程序产生数据时，内核不会立马封装包，而是当数据量积累到一定量时才会封装，然后传输。这样有助于解决网络堵塞问题。<br>默认值为on。举例：快递员收快递、发快递，包裹累积到一定量才会发，节省运输成本。</p></blockquote><p>keepalive_timeout 65 60;</p><blockquote><p>该参数有两个值，第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间，单位是秒，默认为75s。<br>第二个值可以省略，它是针对客户端的浏览器来设置的，可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60，如果不设置就没有这一项。<br>第二个数值设置后，浏览器就会根据这个数值决定何时主动关闭连接，Nginx服务器就不操心了。但有的浏览器并不认可该参数。</p></blockquote><p>send_timeout</p><blockquote><p>这个超时时间是发送响应的超时时间，即Nginx服务器向客户端发送了数据包，但客户端一直没有去接收这个数据包。<br>如果某个连接超过send_timeout定义的超时时间，那么Nginx将会关闭这个连接。</p></blockquote><p>client_max_body_size 10m;</p><blockquote><p>浏览器在发送含有较大HTTP包体的请求时，其头部会有一个Content-Length字段，client_max_body_size是用来限制Content-Length所示值的大小的。<br>这个限制包体的配置不用等Nginx接收完所有的HTTP包体，就可以告诉用户请求过大不被接受。会返回413状态码。<br>例如，用户试图上传一个1GB的文件，Nginx在收完包头后，发现Content-Length超过client_max_body_size定义的值，<br>就直接发送413(Request Entity Too Large)响应给客户端。</p></blockquote><p>gzip on；</p><blockquote><p>是否开启gzip压缩。</p></blockquote><p>gzip_min_length 1k;</p><blockquote><p>设置允许压缩的页面最小字节数，页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数，小于1k可能会越压越大。</p></blockquote><p>gzip_buffers 4 16k;</p><blockquote><p>设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流。4 16k代表分配4个16k的buffer。</p></blockquote><p>gzip_http_version 1.1;</p><blockquote><p>用于识别 http 协议的版本，早期的浏览器不支持 Gzip 压缩，用户会看到乱码，所以为了支持前期版本加上了这个选项。<br>如果你用了Nginx反向代理并期望也启用Gzip压缩的话，由于末端通信是http/1.1，故请设置为 1.1。</p></blockquote><p>gzip_comp_level 6;</p><blockquote><p>gzip压缩比，1压缩比最小处理速度最快，9压缩比最大但处理速度最慢(传输快但比较消耗cpu)</p></blockquote><p>gzip_types mime-type … ;</p><blockquote><p>匹配mime类型进行压缩，无论是否指定,”text/html”类型总是会被压缩的。<br>在conf/mime.conf里查看对应的type。<br>示例：<br><figure class="highlight plain"><figcaption><span>text/plain application/x-javascript text/css text/html application/xml;```</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">gzip_proxied any;</span><br><span class="line">&gt; Nginx作为反向代理的时候启用，决定开启或者关闭后端服务器返回的结果是否压缩，匹配的前提是后端服务器必须要返回包含”Via”的 header头。</span><br><span class="line">以下为可用的值：</span><br><span class="line">off - 关闭所有的代理结果数据的压缩</span><br><span class="line">expired - 启用压缩，如果header头中包含 &quot;Expires&quot; 头信息</span><br><span class="line">no-cache - 启用压缩，如果header头中包含 &quot;Cache-Control:no-cache&quot; 头信息</span><br><span class="line">no-store - 启用压缩，如果header头中包含 &quot;Cache-Control:no-store&quot; 头信息</span><br><span class="line">private - 启用压缩，如果header头中包含 &quot;Cache-Control:private&quot; 头信息</span><br><span class="line">no_last_modified - 启用压缩,如果header头中不包含 &quot;Last-Modified&quot; 头信息</span><br><span class="line">no_etag - 启用压缩 ,如果header头中不包含 &quot;ETag&quot; 头信息</span><br><span class="line">auth - 启用压缩 , 如果header头中包含 &quot;Authorization&quot; 头信息</span><br><span class="line">any - 无条件启用压缩</span><br><span class="line"></span><br><span class="line">gzip_vary on；</span><br><span class="line">&gt; 和http头有关系，会在响应头加个 Vary: Accept-Encoding ，可以让前端的缓存服务器缓存经过gzip压缩的页面，例如，用Squid缓存经过Nginx压缩的数据。</span><br><span class="line"></span><br><span class="line">## nginx.conf server部分配置</span><br><span class="line">&gt; server&#123;&#125; 包含在http&#123;&#125;内部，每一个server&#123;&#125;都是一个虚拟主机（站点）。</span><br><span class="line"></span><br><span class="line">##### 以下为nginx.conf配置文件中server&#123;&#125;部分的内容。</span><br><span class="line"></span><br><span class="line">```bash</span><br><span class="line">server &#123;</span><br><span class="line">    listen       80;  //监听端口为80，可以自定义其他端口，也可以加上IP地址，如，listen 127.0.0.1:8080;</span><br><span class="line">    server_name  localhost; //定义网站域名，可以写多个，用空格分隔。</span><br><span class="line">    #charset koi8-r; //定义网站的字符集，一般不设置，而是在网页代码中设置。</span><br><span class="line">    #access_log  logs/host.access.log  main; //定义访问日志，可以针对每一个server（即每一个站点）设置它们自己的访问日志。</span><br><span class="line"></span><br><span class="line">    ##在server&#123;&#125;里有很多location配置段</span><br><span class="line">    location / &#123;</span><br><span class="line">        root   html;  //定义网站根目录，目录可以是相对路径也可以是绝对路径。</span><br><span class="line">        index  index.html index.htm; //定义站点的默认页。</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    #error_page  404              /404.html;  //定义404页面</span><br><span class="line"></span><br><span class="line">    # redirect server error pages to the static page /50x.html</span><br><span class="line">    #</span><br><span class="line">    error_page   500 502 503 504  /50x.html;  //当状态码为500、502、503、504时，则访问50x.html</span><br><span class="line">    location = /50x.html &#123;</span><br><span class="line">        root   html;  //定义50x.html所在路径</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    # proxy the PHP scripts to Apache listening on 127.0.0.1:80</span><br><span class="line">    #</span><br><span class="line">    #定义访问php脚本时，将会执行本location&#123;&#125;部分指令</span><br><span class="line">    #location ~ \.php$ &#123;</span><br><span class="line">    #    proxy_pass   http://127.0.0.1;  //proxy_pass后面指定要访问的url链接，用proxy_pass实现代理。</span><br><span class="line">    #&#125;</span><br><span class="line"></span><br><span class="line">    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000</span><br><span class="line">    #</span><br><span class="line">    #location ~ \.php$ &#123;</span><br><span class="line">    #    root           html;</span><br><span class="line">    #    fastcgi_pass   127.0.0.1:9000;  //定义FastCGI服务器监听端口与地址，支持两种形式，1 IP:Port， 2 unix:/path/to/sockt</span><br><span class="line">    #    fastcgi_index  index.php;</span><br><span class="line">    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  //定义SCRIPT_FILENAME变量，后面的路径/scripts为上面的root指定的目录</span><br><span class="line">    #    include        fastcgi_params; //引用prefix/conf/fastcgi_params文件，该文件定义了fastcgi相关的变量</span><br><span class="line">    #&#125;</span><br><span class="line"></span><br><span class="line">    # deny access to .htaccess files, if Apache&apos;s document root</span><br><span class="line">    # concurs with nginx&apos;s one</span><br><span class="line">    # </span><br><span class="line">    #location ~ /\.ht &#123;   //访问的url中，以/.ht开头的，如，www.example.com/.htaccess，会被拒绝，返回403状态码。</span><br><span class="line">    #    deny  all;  //这里的all指的是所有的请求。</span><br><span class="line">    #&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># another virtual host using mix of IP-, name-, and port-based configuration</span><br><span class="line">#</span><br><span class="line">#server &#123;</span><br><span class="line">#    listen       8000;  //监听8000端口</span><br><span class="line">#    listen       somename:8080;  //指定ip:port</span><br><span class="line">#    server_name  somename  alias  another.alias;  //指定多个server_name</span><br><span class="line"></span><br><span class="line">#    location / &#123;</span><br><span class="line">#        root   html;</span><br><span class="line">#        index  index.html index.htm;</span><br><span class="line">#    &#125;</span><br><span class="line">#&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># HTTPS server</span><br><span class="line">#</span><br><span class="line">#server &#123;</span><br><span class="line">#    listen       443 ssl;  //监听443端口，即ssl</span><br><span class="line">#    server_name  localhost;</span><br><span class="line"></span><br><span class="line">### 以下为ssl相关配置</span><br><span class="line">#    ssl_certificate      cert.pem;    //指定pem文件路径</span><br><span class="line">#    ssl_certificate_key  cert.key;  //指定key文件路径</span><br><span class="line"></span><br><span class="line">#    ssl_session_cache    shared:SSL:1m;  //指定session cache大小</span><br><span class="line">#    ssl_session_timeout  5m;  //指定session超时时间</span><br><span class="line">#    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   //指定ssl协议</span><br><span class="line">#    ssl_ciphers  HIGH:!aNULL:!MD5;  //指定ssl算法</span><br><span class="line">#    ssl_prefer_server_ciphers  on;  //优先采取服务器算法</span><br><span class="line">#    location / &#123;</span><br><span class="line">#        root   html;</span><br><span class="line">#        index  index.html index.htm;</span><br><span class="line">#    &#125;</span><br><span class="line">#&#125;</span><br></pre></td></tr></table></figure></p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;nginx-conf全局配置&quot;&gt;&lt;a href=&quot;#nginx-conf全局配置&quot; class=&quot;headerlink&quot; title=&quot;nginx.conf全局配置&quot;&gt;&lt;/a&gt;nginx.conf全局配置&lt;/h1&gt;&lt;p&gt;user nobody;&lt;/p&gt;
&lt;bloc
      
    
    </summary>
    
      <category term="运维技巧" scheme="http://www.grapedlinux.cn/categories/%E8%BF%90%E7%BB%B4%E6%8A%80%E5%B7%A7/"/>
    
    
      <category term="Nginx" scheme="http://www.grapedlinux.cn/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>python的安装和pycharm的使用</title>
    <link href="http://www.grapedlinux.cn/2018/11/19/python%E7%9A%84%E5%AE%89%E8%A3%85%E5%92%8Cpycharm%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
    <id>http://www.grapedlinux.cn/2018/11/19/python的安装和pycharm的使用/</id>
    <published>2018-11-19T03:36:58.000Z</published>
    <updated>2018-11-19T03:37:43.495Z</updated>
    
    <content type="html"><![CDATA[<h1 id="环境安装"><a href="#环境安装" class="headerlink" title="环境安装"></a>环境安装</h1><h2 id="在windows-10上安装ptyhon-2-7-13和3-7-0"><a href="#在windows-10上安装ptyhon-2-7-13和3-7-0" class="headerlink" title="在windows 10上安装ptyhon 2.7.13和3.7.0"></a>在windows 10上安装ptyhon 2.7.13和3.7.0</h2><ul><li>去网站 <a href="https://www.python.org/downloads//" target="_blank" rel="noopener">www.python.org/downloads</a> </li><li>根据所需下载相对应版本，然后双击安装，一直保持默认即可。</li></ul><p>备注: 在安装时候可以通过勾选添加系统环境变量来自动添加系统环境变量，如下图<br><img src="https://i.imgur.com/8fUy8LC.png" alt="image"></p><p>安装好了输入python3和python会显示如图效果：<br><img src="https://s1.ax1x.com/2018/11/19/FSI0PA.png" alt="image"></p><h2 id="在Centos7-3上安装python2和python3"><a href="#在Centos7-3上安装python2和python3" class="headerlink" title="在Centos7.3上安装python2和python3"></a>在Centos7.3上安装python2和python3</h2><p>Centos7 默认自带python2.7<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@GrapedLinux ~]<span class="comment"># python</span></span><br><span class="line">Python <span class="number">2.7</span><span class="number">.5</span> (default, Nov  <span class="number">6</span> <span class="number">2016</span>, <span class="number">00</span>:<span class="number">28</span>:<span class="number">07</span>) </span><br><span class="line">[GCC <span class="number">4.8</span><span class="number">.5</span> <span class="number">20150623</span> (Red Hat <span class="number">4.8</span><span class="number">.5</span><span class="number">-11</span>)] on linux2</span><br><span class="line">Type <span class="string">"help"</span>, <span class="string">"copyright"</span>, <span class="string">"credits"</span> <span class="keyword">or</span> <span class="string">"license"</span> <span class="keyword">for</span> more information.</span><br><span class="line">&gt;&gt;&gt;</span><br></pre></td></tr></table></figure></p><p>centos7.3安装python3.7.0 请跳转：<a href="https://www.cnblogs.com/anxminise/p/9650206.html" target="_blank" rel="noopener">centos安装python3</a></p><p>全部安装好后，在centos上也可以同时使用pyhton和python3<br><img src="https://s1.ax1x.com/2018/11/19/FSoGJs.png" alt="image"></p><h2 id="在Window-10上安装安装-PyCharm"><a href="#在Window-10上安装安装-PyCharm" class="headerlink" title="在Window 10上安装安装 PyCharm"></a>在Window 10上安装安装 PyCharm</h2><ul><li>去网站 <a href="https://www.jetbrains.com/pycharm" target="_blank" rel="noopener">www.jetbrains.com/pycharm</a> 下载最新的pro版本pycharm</li><li>然后根据网上的教程进行激活操作，点击<a href="https://mp.weixin.qq.com/s?__biz=MzI0OTc0MzAwNA==&amp;mid=100000449&amp;idx=1&amp;sn=5ed69988cfe8cd32ad3c2f3e30e88314&amp;chksm=698d91325efa182499a2a2c11aea26b01e115764b2c347315fc07b0efc8350260d36a61ea432&amp;mpshare=1&amp;scene=1&amp;srcid=1119hpaT8zTLV0hYXAcyvvG0#rd" target="_blank" rel="noopener">跳转参考资料</a></li></ul><h2 id="设置PyCharm-抬头"><a href="#设置PyCharm-抬头" class="headerlink" title="设置PyCharm 抬头"></a>设置PyCharm 抬头</h2><p>第一次使用的时候，我们可以通过File-&gt;setting-&gt;Editot-&gt;Code Style-&gt;File and Code Templates -&gt;Python Script 来设置成如下的抬头<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python</span></span><br><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment"># @Time    : $&#123;DATE&#125; $&#123;TIME&#125;</span></span><br><span class="line"><span class="comment"># @Author  : Graped</span></span><br></pre></td></tr></table></figure></p><h2 id="第一个python例子"><a href="#第一个python例子" class="headerlink" title="第一个python例子"></a>第一个python例子</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># -*- coding:utf-8 -*-</span><br><span class="line"># @Time    : 2017/4/8 17:40</span><br><span class="line"># @Author  : Graped</span><br><span class="line">name = raw_input(&quot;print input your name: &quot;)  # raw_input 此函数用来和用户进行参数交互</span><br><span class="line">print(&quot;hello &quot; + name)</span><br></pre></td></tr></table></figure><h2 id="Pycharm常用快捷键"><a href="#Pycharm常用快捷键" class="headerlink" title="Pycharm常用快捷键"></a>Pycharm常用快捷键</h2><ul><li>Ctrl + c</li><li>Ctrl + x</li><li>Ctrl + v</li><li>Ctrl + d</li><li>Ctrl + shif + n</li><li>Ctrl + shif + f</li><li>Ctrl + 鼠标左键</li><li>Ctrl + alt + 方向左/右键    注意和系统屏幕设置的快捷键冲突</li><li>Ctrl + a；  ctrl + alt + l</li><li>Alt + enter</li><li>Ctrl + /</li><li>Tab       shift +tab</li></ul><h2 id="如何去运行一个python程序"><a href="#如何去运行一个python程序" class="headerlink" title="如何去运行一个python程序"></a>如何去运行一个python程序</h2><ol><li><p>linux系统</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">chmod + x test.py</span><br><span class="line">./test.py</span><br><span class="line">python test.py</span><br></pre></td></tr></table></figure></li><li><p>windows系统</p></li></ol><p>cmd中：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python test.py</span><br></pre></td></tr></table></figure></p><ol start="3"><li>pycharm  </li></ol><p>直接点击运行 </p><p>Pycharm的调试模式:</p><ul><li>断点：  就是程序执行到这个地方停下来</li><li>F7： Step Into 相当于eclipse的f5就是 进入到代码</li><li>F8：Step Over 相当于eclipse的f6 跳到下一步</li><li>F9： resume programe 恢复程序或者执行到下一个断点</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;环境安装&quot;&gt;&lt;a href=&quot;#环境安装&quot; class=&quot;headerlink&quot; title=&quot;环境安装&quot;&gt;&lt;/a&gt;环境安装&lt;/h1&gt;&lt;h2 id=&quot;在windows-10上安装ptyhon-2-7-13和3-7-0&quot;&gt;&lt;a href=&quot;#在windows-10上
      
    
    </summary>
    
      <category term="python" scheme="http://www.grapedlinux.cn/categories/python/"/>
    
    
      <category term="python" scheme="http://www.grapedlinux.cn/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>使用ansible-playbook推送安装nginx</title>
    <link href="http://www.grapedlinux.cn/2018/10/12/%E4%BD%BF%E7%94%A8ansible-playbook%E6%8E%A8%E9%80%81%E5%AE%89%E8%A3%85nginx/"/>
    <id>http://www.grapedlinux.cn/2018/10/12/使用ansible-playbook推送安装nginx/</id>
    <published>2018-10-12T14:57:12.000Z</published>
    <updated>2019-12-23T14:17:32.031Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用ansible-playbook推送安装nginx"><a href="#使用ansible-playbook推送安装nginx" class="headerlink" title="使用ansible-playbook推送安装nginx"></a>使用ansible-playbook推送安装nginx</h1><blockquote><p>本文主要介绍了如何将ansible-playbook投入生产中，下面我们以推送安装nginx举例</p></blockquote><h4 id="1-思路："><a href="#1-思路：" class="headerlink" title="1. 思路："></a>1. 思路：</h4><ul><li>现在主机上编译，配置好nginx，</li><li>然后将安装程序目录打包</li><li>最后用ansible分发下去</li></ul><h4 id="2-流程图如下："><a href="#2-流程图如下：" class="headerlink" title="2. 流程图如下："></a>2. 流程图如下：</h4><p><img src="https://s1.ax1x.com/2018/10/11/itW3sf.png" alt="image"></p><h4 id="3-执行配置过程"><a href="#3-执行配置过程" class="headerlink" title="3. 执行配置过程"></a>3. 执行配置过程</h4><h5 id="3-1-编译安装nginx详见：-编译安装Nginx"><a href="#3-1-编译安装nginx详见：-编译安装Nginx" class="headerlink" title="3.1 编译安装nginx详见： 编译安装Nginx"></a>3.1 编译安装nginx详见： <a href="http://note.youdao.com/noteshare?id=b73effc8df9b50ad2b63f8f0ed2ba676&amp;sub=0D01183B5BCA44C593B382FB2AE2FE3D" target="_blank" rel="noopener">编译安装Nginx</a></h5><h5 id="3-2-创建ansible-roles目录结构"><a href="#3-2-创建ansible-roles目录结构" class="headerlink" title="3.2 创建ansible roles目录结构"></a>3.2 创建ansible roles目录结构</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /etc/ansible/</span><br><span class="line">mkdir -pv nginx_install/rolse/&#123;common,install&#125;/&#123;handlers,files,meta,tasks,templates,vars&#125;</span><br></pre></td></tr></table></figure><blockquote><p>说明：</p><ul><li>roles下有两个角色，common为一些准备操作，install为安装nginx的操作</li><li>每个角色下面又有6个目录，<ul><li>handlers 下面是当发生改变时，要执行的操作，通常用在配置文件发生改变，重启服务等</li><li>flies 为安装时用到的一些文件</li><li>meta 为说明信息，说明角色依赖等信息</li><li>tasks 里面为核心配置文件</li><li>templates 通常存一些配置文件，启动脚本等模板文件</li><li>vars 下为定义的变量</li></ul></li></ul></blockquote><h5 id="3-3-将安装好的nginx程序包打包，并放到-install-files-下面，启动脚本-放入-install-templates中，"><a href="#3-3-将安装好的nginx程序包打包，并放到-install-files-下面，启动脚本-放入-install-templates中，" class="headerlink" title="3.3 将安装好的nginx程序包打包，并放到 $/install/files/ 下面，启动脚本 放入$/install/templates中，"></a>3.3 将安装好的nginx程序包打包，并放到 <code>$/install/files/</code> 下面，启动脚本 放入<code>$/install/templates</code>中，</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cp /etc/init.d/nginx /root/nginx_install/rolse/install/templates/nginx</span><br><span class="line">mv nginx.tar.gz /root/nginx_install/rolse/install/files/</span><br><span class="line">cp nginx/conf/nginx.conf /root/nginx_install/rolse/install/templates/</span><br></pre></td></tr></table></figure><h5 id="3-4-在common目录下定义安装nginx的依赖包任务"><a href="#3-4-在common目录下定义安装nginx的依赖包任务" class="headerlink" title="3.4 在common目录下定义安装nginx的依赖包任务"></a>3.4 在common目录下定义安装nginx的依赖包任务</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> common/tasks</span><br><span class="line">vim main.yml</span><br><span class="line"></span><br><span class="line">- name: install initaliztion require software</span><br><span class="line">  <span class="comment">#yum: name=&#123;&#123; items &#125;&#125; state=installed</span></span><br><span class="line">  yum: name=<span class="string">"pcre-devel,zlib-devel"</span></span><br><span class="line">  <span class="comment">#with_item</span></span><br><span class="line">  <span class="comment">#   - zlib-devel </span></span><br><span class="line">  <span class="comment">#   - prce-devel</span></span><br></pre></td></tr></table></figure><h5 id="3-5-定义变量"><a href="#3-5-定义变量" class="headerlink" title="3.5 定义变量"></a>3.5 定义变量</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> install/vars/main.yml</span><br><span class="line"></span><br><span class="line">nginx_user: www</span><br><span class="line">nginx_port: 80</span><br><span class="line">nginx_basedir: /usr/<span class="built_in">local</span>/nginx</span><br></pre></td></tr></table></figure><h5 id="3-6-定义拷贝操作"><a href="#3-6-定义拷贝操作" class="headerlink" title="3.6 定义拷贝操作"></a>3.6 定义拷贝操作</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">vim  install/tasks/copy.yml</span><br><span class="line"></span><br><span class="line">- name: Copy Nginx Software</span><br><span class="line">  copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root</span><br><span class="line">- name: Uncommpreesion Nginx Software</span><br><span class="line">  shell: tar -zxf /tmp/nginx.tar.gz -C /usr/<span class="built_in">local</span></span><br><span class="line">- name: Copy Nginx Start Scrpit</span><br><span class="line">  template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755</span><br><span class="line">- name: Copy Nginx Config</span><br><span class="line">  template: src=nginx.conf dest=&#123;&#123; nginx_basedir &#125;&#125;/conf/ owner=root group=root mode=0644</span><br></pre></td></tr></table></figure><h5 id="3-7-创建安装总线"><a href="#3-7-创建安装总线" class="headerlink" title="3.7 创建安装总线"></a>3.7 创建安装总线</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">vim install/tasks/install.yml </span><br><span class="line"> </span><br><span class="line">- name: Creat Nginx User </span><br><span class="line">  user: name=&#123;&#123; nginx_user &#125;&#125; state=present createhome=no shell=/sbin/nologin</span><br><span class="line">- name: Start Nginx Service </span><br><span class="line">  shell: /etc/init.d/nginx start</span><br><span class="line">- name: Add Boot Start Nginx Service</span><br><span class="line">  shell: chkconfig --level 345 nginx on</span><br><span class="line">- name : Delete Nginx Commpression files</span><br><span class="line">  shell: mv /tmp/nginx.tar.gz /tmp/old.tgz</span><br></pre></td></tr></table></figure><h5 id="3-8-创建执行总线"><a href="#3-8-创建执行总线" class="headerlink" title="3.8 创建执行总线"></a>3.8 创建执行总线</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vim install/tasks/main.yml</span><br><span class="line"></span><br><span class="line">- include: copy.yml</span><br><span class="line">- include: install.yml</span><br></pre></td></tr></table></figure><h5 id="3-9-创建入口配置文件"><a href="#3-9-创建入口配置文件" class="headerlink" title="3.9 创建入口配置文件"></a>3.9 创建入口配置文件</h5><pre><code class="bash">vim install.yml---- hosts: nginxlabs  remote_user: root  gather_facts: True  roles:    - common    - install</code></pre>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;使用ansible-playbook推送安装nginx&quot;&gt;&lt;a href=&quot;#使用ansible-playbook推送安装nginx&quot; class=&quot;headerlink&quot; title=&quot;使用ansible-playbook推送安装nginx&quot;&gt;&lt;/a&gt;使用ans
      
    
    </summary>
    
      <category term="自动化运维" scheme="http://www.grapedlinux.cn/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4/"/>
    
    
      <category term="ansible" scheme="http://www.grapedlinux.cn/tags/ansible/"/>
    
  </entry>
  
  <entry>
    <title>Ansible详解</title>
    <link href="http://www.grapedlinux.cn/2018/10/08/Ansible%E4%BB%8B%E7%BB%8D/"/>
    <id>http://www.grapedlinux.cn/2018/10/08/Ansible介绍/</id>
    <published>2018-10-08T03:45:12.000Z</published>
    <updated>2018-10-10T09:20:05.683Z</updated>
    
    <content type="html"><![CDATA[<p>[TOC]</p><h1 id="一、Ansible介绍"><a href="#一、Ansible介绍" class="headerlink" title="一、Ansible介绍"></a>一、Ansible介绍</h1><blockquote><ul><li>不需要安装客户端，通过sshd去通信</li><li>基于模块工作，模块可以由任何语言开发</li><li>不仅支持命令行使用模块，也支持编写yaml格式的playbook，易于编写和阅读</li><li>安装十分简单，centos可直接yum安装</li><li>有提供UI（浏览器图形化）<a href="www.ansible.com/tower">www.ansible.com/tower（收费）</a></li><li>ansible已经被redhat公司收购，它在github上是一款非常受欢迎的开源软件，Github地址：<a href="https://github.com/ansible/ansible" target="_blank" rel="noopener">https://github.com/ansible/ansible</a></li><li>一本非常不错的入门电子书 <a href="https://ansible-book.gitbooks.io/ansible-first-book/" target="_blank" rel="noopener">https://ansible-book.gitbooks.io/ansible-first-book/</a></li></ul></blockquote><h2 id="1-Ansible的安装配置"><a href="#1-Ansible的安装配置" class="headerlink" title="1.Ansible的安装配置"></a>1.Ansible的安装配置</h2><blockquote><p>本次试验的环境</p></blockquote><ul><li><strong>server1</strong> GrapedLinux: CentOS 7.3  192.168.22.76</li><li><strong>server2</strong> Linux-Test1：CentOS 7.3  192.168.22.77</li><li><strong>server3</strong> Linux-Test2：CentOS 7.3  192.168.22.78</li></ul><h3 id="1-1-yum安装ansible"><a href="#1-1-yum安装ansible" class="headerlink" title="1.1 yum安装ansible"></a>1.1 yum安装ansible</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">yum list | grep ansible</span><br><span class="line">ansible.noarch                              2.4.2.0-2.el7              extras   </span><br><span class="line">ansible-doc.noarch                          2.4.2.0-2.el7              extras   <span class="comment"># 官方文档</span></span><br><span class="line"><span class="comment"># 可以看见自带的源里就有2.4版本的ansible</span></span><br><span class="line"></span><br><span class="line">yum install -y  ansible*   <span class="comment"># 安装ansible</span></span><br></pre></td></tr></table></figure><h2 id="2-配置ansible"><a href="#2-配置ansible" class="headerlink" title="2.配置ansible"></a>2.配置ansible</h2><h3 id="2-1-在server1-上生成公钥"><a href="#2-1-在server1-上生成公钥" class="headerlink" title="2.1 在server1 上生成公钥"></a>2.1 在server1 上生成公钥</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen  -t rsa</span><br><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/root/.ssh/id_rsa): </span><br><span class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase): </span><br><span class="line">Enter same passphrase again: </span><br><span class="line">Your identification has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.</span><br><span class="line">Your public key has been saved <span class="keyword">in</span> /root/.ssh/id_rsa.pub.</span><br><span class="line">The key fingerprint is:</span><br><span class="line">8e:a1:f5:d7:cf:fe:c2:d9:9b:f8:1e:4c:ac:2b:c2:7c root@GrapedLinux</span><br><span class="line">The key<span class="string">'s randomart image is:</span></span><br><span class="line"><span class="string">+--[ RSA 2048]----+</span></span><br><span class="line"><span class="string">|                 |</span></span><br><span class="line"><span class="string">|                 |</span></span><br><span class="line"><span class="string">|                 |</span></span><br><span class="line"><span class="string">|              .  |</span></span><br><span class="line"><span class="string">|      o S      o |</span></span><br><span class="line"><span class="string">|     o =   .  +  |</span></span><br><span class="line"><span class="string">|    . . = . .o = |</span></span><br><span class="line"><span class="string">|         = E o* +|</span></span><br><span class="line"><span class="string">|          o .+*Bo|</span></span><br><span class="line"><span class="string">+-----------------+</span></span><br></pre></td></tr></table></figure><h3 id="2-2-ssh-copy-id命令来复制Ansible公钥到本机和server2节点中-server3节点不做处理。"><a href="#2-2-ssh-copy-id命令来复制Ansible公钥到本机和server2节点中-server3节点不做处理。" class="headerlink" title="2.2 ssh-copy-id命令来复制Ansible公钥到本机和server2节点中,server3节点不做处理。"></a>2.2 ssh-copy-id命令来复制Ansible公钥到本机和server2节点中,server3节点不做处理。</h3><p>复制到本机<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id -i ~/.ssh/id_rsa.pub root@127.0.0.1 </span><br><span class="line">The authenticity of host <span class="string">'127.0.0.1 (127.0.0.1)'</span> can<span class="string">'t be established. </span></span><br><span class="line"><span class="string">ECDSA key fingerprint is 96:ed:84:e0:0f:c1:71:62:fc:c3:29:fd:31:ae:8c:98.</span></span><br><span class="line"><span class="string">Are you sure you want to continue connecting (yes/no)? yes</span></span><br><span class="line"><span class="string">/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed</span></span><br><span class="line"><span class="string">/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys</span></span><br><span class="line"><span class="string">root@127.0.0.1'</span>s password: </span><br><span class="line"></span><br><span class="line">Number of key(s) added: 1</span><br><span class="line"></span><br><span class="line">Now try logging into the machine, with:   <span class="string">"ssh 'root@127.0.0.1'"</span></span><br><span class="line">and check to make sure that only the key(s) you wanted were added.</span><br></pre></td></tr></table></figure></p><p>复制到server1</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.22.77<span class="comment"># server1</span></span><br><span class="line">/usr/bin/ssh-copy-id: INFO: attempting to <span class="built_in">log</span> <span class="keyword">in</span> with the new key(s), to filter out any that are already installed</span><br><span class="line">/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- <span class="keyword">if</span> you are prompted now it is to install the new keys</span><br><span class="line">root@192.168.22.77<span class="string">'s password: </span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Number of key(s) added: 1</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Now try logging into the machine, with:   "ssh '</span>root@192.168.22.77<span class="string">'"</span></span><br><span class="line"><span class="string">and check to make sure that only the key(s) you wanted were added.</span></span><br></pre></td></tr></table></figure><h3 id="2-3-修改vi-etc-ansible-hosts"><a href="#2-3-修改vi-etc-ansible-hosts" class="headerlink" title="2.3 修改vi /etc/ansible/hosts"></a>2.3 修改<code>vi /etc/ansible/hosts</code></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/ansible/hosts</span><br><span class="line"><span class="comment"># 添加一下内容，其中Ansible-Test是组名</span></span><br><span class="line">[Ansible-Test]</span><br><span class="line">127.0.0.1</span><br><span class="line">192.168.22.77</span><br></pre></td></tr></table></figure><p>至此，Ansible的配置工作已经结束，下面我们来看看怎么使用Ansible</p><h2 id="3-使用Ansible远程执行命令"><a href="#3-使用Ansible远程执行命令" class="headerlink" title="3. 使用Ansible远程执行命令"></a>3. 使用Ansible远程执行命令</h2><p>exp1 通过选择主机组的方式在远程机器上执行基础命令</p><p><img src="https://s1.ax1x.com/2018/10/08/iJFVij.png" alt="img1"></p><p>exp2 通过IP/主机名的形式，在单独一台机器上执行基础命令</p><p><img src="https://s1.ax1x.com/2018/10/08/iJFdOK.png" alt="img2"></p><h3 id="3-1-有时候会遇见如下图报错"><a href="#3-1-有时候会遇见如下图报错" class="headerlink" title="3.1 有时候会遇见如下图报错"></a>3.1 有时候会遇见如下图报错</h3><p><img src="https://s1.ax1x.com/2018/10/08/iJFBwD.png" alt="iJFBwD.png"></p><p>这是由于server3的主机selinux没有关闭</p><p>解决办法是：</p><ul><li>关闭selinux</li><li>安装libselinux-python</li></ul><h2 id="4-使用Ansible-远程执行脚本"><a href="#4-使用Ansible-远程执行脚本" class="headerlink" title="4. 使用Ansible 远程执行脚本"></a>4. 使用Ansible 远程执行脚本</h2><p>exp3 通过选择主机组的方式在远程机器上执行脚本</p><p><img src="https://s1.ax1x.com/2018/10/08/iJFWOf.png" alt="iJFWOf.png"></p><h3 id="需要注意的是："><a href="#需要注意的是：" class="headerlink" title="需要注意的是："></a>需要注意的是：</h3><ul><li>command 不支持带管道的命令，shell支持</li></ul><p><img src="https://s1.ax1x.com/2018/10/08/iJAYKx.png" alt="iJAYKx.png"></p><h2 id="5-使用Ansible拷贝文件或者目录"><a href="#5-使用Ansible拷贝文件或者目录" class="headerlink" title="5. 使用Ansible拷贝文件或者目录"></a>5. 使用Ansible拷贝文件或者目录</h2><h3 id="5-1-拷贝目录"><a href="#5-1-拷贝目录" class="headerlink" title="5.1 拷贝目录"></a>5.1 拷贝目录</h3><p><img src="https://s1.ax1x.com/2018/10/08/iJkEnK.png" alt="iJkEnK.png"></p><h4 id="5-1-1其中各参数表示的意义是："><a href="#5-1-1其中各参数表示的意义是：" class="headerlink" title="5.1.1其中各参数表示的意义是："></a>5.1.1其中各参数表示的意义是：</h4><ul><li>src表示源目录</li><li>dest表示目标目录</li><li>owner表示所属主</li><li>group表示所属组</li><li>mode表示权限</li></ul><h4 id="5-1-2-需要注意的是"><a href="#5-1-2-需要注意的是" class="headerlink" title="5.1.2 需要注意的是:"></a>5.1.2 需要注意的是:</h4><p>源目录会放到目标目录下面去，如果目标指定的目录不存在，它会自动创建。如果拷贝的是文件</p><h4 id="5-2-拷贝文件"><a href="#5-2-拷贝文件" class="headerlink" title="5.2 拷贝文件"></a>5.2 拷贝文件</h4><p><img src="https://s1.ax1x.com/2018/10/08/iJkruV.png" alt="iJkruV.png"></p><h4 id="5-2-2-需要注意的是："><a href="#5-2-2-需要注意的是：" class="headerlink" title="5.2.2 需要注意的是："></a>5.2.2 需要注意的是：</h4><p>这里的/tmp/123和源机器上的/etc/passwd是一致的，但是如果目标机器上已经有了/tmp/123目录，则会在/tmp/123目录下面简历passwd文件</p><h2 id="6-使用ansible管理任务计划"><a href="#6-使用ansible管理任务计划" class="headerlink" title="6. 使用ansible管理任务计划"></a>6. 使用ansible管理任务计划</h2><h3 id="6-1-在serverr1上创建任务管理计划"><a href="#6-1-在serverr1上创建任务管理计划" class="headerlink" title="6.1 在serverr1上创建任务管理计划"></a>6.1 在serverr1上创建任务管理计划</h3><p><img src="https://s1.ax1x.com/2018/10/09/iJHkzd.png" alt="image"></p><h3 id="6-2-查看在server1上创建的任务计划"><a href="#6-2-查看在server1上创建的任务计划" class="headerlink" title="6.2 查看在server1上创建的任务计划"></a>6.2 查看在server1上创建的任务计划</h3><p><img src="https://s1.ax1x.com/2018/10/09/iJHZLt.png" alt="image"></p><h3 id="6-3-删除在server1上创建的计划任务"><a href="#6-3-删除在server1上创建的计划任务" class="headerlink" title="6.3 删除在server1上创建的计划任务"></a>6.3 删除在server1上创建的计划任务</h3><p><img src="https://s1.ax1x.com/2018/10/09/iYkqYQ.png" alt="image"></p><h3 id="6-4-查看server1上创建的计划任务是否已经被删除"><a href="#6-4-查看server1上创建的计划任务是否已经被删除" class="headerlink" title="6.4 查看server1上创建的计划任务是否已经被删除"></a>6.4 查看server1上创建的计划任务是否已经被删除</h3><p><img src="https://s1.ax1x.com/2018/10/09/iYkxO0.png" alt="image"></p><h3 id="6-5-注意，通过Ansible创建的计划任务不可以手工更改，否则之后就没法再进行其他操作了"><a href="#6-5-注意，通过Ansible创建的计划任务不可以手工更改，否则之后就没法再进行其他操作了" class="headerlink" title="6.5 注意，通过Ansible创建的计划任务不可以手工更改，否则之后就没法再进行其他操作了"></a>6.5 注意，通过Ansible创建的计划任务不可以手工更改，否则之后就没法再进行其他操作了</h3><h2 id="7-使用ansible安装包和管理服务"><a href="#7-使用ansible安装包和管理服务" class="headerlink" title="7. 使用ansible安装包和管理服务"></a>7. 使用ansible安装包和管理服务</h2><h3 id="7-1-使用ansible安装httpd服务"><a href="#7-1-使用ansible安装httpd服务" class="headerlink" title="7.1 使用ansible安装httpd服务"></a>7.1 使用ansible安装httpd服务</h3><p><img src="https://s1.ax1x.com/2018/10/09/iYAPkF.png" alt="image"></p><h3 id="7-2-使用ansible卸载httpd服务"><a href="#7-2-使用ansible卸载httpd服务" class="headerlink" title="7.2 使用ansible卸载httpd服务"></a>7.2 使用ansible卸载httpd服务</h3><p><img src="https://s1.ax1x.com/2018/10/09/iYAAp9.png" alt="image"></p><h3 id="7-3-使用ansible启动httpd服务"><a href="#7-3-使用ansible启动httpd服务" class="headerlink" title="7.3 使用ansible启动httpd服务"></a>7.3 使用ansible启动httpd服务</h3><p><img src="https://s1.ax1x.com/2018/10/10/iYdgzj.png" alt="image"></p><hr><h1 id="Anbsible-Playbook详解"><a href="#Anbsible-Playbook详解" class="headerlink" title="Anbsible Playbook详解"></a>Anbsible Playbook详解</h1><blockquote><p>Ansible playbook相当于把模块写入到配置文件里面，例如：</p></blockquote><h2 id="1-编写配置文件"><a href="#1-编写配置文件" class="headerlink" title="1. 编写配置文件"></a>1. 编写配置文件</h2><p>exp1:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/ansible/labs.yml</span><br><span class="line">---</span><br><span class="line">- hosts: server1</span><br><span class="line">- remote_user: root</span><br><span class="line">- tasks:</span><br><span class="line">        - name: labs</span><br><span class="line">        - shell: <span class="built_in">echo</span> `date` &gt;&gt; /tmp/time.txt</span><br></pre></td></tr></table></figure></p><h3 id="1-1配置文件说明"><a href="#1-1配置文件说明" class="headerlink" title="1.1配置文件说明"></a>1.1配置文件说明</h3><ul><li>第一行需要有三个 -</li><li>hosts参数指定了对哪些主机进行操作，如果是多台机器，可以用逗号分开，也可以使用主机组，在/etc/ansibl/hosts里定义</li><li>user参数制定了使用什么用户登录远程主机操作;</li><li>tasks 指定了一个任务，其下面的name参数同样是对任务的描述，在执行过程中会打印出来，shell是ansible模块的名字</li></ul><h2 id="2-执行nsible-playbook"><a href="#2-执行nsible-playbook" class="headerlink" title="2. 执行nsible-playbook"></a>2. 执行nsible-playbook</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ansible-play labs.yml</span><br></pre></td></tr></table></figure><p><img src="https://s1.ax1x.com/2018/10/10/iY0dVP.png" alt="image"></p><p>可以看到在server1上已经出现/tmp/time.txt</p><p><img src="https://s1.ax1x.com/2018/10/10/iY0yvj.png" alt="image"></p><h2 id="3-playbook里的变量"><a href="#3-playbook里的变量" class="headerlink" title="3. playbook里的变量"></a>3. playbook里的变量</h2><h3 id="3-1-编写创建用户Ansible-Playbook"><a href="#3-1-编写创建用户Ansible-Playbook" class="headerlink" title="3.1 编写创建用户Ansible Playbook"></a>3.1 编写创建用户Ansible Playbook</h3><p>exp2:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">vim crean_user.yml</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line">- name: crean_user</span><br><span class="line">  hosts: server1</span><br><span class="line">  user: root</span><br><span class="line">  gather_facts: <span class="literal">false</span>  <span class="comment"># 关闭facts</span></span><br><span class="line">  vars: </span><br><span class="line">    - user: <span class="string">"test"</span>  <span class="comment"># 定义user变量</span></span><br><span class="line">  tasks:</span><br><span class="line">    - name: creat_user</span><br><span class="line">      user: name=<span class="string">"&#123;&#123; user &#125;&#125;"</span>  <span class="comment"># 引用user变量，“&#123;&#123;user&#125;&#125;” 相当于shell脚本中$user</span></span><br></pre></td></tr></table></figure></p><p>执行结果如下：<br><img src="https://s1.ax1x.com/2018/10/10/iYRCQK.png" alt="image"></p><h2 id="4-playbook中的循环"><a href="#4-playbook中的循环" class="headerlink" title="4. playbook中的循环"></a>4. playbook中的循环</h2><p>exp3:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">vim while.yml </span><br><span class="line">---</span><br><span class="line">- hosts: server1</span><br><span class="line">  user: root</span><br><span class="line">  tasks:</span><br><span class="line">    - name: change mode <span class="keyword">for</span> files</span><br><span class="line">      file: path=/tmp/&#123;&#123; item &#125;&#125; state=touch  mode=600  <span class="comment"># 创建/tmp/&#123;1,2,3&#125;.txt 并富裕600权限</span></span><br><span class="line">      with_items: <span class="comment"># 循环对象</span></span><br><span class="line">        - 1.txt</span><br><span class="line">        - 2.txt</span><br><span class="line">        - 3.txt</span><br></pre></td></tr></table></figure></p><p>执行结果如下</p><p><img src="https://s1.ax1x.com/2018/10/10/iYWxv6.png" alt="image"></p><p>执行效果如下：</p><p><img src="https://s1.ax1x.com/2018/10/10/iYfSKK.png" alt="image"></p><h2 id="5-playbook中的条件判断"><a href="#5-playbook中的条件判断" class="headerlink" title="5. playbook中的条件判断"></a>5. playbook中的条件判断</h2><p>exp4:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">vim when.yml</span><br><span class="line">---</span><br><span class="line">- hosts: labs</span><br><span class="line">  user: root</span><br><span class="line">  gather_facts: <span class="literal">true</span></span><br><span class="line">  tasks:</span><br><span class="line">      - name: use when</span><br><span class="line">        shell: touch/tmp/when.txt;<span class="built_in">echo</span> <span class="string">"`date`:the ip is real"</span> &gt;&gt; /tmp/when.txt</span><br><span class="line">        when: ansible_ens33.ipv4.address == <span class="string">"192.168.22.77"</span></span><br></pre></td></tr></table></figure></p><p>执行结果如下：</p><p><img src="https://s1.ax1x.com/2018/10/10/iY4XCj.png" alt="image"></p><p>执行效果如下：</p><p><img src="https://s1.ax1x.com/2018/10/10/iY4j8s.png" alt="image"></p><h2 id="6-playbook中的handers"><a href="#6-playbook中的handers" class="headerlink" title="6. playbook中的handers"></a>6. playbook中的handers</h2><blockquote><p>handers 类似于shell中的 command1 &amp;&amp; command2</p></blockquote><p>exp5:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">- name: handlers <span class="built_in">test</span></span><br><span class="line">  hosts: server1</span><br><span class="line">  user: root</span><br><span class="line">  tasks:</span><br><span class="line">    - name: copy file</span><br><span class="line">      copy: src=/etc/passwd dest=/tmp/password</span><br><span class="line">      notify: <span class="built_in">test</span> handlers   </span><br><span class="line">  handlers: <span class="comment"># 上一步执行成功后，再执行下一步</span></span><br><span class="line">    - name: <span class="built_in">test</span> handlers</span><br><span class="line">      shell: <span class="built_in">echo</span> <span class="string">"copy finish"</span> &gt;&gt; /tmp/password</span><br></pre></td></tr></table></figure></p><p>执行结果如下：</p><p><img src="https://s1.ax1x.com/2018/10/10/iY5oW9.png" alt="image"></p><p>执行效果如下：</p><p><img src="https://s1.ax1x.com/2018/10/10/iY5bsx.png" alt="image"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id=&quot;一、Ansible介绍&quot;&gt;&lt;a href=&quot;#一、Ansible介绍&quot; class=&quot;headerlink&quot; title=&quot;一、Ansible介绍&quot;&gt;&lt;/a&gt;一、Ansible介绍&lt;/h1&gt;&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;不需
      
    
    </summary>
    
    
      <category term="Linux,Ansible" scheme="http://www.grapedlinux.cn/tags/Linux-Ansible/"/>
    
  </entry>
  
  <entry>
    <title>修改Windows实例SID以搭建域环境</title>
    <link href="http://www.grapedlinux.cn/2018/10/07/18100602/"/>
    <id>http://www.grapedlinux.cn/2018/10/07/18100602/</id>
    <published>2018-10-07T10:24:09.000Z</published>
    <updated>2018-10-10T03:07:27.839Z</updated>
    
    <content type="html"><![CDATA[<p>[TOC]</p><h1 id="修改Windows实例SID以搭建域环境"><a href="#修改Windows实例SID以搭建域环境" class="headerlink" title="修改Windows实例SID以搭建域环境"></a>修改Windows实例SID以搭建域环境</h1><p>使用同一个Windows镜像创建的几台实例之间无法互相访问域或者无法同时加入域。</p><h1 id="原因分析"><a href="#原因分析" class="headerlink" title="原因分析"></a>原因分析</h1><p>使用同一个Windows镜像的几台实例，其SID（计算机安全标识符Security Identifier）是一样的。此时需要修改系统SID，以避免无法相互访问域，再进行域环境的搭建。</p><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><p>Windows系统自带sysprep命令可以从已安装的Windows映像删除所有系统特定的信息，其中包括SID。脚本工具sysprep.ps1使用系统自带sysprep命令完成修改Windows SID。本文描述如何使用脚本工具sysprep.ps1修改系统SID。文档描述的内容适用于Windows Server 2008、Windows Server 2012和Windows Server 2016系统。</p><blockquote><p>注意：</p><ul><li>在修改系统SID前，建议您为系统盘创建快照，避免意外失败导致系统崩溃。</li><li>sysprep会将User Profile恢复为默认值，执行sysprep后会删除桌面上创建的文件。如果您希望执行脚本后自动删除，可以将文件放置在桌面上执行。</li></ul></blockquote><h2 id="修改系统SID"><a href="#修改系统SID" class="headerlink" title="修改系统SID"></a>修改系统SID</h2><p>按以下步骤修改系统SID。</p><ul><li><p><a href="https://help.aliyun.com/document_detail/25435.html?spm=a2c4g.11186623.2.14.21844abaGxsHT4" target="_blank" rel="noopener">远程连接Windows实例。</a></p></li><li><p>下载脚本工具 <a href="https://box.lenovo.com/l/c1cABd" target="_blank" rel="noopener">sysprep.ps1</a>，存放在C盘。</p></li><li><p>启动CMD，运行命令 powershell。</p></li></ul><blockquote><p>注意：<br>如果您不是管理员用户，必须以管理员身份运行PowerShell。</p></blockquote><ul><li><p>运行命令 cd\ 切换路径到C盘根目录。</p></li><li><p>运行命令 .\Sysprep.ps1 -help 查看脚本说明。</p></li></ul><p><img src="https://s1.ax1x.com/2018/10/09/iJqnPS.png" alt="IMG1"></p><p>查看脚本说明<br>参数说明：</p><table><thead><tr><th>参数</th><th style="text-align:right">说明</th></tr></thead><tbody><tr><td>-skiprearm</td><td style="text-align:right">默认将Windows操作系统恢复到原始授权许可状态，如不需恢复，添加该参数。</td></tr><tr><td>-ReserveNetwork</td><td style="text-align:right">运行脚本后保留经典网络实例的网络配置信息（IP、Subnet、Gateway、DNS），不会变动VPC网络类型ECS实例使用DHCP获取IP的配置。</td></tr><tr><td>-skippassword</td><td style="text-align:right">使用默认密码</td></tr><tr><td>-ReserveHostname</td><td style="text-align:right">保持主机名不变</td></tr><tr><td>-post_action</td><td style="text-align:right">运行脚本后的后续操作。取值范围：shutdown,reboot,quit</td></tr></tbody></table><ul><li>运行命令 whoami /user 查看系统SID。<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">WhoAmIUser</span><br></pre></td></tr></table></figure></li></ul><p><img src="http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/40846/cn_zh/1505371316862/WhoAmIUser.png" alt="image2"></p><ul><li>运行命令<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">.\Sysprep.ps1 -ReserveHostname -ReserveNetwork -skiprearm -post_action <span class="string">"reboot"</span> </span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line"></span><br><span class="line">- 在弹窗中输入密码，并单击 确定，使实例自动重启。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">![image2](https://s1.ax1x.com/<span class="number">2018</span>/<span class="number">10</span>/<span class="number">09</span>/iJqVVP.png)</span><br><span class="line"></span><br><span class="line">- [远程连接Windows实例。](https://help.aliyun.com/document_detail/<span class="number">25435</span>.html?spm=a2c4g.<span class="number">11186623.2</span>.<span class="number">14.21844</span>abaGxsHT4)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">运行命令 重新查看系统SID。</span><br><span class="line">```powershell</span><br><span class="line">whoami /user</span><br></pre></td></tr></table></figure></li></ul><h1 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h1><p>如果没有特定要求，运行以下命令时您需要修改密码。<br><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell -executionpolicy bypass -file c:\sysprep.ps1 -ReserveHostname -ReserveNetwork -skiprearm -post_action <span class="string">"reboot"</span></span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id=&quot;修改Windows实例SID以搭建域环境&quot;&gt;&lt;a href=&quot;#修改Windows实例SID以搭建域环境&quot; class=&quot;headerlink&quot; title=&quot;修改Windows实例SID以搭建域环境&quot;&gt;&lt;/a&gt;修改Windows实例SI
      
    
    </summary>
    
    
      <category term="Windows server" scheme="http://www.grapedlinux.cn/tags/Windows-server/"/>
    
  </entry>
  
  <entry>
    <title>bond绑定双网卡</title>
    <link href="http://www.grapedlinux.cn/2018/10/06/18100601/"/>
    <id>http://www.grapedlinux.cn/2018/10/06/18100601/</id>
    <published>2018-10-06T10:00:09.000Z</published>
    <updated>2018-10-07T11:11:55.808Z</updated>
    
    <content type="html"><![CDATA[<h1 id="bond绑定双网卡"><a href="#bond绑定双网卡" class="headerlink" title="bond绑定双网卡"></a>bond绑定双网卡</h1><blockquote><p>本文说明： 为什么要做bond0 <strong>&lt;a href=”<a href="https://zhidao.baidu.com/question/294361679.html" target="_blank" rel="noopener">https://zhidao.baidu.com/question/294361679.html</a> target=”_blank”&gt;点击跳转</strong></p></blockquote><h2 id="配置bond0"><a href="#配置bond0" class="headerlink" title="配置bond0"></a>配置bond0</h2><h3 id="编辑配置文件"><a href="#编辑配置文件" class="headerlink" title="编辑配置文件"></a>编辑配置文件</h3><ol><li><p>编辑虚拟网卡band0的配置文件ifcfg-bond0,加入以下内容：<br>示例如下:  </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#cat ifcfg-bond0     #需要我们手工创建</span></span><br><span class="line">DEVICE=bond0</span><br><span class="line">TYPE=Ethernet</span><br><span class="line">ONBOOT=yes</span><br><span class="line">BOOTPROTO=static</span><br><span class="line">IPADDR=10.0.0.10</span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">DNS2=4.4.4.4</span><br><span class="line">GATEWAY=10.0.0.2</span><br><span class="line">DNS1=10.0.0.2</span><br></pre></td></tr></table></figure></li><li><p>编辑各个网卡的配置文件，这里用eth1和eth2。<br>ens32:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#cat ifcfg-ens32</span></span><br><span class="line">DEVICE=eth0</span><br><span class="line">TYPE=Ethernet</span><br><span class="line">ONBOOT=yes</span><br><span class="line">BOOTPROTO=none</span><br><span class="line">MASTER=bond0</span><br><span class="line">SLAVE=yes         <span class="comment">#可以没有此字段，就需要开机执行ifenslave bond0 ens32 ens34命令了。</span></span><br><span class="line">BONDING_OPTS=<span class="string">"mode=0 miimon=100"</span></span><br></pre></td></tr></table></figure><p>ens34:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#cat ifcfg-ens34</span></span><br><span class="line">DEVICE=eth1</span><br><span class="line">TYPE=Ethernet</span><br><span class="line">ONBOOT=yes</span><br><span class="line">BOOTPROTO=none</span><br><span class="line">MASTER=bond0</span><br><span class="line">SLAVE=yes</span><br><span class="line">BONDING_OPTS=<span class="string">"mode=0 miimon=100"</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="系统加载bond"><a href="#系统加载bond" class="headerlink" title="系统加载bond"></a>系统加载bond</h3><ol start="3"><li><p>配置bonding驱动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#vi /etc/modprobe.d/bond.conf</span></span><br><span class="line"><span class="built_in">alias</span> bond0 binding</span><br><span class="line">options bond0 miimon=100 mode=0</span><br></pre></td></tr></table></figure></li><li><p>centos7默认没有加bonding内核模板，需要手工加载，加载方式</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">modprobe --first-time bonding</span><br></pre></td></tr></table></figure></li></ol><h2 id="bond0验证"><a href="#bond0验证" class="headerlink" title="bond0验证"></a>bond0验证</h2><ol start="5"><li><p>重启网卡后，可以使用  </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#cat /proc/net/bonding/bond0</span></span><br><span class="line">Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)</span><br><span class="line"></span><br><span class="line">Bonding Mode: load balancing (round-robin)</span><br><span class="line">MII Status: up</span><br><span class="line">MII Polling Interval (ms): 0</span><br><span class="line">Up Delay (ms): 0</span><br><span class="line">Down Delay (ms): 0</span><br><span class="line"></span><br><span class="line">Slave Interface: ens32</span><br><span class="line">MII Status: up</span><br><span class="line">Speed: 1000 Mbps</span><br><span class="line">Duplex: full</span><br><span class="line">Link Failure Count: 0</span><br><span class="line">Permanent HW addr: 00:50:56:bf:55:22</span><br><span class="line">Slave queue ID: 0</span><br><span class="line"></span><br><span class="line">Slave Interface: ens34</span><br><span class="line">MII Status: up</span><br><span class="line">Speed: 1000 Mbps</span><br><span class="line">Duplex: full</span><br><span class="line">Link Failure Count: 0</span><br><span class="line">Permanent HW addr: 00:50:56:bf:4a:64</span><br><span class="line">Slave queue ID: 0</span><br></pre></td></tr></table></figure></li></ol><p>来查看bond的状态。如上图，即为绑定成功。</p><h1 id="bond的七种模式"><a href="#bond的七种模式" class="headerlink" title="bond的七种模式"></a><strong>bond的七种模式</strong></h1><p> <strong>概览</strong><br>目前网卡绑定mode共有七种(0~6)bond0、bond1、bond2、bond3、bond4、bond5、bond6</p><p> <strong>常用的有三种:</strong> </p><ul><li>mode=0：平衡负载模式，有自动备援，但需要”Switch”支援及设定。</li><li>mode=1：自动备援模式，其中一条线若断线，其他线路将会自动备援。</li><li>mode=6：平衡负载模式，有自动备援，不必”Switch”支援及设定。</li></ul><p><strong>说明:</strong><br>    需要说明的是如果想做成mode 0的负载均衡,仅仅设置这里optionsbond0 miimon=100 mode=0是不够的,与网卡相连的交换机必须做特殊配置（这两个端口应该采取聚合方式），因为做bonding的这两块网卡是使用同一个MAC地址.从原理分析一下（bond运行在mode0下）：<br>       mode 0下bond所绑定的网卡的IP都被修改成相同的mac地址，如果这些网卡都被接在同一个交换机，那么交换机的arp表里这个mac地址对应的端口就有多 个，那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢？正常情况下mac地址是全球唯一的，一个mac地址对应多个端口肯定使交换机迷惑了。所以 mode0下的bond如果连接到交换机，交换机这几个端口应该采取聚合方式（cisco称为 ethernetchannel，foundry称为portgroup），因为交换机做了聚合后，聚合下的几个端口也被捆绑成一个mac地址.我们的解 决办法是，两个网卡接入不同的交换机即可。<br>       mode6模式下无需配置交换机，因为做bonding的这两块网卡是使用不同的MAC地址。</p><p> <strong>七种bond模式说明：</strong><br>第一种模式：mod=0 ，即：(balance-rr)Round-robin policy（平衡抡循环策略）<br><strong>特点：</strong> 传输数据包顺序是依次传输（即：第1个包走eth0，下一个包就走eth1….一直循环下去，直到最后一个传输完毕），此模式提供负载平衡和容错能力；但是我们知道如果一个连接或者会话的数据包从不同的接口发出的话，中途再经过不同的链路，在客户端很有可能会出现数据包无序到达的问题，而无序到达的数据包需要重新要求被发送，这样网络的吞吐量就会下降</p><p>第二种模式：mod=1，即： (active-backup)Active-backup policy（主-备份策略）<br><strong>特点：</strong> 只有一个设备处于活动状态，当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得，从外面看来，bond的MAC地址是唯一的，以避免switch(交换机)发生混乱。此模式只提供了容错能力；由此可见此算法的优点是可以提供高网络连接的可用性，但是它的资源利用率较低，只有一个接口处于工作状态，在有 N 个网络接口的情况下，资源利用率为1/N</p><p>第三种模式：mod=2，即：(balance-xor)XOR policy（平衡策略）<br><strong>特点：</strong> 基于指定的传输HASH策略传输数据包。缺省的策略是：(源MAC地址 XOR 目标MAC地址)% slave数量。其他的传输策略可以通过xmit_hash_policy选项指定，此模式提供负载平衡和容错能力</p><p>第四种模式：mod=3，即：broadcast（广播策略）<br><strong>特点：</strong> 在每个slave接口上传输每个数据包，此模式提供了容错能力</p><p>第五种模式：mod=4，即：(802.3ad)IEEE 802.3ad Dynamic link aggregation（IEEE802.3ad 动态链接聚合）<br><strong>特点：</strong> 创建一个聚合组，它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。外出流量的slave选举是基于传输hash策略，该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是，并不是所有的传输策略都是802.3ad适应的，尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。</p><p><strong>==必要条件==：</strong> </p><ul><li>条件1：ethtool支持获取每个slave的速率和双工设定</li><li>条件2：switch(交换机)支持IEEE802.3ad Dynamic link aggregation</li><li>条件3：大多数switch(交换机)需要经过特定配置才能支持802.3ad模式</li></ul><p>第六种模式：mod=5，即：(balance-tlb)Adaptive transmit load balancing（适配器传输负载均衡）<br><strong>特点：</strong> 不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载（根据速度计算）分配外出流量。如果正在接受数据的slave出故障了，另一个slave接管失败的slave的MAC地址。<br>==<strong>该模式的必要条件：</strong>== ethtool支持获取每个slave的速率</p><p>第七种模式：mod=6，即：(balance-alb)Adaptive load balancing（适配器适应性负载均衡）<br><strong>特点：</strong> 该模式包含了balance-tlb模式，同时加上针对IPV4流量的接收负载均衡(receiveload balance, rlb)，而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答，并把源硬件地址改写为bond中某个slave的唯一硬件地址，从而使得不同的对端使用不同的硬件地址进行通信。<br>来自服务器端的接收流量也会被均衡。当本机发送ARP请求时，bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达时，bonding驱动把它的硬件地址提取出来，并发起一个ARP应答给bond中的某个slave。使用ARP协商进行负载均衡的一个问题是：每次广播 ARP请求时都会使用bond的硬件地址，因此对端学习到这个硬件地址后，接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新（ARP应答）来解决，应答中包含他们独一无二的硬件地址，从而导致流量重新分布。当新的slave加入到bond中时，或者某个未激活的slave重新 激活时，接收流量也要重新分布。接收的负载被顺序地分布（roundrobin）在bond中最高速的slave上当某个链路被重新接上，或者一个新的slave加入到bond中，接收流量在所有当前激活的slave中全部重新分配，通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值，从而保证发往对端的ARP应答 不会被switch(交换机)阻截。<br><strong>==必要条件==：</strong> </p><ul><li>条件1：ethtool支持获取每个slave的速率；</li><li>条件2：底层驱动支持设置某个设备的硬件地址，从而使得总是有个slave(curr_active_slave)使用bond的硬件地址，同时保证每个 bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障，它的硬件地址将会被新选出来的 curr_active_slave接管其实mod=6与mod=0的区别：mod=6，先把eth0流量占满，再占eth1，….ethX；而mod=0的话，会发现2个口的流量都很稳定，基本一样的带宽。而mod=6，会发现第一个口流量很高，第2个口只占了小部分流量</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;bond绑定双网卡&quot;&gt;&lt;a href=&quot;#bond绑定双网卡&quot; class=&quot;headerlink&quot; title=&quot;bond绑定双网卡&quot;&gt;&lt;/a&gt;bond绑定双网卡&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;本文说明： 为什么要做bond0 &lt;strong&gt;&amp;lt;
      
    
    </summary>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Galera：多主同步MySQL集群原理解析</title>
    <link href="http://www.grapedlinux.cn/2017/05/08/17050801/"/>
    <id>http://www.grapedlinux.cn/2017/05/08/17050801/</id>
    <published>2017-05-08T11:50:09.000Z</published>
    <updated>2018-10-07T13:27:32.375Z</updated>
    
    <content type="html"><![CDATA[<h5 id="Galera-Cluster-实现mysql群集"><a href="#Galera-Cluster-实现mysql群集" class="headerlink" title="Galera Cluster 实现mysql群集"></a>Galera Cluster 实现mysql群集</h5><p>参考：<br><a href="http://blog.itpub.net/14431099/viewspace-1316643/" target="_blank" rel="noopener">http://blog.itpub.net/14431099/viewspace-1316643/ </a><br><a href="http://lovestoned.blog.51cto.com/2904444/1617817" target="_blank" rel="noopener">http://lovestoned.blog.51cto.com/2904444/1617817</a><br><a href="http://www.itbaofeng.com/?p=59" target="_blank" rel="noopener">http://www.itbaofeng.com/?p=59</a><br><a href="http://lansgg.blog.51cto.com/5675165/1180305" target="_blank" rel="noopener">http://lansgg.blog.51cto.com/5675165/1180305</a><br><a href="http://www.yunweipai.com/archives/19574.html" target="_blank" rel="noopener">http://www.yunweipai.com/archives/19574.html</a> </p><h6 id="1-MySQL-Galera介绍"><a href="#1-MySQL-Galera介绍" class="headerlink" title="1. MySQL Galera介绍"></a>1. MySQL Galera介绍</h6><ul><li>MySQL/Galera是MySQL/InnoDB的多主集群,有以下特性: </li><li>同步复制</li><li>Active-active的多主拓扑结构</li><li>集群任意节点可以读和写</li><li>自动身份控制,失败节点自动脱离集群</li><li>自动节点接入</li><li>真正的基于”行”级别和ID检查的并行复制</li><li>客户端连接跟操作单台MySQL数据库的体验一致</li></ul><p>总结下来，官网上给出了大概以上等数条优势，总结下来就是两个比较突出的点：多主和同步。<br><strong>多主：</strong><br>Galera Cluster没有MySQL主从集群只有一个主能提供写服务的限制，集群中每个节点都可读可写，无需读写分离。在一个Galera Cluster前直接部署HAProxy做读写负责均衡是比较常用的做法。<br><strong>同步：</strong><br>Galera replication具有实时性，能够保障不同节点的数据视图在较小的时间范围内是一致的。MySQL原生replication方案slave中的SQL线程和IO线程是分离的，即便使用半同步甚至同步复制，也可能因为SQL线程的速度跟不上IO线程而导致slave数据落后很多，当然5.7引入并行复制后会好很多，而Galera中除了具有并行复制的功能外，还具有flow control的功能来控制节点间数据同步的速度。</p><p>Galera本质是一个wsrep提供者（provider），运行依赖于wsrep的API接口。Wsrep API定义了一系列应用回调和复制调用库，来实现事务数据库同步写集(writeset)复制以及相似应用。目的在于从应用细节上实现抽象的，隔离的复制。虽然这个接口的主要目标是基于认证的多主复制，但同样适用于异步和同步的主从复制。</p><h6 id="2-MySQL-Galera安装"><a href="#2-MySQL-Galera安装" class="headerlink" title="2. MySQL Galera安装"></a>2. MySQL Galera安装</h6><p>安装前准备</p><ol><li>机器准备(虚拟机)</li></ol><ul><li>master    192.168.137.128</li><li>backup    192.168.137.129</li><li>joiner   192.168.137.130</li></ul><ol start="2"><li>安装依赖</li></ol><ul><li>确认安装有gcc和gcc-c++的版本最少为4.4</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y gcc gcc-c++</span><br></pre></td></tr></table></figure><ul><li>确认安装有boost-devel的版本至少为1.4.1</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y boost-devel</span><br></pre></td></tr></table></figure><ul><li>安装scons check-devel openssl-devel</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y scons check-devel openssl-devel</span><br></pre></td></tr></table></figure><h6 id="MySQL-Galera安装（从网上拷贝了一份安装文档，里面的版本为5-5-29，所以这里暂时用5-5-29版本）"><a href="#MySQL-Galera安装（从网上拷贝了一份安装文档，里面的版本为5-5-29，所以这里暂时用5-5-29版本）" class="headerlink" title="MySQL Galera安装（从网上拷贝了一份安装文档，里面的版本为5.5.29，所以这里暂时用5.5.29版本）"></a>MySQL Galera安装（从网上拷贝了一份安装文档，里面的版本为5.5.29，所以这里暂时用5.5.29版本）</h6><ol><li><p>安装含wsrep Patch的MySQL 5.5.29</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">yum install libaio</span><br><span class="line">wget https://launchpad.net/codership-mysql/5.5/5.5.29-23.7.3/+download/mysql-5.5.29_wsrep_23.7.3-linux-x86_64.tar.gz</span><br><span class="line">tar zxvf mysql-5.5.29_wsrep_23.7.3-linux-x86_64.tar.gz </span><br><span class="line">mv mysql-5.5.29_wsrep_23.7.3-linux-x86_64 /usr/local/mysql</span><br><span class="line">cd /usr/local/mysql/</span><br><span class="line">groupadd mysql</span><br><span class="line">useradd -r -g mysql mysql</span><br><span class="line">chown -R mysql:mysql .</span><br><span class="line">./scripts/mysql_install_db --no-defaults --datadir=/usr/local/mysql/data --user=mysql</span><br><span class="line">chown -R root .</span><br><span class="line">chown -R mysql data</span><br></pre></td></tr></table></figure></li><li><p>安装Galera复制插件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">wget https://launchpad.net/galera/2.x/23.2.4/+download/galera-23.2.4-src.tar.gz</span><br><span class="line">tar zxvf galera-23.2.4-src.tar.gz</span><br><span class="line">cd galera-23.2.4-src</span><br><span class="line">scons</span><br><span class="line">cp garb/garbd /usr/local/mysql/bin/</span><br><span class="line">cp libgalera_smm.so /usr/local/mysql/lib/plugin/</span><br></pre></td></tr></table></figure></li></ol><h6 id="MySQL-Galera配置"><a href="#MySQL-Galera配置" class="headerlink" title="MySQL Galera配置"></a>MySQL Galera配置</h6><ol><li>MySQL Galera配置例子:</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"> cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld</span><br><span class="line"> mkdir -p /var/lib/mysql</span><br><span class="line"> chown mysql:mysql /var/lib/mysql</span><br><span class="line"> vi /etc/my.cnf</span><br><span class="line"> cat /etc/my.cnf</span><br><span class="line"> </span><br><span class="line"> [client]</span><br><span class="line">port = 3306</span><br><span class="line">socket = /var/lib/mysql/mysql.sock</span><br><span class="line"></span><br><span class="line">[mysqld_safe]</span><br><span class="line">log-error = /var/lib/mysql/mysql.log</span><br><span class="line">pid-file = /var/lib/mysql/mysql.pid</span><br><span class="line"></span><br><span class="line">[mysqld]</span><br><span class="line">wsrep_node_name = node1</span><br><span class="line">wsrep_provider = /usr/local/mysql/lib/plugin/libgalera_smm.so</span><br><span class="line">#wsrep_provider_options =&apos;gcache.size=1G;socket.ssl_key=my_key;socket.ssl_cert=my_cert&apos;</span><br><span class="line">#wsrep_slave_threads=16</span><br><span class="line">wsrep_sst_method = rsync</span><br><span class="line">#wsrep_sst_auth=root:</span><br><span class="line"></span><br><span class="line">port = 3306</span><br><span class="line">socket = /var/lib/mysql/mysql.sock</span><br><span class="line">user = mysql</span><br><span class="line">basedir = /usr/local/mysql</span><br><span class="line">datadir = /usr/local/mysql/data</span><br><span class="line"></span><br><span class="line">default_storage_engine=InnoDB</span><br><span class="line">#innodb_buffer_pool_size=1G</span><br><span class="line">#innodb_log_file_size=256M</span><br><span class="line">innodb_autoinc_lock_mode=2</span><br><span class="line">innodb_locks_unsafe_for_binlog=1</span><br><span class="line">innodb_flush_log_at_trx_commit=0</span><br><span class="line">innodb_doublewrite=0</span><br><span class="line">innodb_file_per_table=1</span><br><span class="line"></span><br><span class="line">binlog_format=ROW</span><br><span class="line">log-bin=mysql-bin</span><br><span class="line">server-id=101</span><br><span class="line">relay-log=mysql-relay-bin</span><br><span class="line">#read_only=1</span><br><span class="line">log-slave-updates=1</span><br></pre></td></tr></table></figure><p>注：以上配置，参考与Mysql wsrep 参数</p><h6 id="Mysql-Galera启动与关闭"><a href="#Mysql-Galera启动与关闭" class="headerlink" title="Mysql  Galera启动与关闭"></a>Mysql  Galera启动与关闭</h6><ol><li>初次启动</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=gcomm:// &gt;/dev/null &amp;</span><br><span class="line"></span><br><span class="line"># 或</span><br><span class="line">service mysql start --wsrep_cluster_address=gcomm://</span><br><span class="line"></span><br><span class="line"># ”gcomm://”是特殊的地址,仅仅是galera cluster初始化启动时候使用,再次启动的时候需要使用具体的IP地址.</span><br></pre></td></tr></table></figure><ol start="2"><li>启动完成后发现mysqld的监听端口有两个<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@master ~]# netstat -plantu | grep mysqld</span><br><span class="line">tcp        0      0 0.0.0.0:4567 0.0.0.0:*          LISTEN      3656/mysqld         </span><br><span class="line">tcp        0      0 0.0.0.0:3306       0.0.0.0:*          LISTEN      3656/mysqld</span><br></pre></td></tr></table></figure></li></ol><p>这里4567端口是wsrep 使用的默认端口。</p><h6 id="MySQL-Galera新节点"><a href="#MySQL-Galera新节点" class="headerlink" title="MySQL Galera新节点"></a>MySQL Galera新节点</h6><ol><li>节点接入<br>添加新节点的时候,新接入的节点叫Joiner,给joiner提供复制的节点叫Donor.新的节点接入需要:</li></ol><ul><li>安装带wsrep patch的MySQL版本</li><li>安装Galera复制插件</li><li>配置好新节点的MySQL(参考Donnor的my.cnf)</li><li>配置或启动的gcomm://的地址是需要使用donnor的IP.</li></ul><p>接入节点backup：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=&quot;gcomm://192.168.137.128:4567,192.168.137.130:4567&quot;    &gt;/dev/null &amp;</span><br></pre></td></tr></table></figure></p><p>接入节点joiner:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mysql start --wsrep_cluster_address=&quot;gcomm://192.168.137.128:4567,192.168.137.129:4567&quot;</span><br></pre></td></tr></table></figure></p><ol start="2"><li>修改节点的wsrep_cluster_address<br>修改wsrep_cluster_address有两种方式:</li></ol><p>i. 使用新的wsrep_cluster_address重启节点:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mysql restart --wsrep_cluster_address=&quot;gcomm://192.168.137.129:4567,192.168.137.130:4567&quot;</span><br></pre></td></tr></table></figure></p><p>ii. 直接修改MySQL全局变量</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; SHOW VARIABLES LIKE &apos;wsrep_cluster_address&apos;;</span><br><span class="line">+-----------------------+----------------------------+</span><br><span class="line">| Variable_name         | Value                      |</span><br><span class="line">+-----------------------+----------------------------+</span><br><span class="line">| wsrep_cluster_address | gcomm://192.168.137.129:4567 |</span><br><span class="line">+-----------------------+----------------------------+</span><br><span class="line">1 row in set (0.00 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; set global wsrep_cluster_address=&quot;gcomm://192.168.137.129:4567,192.168.137.130:4567&quot;; Query OK, 0 rows affected (2.20 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; SHOW VARIABLES LIKE &apos;wsrep_cluster_address&apos;;</span><br><span class="line">+-----------------------+-------------------------------------------------------+</span><br><span class="line">| Variable_name         | Value                                                 |</span><br><span class="line">+-----------------------+-------------------------------------------------------+</span><br><span class="line">| wsrep_cluster_address | gcomm://192.168.137.129:4567,192.168.137.130:4567 |</span><br><span class="line">+-----------------------+-------------------------------------------------------+</span><br><span class="line">1 row in set (0.00 sec)</span><br></pre></td></tr></table></figure><h6 id="MySQL-Galera监控"><a href="#MySQL-Galera监控" class="headerlink" title="MySQL Galera监控"></a>MySQL Galera监控</h6><ol><li>查看相关变量</li></ol><ul><li><p>查看MySQL版本:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; SHOW GLOBAL VARIABLES LIKE &apos;version&apos;;</span><br><span class="line">+---------------+------------+</span><br><span class="line">| Variable_name | Value      |</span><br><span class="line">+---------------+------------+</span><br><span class="line">| version       | 5.5.29-log |</span><br><span class="line">+---------------+------------+</span><br><span class="line">1 row in set (0.00 sec)</span><br></pre></td></tr></table></figure></li><li><p>查看wsrep版本:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; SHOW GLOBAL STATUS LIKE &apos;wsrep_provider_version&apos;;</span><br><span class="line">+------------------------+------------+</span><br><span class="line">| Variable_name          | Value      |</span><br><span class="line">+------------------------+------------+</span><br><span class="line">| wsrep_provider_version | 2.4(rXXXX) |</span><br><span class="line">+------------------------+------------+</span><br><span class="line">1 row in set (0.00 sec)</span><br></pre></td></tr></table></figure></li></ul><p>查看wsrep有关的所有变量:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; SHOW VARIABLES LIKE &apos;wsrep%&apos; \G</span><br><span class="line">*************************** 1. row ***************************</span><br><span class="line">Variable_name: wsrep_OSU_method</span><br><span class="line">        Value: TOI</span><br><span class="line">*************************** 2. row ***************************</span><br><span class="line">Variable_name: wsrep_auto_increment_control</span><br><span class="line">        Value: ON</span><br><span class="line">*************************** 3. row ***************************</span><br><span class="line">Variable_name: wsrep_causal_reads</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 4. row ***************************</span><br><span class="line">Variable_name: wsrep_certify_nonPK</span><br><span class="line">        Value: ON</span><br><span class="line">*************************** 5. row ***************************</span><br><span class="line">Variable_name: wsrep_cluster_address</span><br><span class="line">        Value: gcomm://192.168.1.222:4567,192.168.1.223:4567</span><br><span class="line">*************************** 6. row ***************************</span><br><span class="line">Variable_name: wsrep_cluster_name</span><br><span class="line">        Value: my_wsrep_cluster</span><br><span class="line">*************************** 7. row ***************************</span><br><span class="line">Variable_name: wsrep_convert_LOCK_to_trx</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 8. row ***************************</span><br><span class="line">Variable_name: wsrep_data_home_dir</span><br><span class="line">        Value: /usr/local/mysql/data/</span><br><span class="line">*************************** 9. row ***************************</span><br><span class="line">Variable_name: wsrep_dbug_option</span><br><span class="line">        Value: </span><br><span class="line">*************************** 10. row ***************************</span><br><span class="line">Variable_name: wsrep_debug</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 11. row ***************************</span><br><span class="line">Variable_name: wsrep_drupal_282555_workaround</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 12. row ***************************</span><br><span class="line">Variable_name: wsrep_forced_binlog_format</span><br><span class="line">        Value: NONE</span><br><span class="line">*************************** 13. row ***************************</span><br><span class="line">Variable_name: wsrep_log_conflicts</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 14. row ***************************</span><br><span class="line">Variable_name: wsrep_max_ws_rows</span><br><span class="line">        Value: 131072</span><br><span class="line">*************************** 15. row ***************************</span><br><span class="line">Variable_name: wsrep_max_ws_size</span><br><span class="line">        Value: 1073741824</span><br><span class="line">*************************** 16. row ***************************</span><br><span class="line">Variable_name: wsrep_mysql_replication_bundle</span><br><span class="line">        Value: 0</span><br><span class="line">*************************** 17. row ***************************</span><br><span class="line">Variable_name: wsrep_node_address</span><br><span class="line">        Value: </span><br><span class="line">*************************** 18. row ***************************</span><br><span class="line">Variable_name: wsrep_node_incoming_address</span><br><span class="line">        Value: AUTO</span><br><span class="line">*************************** 19. row ***************************</span><br><span class="line">Variable_name: wsrep_node_name</span><br><span class="line">        Value: node1</span><br><span class="line">*************************** 20. row ***************************</span><br><span class="line">Variable_name: wsrep_notify_cmd</span><br><span class="line">        Value: </span><br><span class="line">*************************** 21. row ***************************</span><br><span class="line">Variable_name: wsrep_on</span><br><span class="line">        Value: ON</span><br><span class="line">*************************** 22. row ***************************</span><br><span class="line">Variable_name: wsrep_provider</span><br><span class="line">        Value: /usr/local/mysql/lib/plugin/libgalera_smm.so</span><br><span class="line">*************************** 23. row ***************************</span><br><span class="line">Variable_name: wsrep_provider_options</span><br><span class="line">        Value: base_host = 192.168.1.221; base_port = 4567; cert.log_conflicts = no; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT15S; evs.info_log_mask = 0; evs.install_timeout = PT15S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 1; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT5S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = PT5M; gcache.dir = /usr/local/mysql/data/; gcache.keep_pages_size = 0; gcache.mem_size = 0; gcache.name = /usr/local/mysql/data//galera.cache; gcache.page_size = 128M; gcache.size = 128M; gcs.fc_debug = 0; gcs.fc_factor = 1; gcs.fc_limit = 16; gcs.fc_master_slave = NO; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; gcs.recv_q_hard_limit = 9223372036854775807; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = NO; gmcast.listen_addr = tcp://0.0.0.0:4567; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.time_wait = PT5S; gmcast.version = 0; ist.recv_addr = 192.168.1.221; pc.checksum = true; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.version = 0; pc.weight = 1; protonet.backend = asio; protonet.version = 0; replicator.causal_read_timeout = PT30S; replicator.commit_order = 3</span><br><span class="line">*************************** 24. row ***************************</span><br><span class="line">Variable_name: wsrep_recover</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 25. row ***************************</span><br><span class="line">Variable_name: wsrep_replicate_myisam</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 26. row ***************************</span><br><span class="line">Variable_name: wsrep_retry_autocommit</span><br><span class="line">        Value: 1</span><br><span class="line">*************************** 27. row ***************************</span><br><span class="line">Variable_name: wsrep_slave_threads</span><br><span class="line">        Value: 2</span><br><span class="line">*************************** 28. row ***************************</span><br><span class="line">Variable_name: wsrep_sst_auth</span><br><span class="line">        Value: </span><br><span class="line">*************************** 29. row ***************************</span><br><span class="line">Variable_name: wsrep_sst_donor</span><br><span class="line">        Value: </span><br><span class="line">*************************** 30. row ***************************</span><br><span class="line">Variable_name: wsrep_sst_donor_rejects_queries</span><br><span class="line">        Value: OFF</span><br><span class="line">*************************** 31. row ***************************</span><br><span class="line">Variable_name: wsrep_sst_method</span><br><span class="line">        Value: rsync</span><br><span class="line">*************************** 32. row ***************************</span><br><span class="line">Variable_name: wsrep_sst_receive_address</span><br><span class="line">        Value: AUTO</span><br><span class="line">*************************** 33. row ***************************</span><br><span class="line">Variable_name: wsrep_start_position</span><br><span class="line">        Value: 80cdd13d-8cf2-11e2-0800-e0817023b754:0</span><br><span class="line">33 rows in set (0.00 sec)</span><br></pre></td></tr></table></figure></p><ol start="2"><li><p>状态监控<br>查看Galera集群状态:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; show status like &apos;wsrep%&apos;;</span><br><span class="line">+----------------------------+----------------------------------------------------------+</span><br><span class="line">| Variable_name              | Value                                                    |</span><br><span class="line">+----------------------------+----------------------------------------------------------+</span><br><span class="line">| wsrep_local_state_uuid     | 80cdd13d-8cf2-11e2-0800-e0817023b754                     |</span><br><span class="line">| wsrep_protocol_version     | 4                                                        |</span><br><span class="line">| wsrep_last_committed       | 3 |</span><br><span class="line">| wsrep_replicated           | 3                                                        |</span><br><span class="line">| wsrep_replicated_bytes     | 522                                                      |</span><br><span class="line">| wsrep_received             | 6  |</span><br><span class="line">| wsrep_received_bytes       | 1134  |</span><br><span class="line">| wsrep_local_commits        | 1                                                        |</span><br><span class="line">| wsrep_local_cert_failures  | 0                                                        |</span><br><span class="line">| wsrep_local_bf_aborts      | 0                                                        |</span><br><span class="line">| wsrep_local_replays        | 0                                                        |</span><br><span class="line">| wsrep_local_send_queue     | 0                                                        |</span><br><span class="line">| wsrep_local_send_queue_avg | 0.000000                                                 |</span><br><span class="line">| wsrep_local_recv_queue     | 0                                                        |</span><br><span class="line">| wsrep_local_recv_queue_avg | 0.000000                                                 |</span><br><span class="line">| wsrep_flow_control_paused  | 0.000000                                                 |</span><br><span class="line">| wsrep_flow_control_sent    | 0                                                        |</span><br><span class="line">| wsrep_flow_control_recv    | 0                                                        |</span><br><span class="line">| wsrep_cert_deps_distance   | 1.000000                                                 |</span><br><span class="line">| wsrep_apply_oooe           | 0.000000                                                 |</span><br><span class="line">| wsrep_apply_oool           | 0.000000                                                 |</span><br><span class="line">| wsrep_apply_window         | 1.000000                                                 |</span><br><span class="line">| wsrep_commit_oooe          | 0.000000                                                 |</span><br><span class="line">| wsrep_commit_oool          | 0.000000                                                 |</span><br><span class="line">| wsrep_commit_window        | 1.000000                                                 |</span><br><span class="line">| wsrep_local_state          | 4                                                        |</span><br><span class="line">| wsrep_local_state_comment  | Synced                                                   |</span><br><span class="line">| wsrep_cert_index_size      | 5                                                        |</span><br><span class="line">| wsrep_causal_reads         | 0                                                        |</span><br><span class="line">| wsrep_incoming_addresses   | 192.168.1.221:3306,192.168.1.222:3306,192.168.1.223:3306 |</span><br><span class="line">| wsrep_cluster_conf_id      | 13                                                       |</span><br><span class="line">| wsrep_cluster_size         | 3                                                        |</span><br><span class="line">| wsrep_cluster_state_uuid   | 80cdd13d-8cf2-11e2-0800-e0817023b754                     |</span><br><span class="line">| wsrep_cluster_status       | Primary                                                  |</span><br><span class="line">| wsrep_connected            | ON                                                       |</span><br><span class="line">| wsrep_local_index          | 0                                                        |</span><br><span class="line">| wsrep_provider_name        | Galera                                                   |</span><br><span class="line">| wsrep_provider_vendor      | Codership Oy                         |</span><br><span class="line">| wsrep_provider_version     | 2.4(rXXXX)                                               |</span><br><span class="line">| wsrep_ready                | ON |</span><br><span class="line">+----------------------------+----------------------------------------------------------+</span><br><span class="line">40 rows in set (0.00 sec)</span><br></pre></td></tr></table></figure></li><li><p>监控状态说明</p></li><li></li></ol><ul><li><p>集群完整性检查:</p><pre><code>wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复的时候应该会恢复一样的值.wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.wsrep_cluster_status:集群组成的状态.如果不为”Primary”,说明出现”分区”或是”split-brain”状况.</code></pre></li><li><p>节点状态检查:</p><pre><code>wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.</code></pre></li><li><p>复制健康检查:</p><pre><code>wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.wsrep_flow_control_sent:表示该节点已经停止复制了多少次.wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.</code></pre></li><li><p>检测慢网络问题:</p><pre><code>wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶</code></pre></li><li><p>冲突或死锁的数目:</p><pre><code>wsrep_last_committed:最后提交的事务数目wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目</code></pre></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h5 id=&quot;Galera-Cluster-实现mysql群集&quot;&gt;&lt;a href=&quot;#Galera-Cluster-实现mysql群集&quot; class=&quot;headerlink&quot; title=&quot;Galera Cluster 实现mysql群集&quot;&gt;&lt;/a&gt;Galera Cluster
      
    
    </summary>
    
      <category term="mysql" scheme="http://www.grapedlinux.cn/categories/mysql/"/>
    
    
      <category term="mysql" scheme="http://www.grapedlinux.cn/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>docker详解</title>
    <link href="http://www.grapedlinux.cn/2017/04/14/17041401/"/>
    <id>http://www.grapedlinux.cn/2017/04/14/17041401/</id>
    <published>2017-04-13T16:23:46.000Z</published>
    <updated>2017-04-13T16:25:39.890Z</updated>
    
    <content type="html"><![CDATA[<h5 id="容器虚拟化–docker"><a href="#容器虚拟化–docker" class="headerlink" title="容器虚拟化–docker"></a>容器虚拟化–docker</h5><h6 id="核心概念"><a href="#核心概念" class="headerlink" title="核心概念"></a>核心概念</h6><ol><li><p>镜像<br>是一个只读的模板，类似于安装系统用到的那个iso文件，我们通过镜像来完成各种应用的部署。</p></li><li><p>docker容器<br>镜像类似于操作系统，而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作，每个容器都是相互隔离的。</p></li><li><p>docker仓库<br>存放镜像的一个场所，仓库分为公开仓库和私有仓库。 最大的公开仓库是<a href="hub.docker.com">hub.docker.com</a>，国内公开仓库<a href="http://dockerpool.com/" target="_blank" rel="noopener">http://dockerpool.com/ </a></p></li></ol><h6 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h6><p>centos6(6.5之前版本需要升级一下 yum update )<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel-release</span><br><span class="line">yum install -y docker-io</span><br></pre></td></tr></table></figure></p><p>centos7<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y docker</span><br></pre></td></tr></table></figure></p><p>启动docker<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/docker start</span><br></pre></td></tr></table></figure></p><h6 id="镜像管理"><a href="#镜像管理" class="headerlink" title="镜像管理"></a>镜像管理</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">docker pull  centos   //从docker.com获取centos镜像，如果太慢，直接做个加速http://www.apelearn.com/bbs/thread-15126-1-1.html</span><br><span class="line">docker images  //查看本地都有哪些镜像</span><br><span class="line">docker tag centos graped123  //为centos镜像设置标签为graped123，再使用docker images查看会多出来一行，改行的image id和centos的一样</span><br><span class="line">docker search (image-name)   //从docker仓库搜索docker镜像，后面是关键词</span><br><span class="line">docker run -t -i centos  /bin/bash  //用下载到的镜像开启容器，-i表示让容器的标准输入打开，-t表示分配一个伪终端，要把-i -t 放到镜像名字前面</span><br><span class="line">当该镜像发生修改后，我们可以把该镜像提交重新生成一个新版本进行在本地。</span><br><span class="line">docker ps  //查看运行的容器</span><br><span class="line">docker rmi centos  //用来删除指定镜像， 其中后面的参数可以是tag，如果是tag时，实际上是删除该tag，只要该镜像还有其他tag，就不会删除该镜像。当后面的参数为镜像ID时，则会彻底删除整个镜像，连通所有标签一同删除</span><br><span class="line">docker ps -a //查看所有容器，包括已经退出的。</span><br></pre></td></tr></table></figure><p>创建镜像-基于已有镜像的容器创建<br>运行docker run后，进入到该容器中<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker exec -it f68 /bin/bash</span><br></pre></td></tr></table></figure></p><p>我们做一些变更，比如安装一些东西，然后针对这个容器进行创建新的镜像<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker commit -m &quot;change somth&quot;  -a &quot;somebody info&quot;  image_id </span><br><span class="line">#例如：</span><br><span class="line">ocker commit -m &quot;install httpd&quot; -a &quot;Graped&quot; 2c74d574293f graped/centos</span><br></pre></td></tr></table></figure></p><p>这个命令有点像svn的提交，-m 加一些改动信息，-a 指定作者相关信息 2c74d这一串为容器id，再后面为新镜像的名字。</p><p>创建镜像-基于本地模板导入<br>模块获取，可以直接在网上下载一个模块  <a href="http://openvz.org/Download/templates/precreated" target="_blank" rel="noopener">http://openvz.org/Download/templates/precreated</a> 可惜速度并不快，假如我们下载了一个centos的模板 centos-5-x86.tar.gz 那么导入该镜像的命令为：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat centos-6-x86_64-minimal.tar.gz |docker import - centos-6-x86_64</span><br></pre></td></tr></table></figure></p><p>把现有镜像，导出为一个文件：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker save -o centos_with_net.tar graped/centos</span><br></pre></td></tr></table></figure></p><p>我们还可以用该文件恢复本地镜像：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker load --input centos_net.tar  #或者</span><br><span class="line">docker load &lt; centos_net.tar</span><br></pre></td></tr></table></figure></p><p>上传镜像<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker push image_name</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h5 id=&quot;容器虚拟化–docker&quot;&gt;&lt;a href=&quot;#容器虚拟化–docker&quot; class=&quot;headerlink&quot; title=&quot;容器虚拟化–docker&quot;&gt;&lt;/a&gt;容器虚拟化–docker&lt;/h5&gt;&lt;h6 id=&quot;核心概念&quot;&gt;&lt;a href=&quot;#核心概念&quot; cla
      
    
    </summary>
    
      <category term="docker" scheme="http://www.grapedlinux.cn/categories/docker/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>MySQL调优</title>
    <link href="http://www.grapedlinux.cn/2017/04/07/17040701/"/>
    <id>http://www.grapedlinux.cn/2017/04/07/17040701/</id>
    <published>2017-04-07T12:15:18.000Z</published>
    <updated>2017-04-07T15:08:31.548Z</updated>
    
    <content type="html"><![CDATA[<p>MySQL调优可以从几个方面来做：</p><p><strong>架构层：</strong><br>做从库，实现读写分离；</p><p><strong>系统层次：</strong><br>增加内存；<br>给磁盘做raid0或者raid5以增加磁盘的读写速度；<a href="http://ask.apelearn.com/question/7134" target="_blank" rel="noopener">RAID相关</a><br>可以重新挂载磁盘，并加上noatime参数，这样可以减少磁盘的i/o;</p><p><strong>MySQL本身调优：</strong><br>(1) 如果未配置主从同步，可以把bin-log功能关闭，减少磁盘i/o<br>(2) 在my.cnf中加上skip-name-resolve,这样可以避免由于解析主机名延迟造成mysql执行慢<br>(3) 调整几个关键的buffer和cache。调整的依据，主要根据数据库的状态来调试。如何调优可以参考5.</p><p><strong>应用层次：</strong><br>查看慢查询日志，根据慢查询日志优化程序中的SQL语句，比如增加索引</p><p><strong>调整几个关键的buffer和cache</strong></p><p>1) key_buffer_size  首先可以根据系统的内存大小设定它，大概的一个参考值：1G以下内存设定128M；2G/256M; 4G/384M;8G/1024M；16G/2048M.这个值可以通过检查状态值Key_read_requests和 Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。注意：该参数值设置的过大反而会是服务器整体效率降低!</p><p>2) table_open_cache 打开一个表的时候，会临时把表里面的数据放到这部分内存中，一般设置成1024就够了，它的大小我们可以通过这样的方法来衡量： 如果你发现 open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。</p><p>3) sort_buffer_size 查询排序时所能使用的缓冲区大小,该参数对应的分配内存是每连接独占!如果有100个连接，那么实际分配的总共排序缓冲区大小为100 × 4 = 400MB。所以，对于内存在4GB左右的服务器推荐设置为4-8M。</p><p>4) read_buffer_size 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样，该参数对应的分配内存也是每连接独享!</p><p>5) join_buffer_size 联合查询操作所能使用的缓冲区大小，和sort_buffer_size一样，该参数对应的分配内存也是每连接独享!</p><p>6) myisam_sort_buffer_size 这个缓冲区主要用于修复表过程中排序索引使用的内存或者是建立索引时排序索引用到的内存大小，一般4G内存给64M即可。</p><p>7) query_cache_size MySQL查询操作缓冲区的大小，通过以下做法调整：SHOW STATUS LIKE ‘Qcache%’; 如果Qcache_lowmem_prunes该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值，用户可以适当的调整缓存大小。如果该值非常大，则表明经常出现缓冲不够的情况，需要增加缓存大小;Qcache_free_memory:查询缓存的内存大小，通过这个参数可以很清晰的知道当前系统的查询内存是否够用，是多了，还是不够用，我们可以根据实际情况做出调整。一般情况下4G内存设置64M足够了。</p><p>8) thread_cache_size 表示可以重新利用保存在缓存中线程的数，参考如下值：1G  —&gt; 8 2G  —&gt; 16 3G  —&gt; 32  &gt;3G  —&gt; 64<br>除此之外，还有几个比较关键的参数：</p><p>9) thread_concurrency 这个值设置为cpu核数的2倍即可</p><p>10) wait_timeout 表示空闲的连接超时时间，默认是28800s，这个参数是和interactive_timeout一起使用的，也就是说要想让wait_timeout 生效，必须同时设置interactive_timeout，建议他们两个都设置为10</p><p>11) max_connect_errors 是一个MySQL中与安全有关的计数器值，它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。与性能并无太大关系。为了避免一些错误我们一般都设置比较大，比如说10000 </p><p>12) max_connections 最大的连接数，根据业务请求量适当调整，设置500足够</p><p>13) max_user_connections 是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。通常我们设置为100足够 </p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;MySQL调优可以从几个方面来做：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构层：&lt;/strong&gt;&lt;br&gt;做从库，实现读写分离；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;系统层次：&lt;/strong&gt;&lt;br&gt;增加内存；&lt;br&gt;给磁盘做raid0或者raid5以增加磁盘的读写速度；&lt;a hre
      
    
    </summary>
    
      <category term="mysql" scheme="http://www.grapedlinux.cn/categories/mysql/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Hadoop伪分布式安装</title>
    <link href="http://www.grapedlinux.cn/2017/04/05/17040502/"/>
    <id>http://www.grapedlinux.cn/2017/04/05/17040502/</id>
    <published>2017-04-05T15:46:19.000Z</published>
    <updated>2017-04-05T16:40:22.603Z</updated>
    
    <content type="html"><![CDATA[<p>Hadoop内容<br>官网：<a href="http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F" target="_blank" rel="noopener">http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F</a></p><p>Hadoop内容较复杂，安装根据不同的需求有三种模式<br>独立模式（standalong/local model ）：无需任何守护进程，所有程序都单个的JVM上执行。本模式适用于开发阶段下的测试和调式MapReduce。<br>伪分布（pesudo-distributed model）：Hadoop守护进程都运行在本地服务器上，模拟一个小规模的集群<br>全分布(full distributed model)：Hadoop 守护进程运行在一个集群上。</p><p>先安装伪分布式进行结合测试</p><h4 id="1-安装前准备："><a href="#1-安装前准备：" class="headerlink" title="1. 安装前准备："></a>1. 安装前准备：</h4><ol><li>JDK1.6.X</li><li>SSH</li><li>RSYNC</li></ol><h4 id="2-下载hadoop文件之后解压到目录-直接解压后设定为Hadoop目录即可"><a href="#2-下载hadoop文件之后解压到目录-直接解压后设定为Hadoop目录即可" class="headerlink" title="2. 下载hadoop文件之后解压到目录,直接解压后设定为Hadoop目录即可"></a>2. 下载hadoop文件之后解压到目录,直接解压后设定为Hadoop目录即可</h4><p>在环境变量中添加JAVA目录与Hadoop目录<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">PATH=$PATH:$HOME/bin</span><br><span class="line">#export PATH</span><br><span class="line">export JAVA_HOME=/usr/local/java/jdk1.6.0_30</span><br><span class="line">export PATH=$JAVA_HOME/bin:/usr/local/mysql/bin:$PATH</span><br><span class="line">export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar</span><br><span class="line">unset USERNAME</span><br><span class="line">export HADOOP_INSTALL=/usr/local/hadoop</span><br><span class="line">export PATH=$PATH:$HADOOP_INSTALL/bin</span><br></pre></td></tr></table></figure></p><p>执行hadoop version 查看hadoop版本，且查看是否运行<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@test /] hadoop version</span><br><span class="line">Hadoop 1.2.1</span><br><span class="line">Subversion https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152</span><br><span class="line">Compiled by mattf on Mon Jul 22 15:23:09 PDT 2013</span><br><span class="line">From source with checksum 6923c86528809c4e7e6f493b6b413a9a</span><br><span class="line">This command was run using /usr/local/hadoop/hadoop-core-1.2.1.jar</span><br></pre></td></tr></table></figure></p><h4 id="3-配置SSH"><a href="#3-配置SSH" class="headerlink" title="3. 配置SSH"></a>3. 配置SSH</h4><p>首先要能ssh登录到本机</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh localhost</span><br></pre></td></tr></table></figure><p>如果无法登录，执行<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@zabbix hadoop] ssh-keygen  -t dsa -P &apos;&apos; -f ~/.ssh/id_sea</span><br><span class="line">[root@zabbix hadoop] cat ~/.ssh/id_dsa.pub &amp;gt;&amp;gt;~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure></p><h4 id="4-格式化HDFS文件系统"><a href="#4-格式化HDFS文件系统" class="headerlink" title="4. 格式化HDFS文件系统"></a>4. 格式化HDFS文件系统</h4><p>使用Hadoop前，必须格式化一个全新的HDFS系统 ，创建一个空的文件系统。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hadoop namenode -frmat</span><br></pre></td></tr></table></figure></p><h4 id="5-Hadoop配置文件"><a href="#5-Hadoop配置文件" class="headerlink" title="5. Hadoop配置文件"></a>5. Hadoop配置文件</h4><p>conf目录中<br>core-site.xml 配置Common组件<br>hdfs-site.xml 配置HDFS属性<br>mapred-site.xml 配置MapReduce属性<br>默认情况下，三种模式的默认配置如图<br><img src="http://ask.apelearn.com/uploads/questions/20130929/145421x1hhs0fkgx00u11g.png" alt="image"></p><p>修改配置文件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">/core-site.xml</span><br><span class="line">fs.default.namehdfs://localhost/</span><br><span class="line">//hdfs-site.xml</span><br><span class="line">dfs.replication1</span><br><span class="line">//mapred-site.xml</span><br><span class="line">mapred.job.trackerlocalhost:8021</span><br></pre></td></tr></table></figure></p><h4 id="6-启动HDFS和MapReduce守护进程"><a href="#6-启动HDFS和MapReduce守护进程" class="headerlink" title="6. 启动HDFS和MapReduce守护进程"></a>6. 启动HDFS和MapReduce守护进程</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[root@test conf] start-dfs.sh</span><br><span class="line">starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-namenode-zabbix.out</span><br><span class="line">localhost: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-datanode-zabbix.out</span><br><span class="line">localhost: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-secondarynamenode-zabbix.out</span><br><span class="line">[root@test conf]  start-mapred.sh</span><br><span class="line">starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-jobtracker-zabbix.out</span><br><span class="line">localhost: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-tasktracker-zabbix.out</span><br></pre></td></tr></table></figure><h4 id="7-查看进程是否启动"><a href="#7-查看进程是否启动" class="headerlink" title="7. 查看进程是否启动"></a>7. 查看进程是否启动</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">http://namenode:50030/jobtracker.jsp</span><br><span class="line">http://namenode:50070/dfshealth.jsp</span><br><span class="line">[root@test conf]# netstat -lnp |grep 50030</span><br><span class="line">tcp        0      0 :::50030                    :::*                        LISTEN      3071/java           </span><br><span class="line">[root@test conf]# netstat -lnp |grep 50070</span><br><span class="line">tcp        0      0 :::50070               :::*                        LISTEN      2676/java</span><br></pre></td></tr></table></figure><p>JAVA的jps查看<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">jps</span><br><span class="line">3220 TaskTracker</span><br><span class="line">2676 NameNode</span><br><span class="line">3071 JobTracker</span><br><span class="line">2803 DataNode</span><br><span class="line">2962 SecondaryNameNode</span><br><span class="line">3503 Jps</span><br></pre></td></tr></table></figure></p><p><strong>Hadoop常用命令</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">//查看HDFS文件列表</span><br><span class="line">hadoop fs -ls /usr/local/log/</span><br><span class="line">//创建文件目录</span><br><span class="line">hadoop fs -mkdir /usr/local/log/test</span><br><span class="line">//删除文件</span><br><span class="line">/hadoop fs -rm /usr/local/log/11</span><br><span class="line">//上传一个本机文件到HDFS中/usr/local/log/目录下</span><br><span class="line">adoop fs -put /usr/local/src/infobright-4.0.6-0-x86_64-ice.rpm  /usr/local/log/</span><br><span class="line">//下载</span><br><span class="line">hadoop fs –get /usr/local/log/infobright-4.0.6-0-x86_64-ice.rpm   /usr/local/src/</span><br><span class="line">//查看文件</span><br><span class="line">hadoop fs -cat /usr/local/log/20131008_10/access.log.zabbix</span><br><span class="line">//查看HDFS基本使用情况</span><br><span class="line">[root@hh ~] hadoop dfsadmin -report</span><br><span class="line">Configured Capacity: 10397683712 (9.68 GB)</span><br><span class="line">Present Capacity: 9388027904 (8.74 GB)</span><br><span class="line">DFS Remaining: 9324613632 (8.68 GB)</span><br><span class="line">DFS Used: 63414272 (60.48 MB)                                 </span><br><span class="line">DFS Used%: 0.68%</span><br><span class="line">Under replicated blocks: 1</span><br><span class="line">Blocks with corrupt replicas: 0</span><br><span class="line">Missing blocks: 1</span><br><span class="line">-------------------------------------------------</span><br><span class="line">Datanodes available: 1 (1 total, 0 dead)</span><br><span class="line">Name: 127.0.0.1:50010</span><br><span class="line">Decommission Status : Normal</span><br><span class="line">Configured Capacity: 10397683712 (9.68 GB)</span><br><span class="line">DFS Used: 63414272 (60.48 MB)</span><br><span class="line">Non DFS Used: 1009655808 (962.88 MB)</span><br><span class="line">DFS Remaining: 9324613632(8.68 GB)</span><br><span class="line">DFS Used%: 0.61%</span><br><span class="line">DFS Remaining%: 89.68%</span><br><span class="line">Last contact: Tue Oct 08 13:41:05 CST 2013</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Hadoop内容&lt;br&gt;官网：&lt;a href=&quot;http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://hadoop.apache.org/#What
      
    
    </summary>
    
      <category term="hadoop" scheme="http://www.grapedlinux.cn/categories/hadoop/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>rsync 自动安装脚本</title>
    <link href="http://www.grapedlinux.cn/2017/04/05/17040501/"/>
    <id>http://www.grapedlinux.cn/2017/04/05/17040501/</id>
    <published>2017-04-05T07:15:36.000Z</published>
    <updated>2017-04-05T16:41:25.441Z</updated>
    
    <content type="html"><![CDATA[<p>rsync 自动安装脚本</p><pre><code>#!/bin/bash#home_page http://grapedlinux.cnrpm -q rsync &amp;&gt;/dev/null;rpm -q xinetd &amp;&gt;/dev/null || yum install rsync xinetd --nogpgcheck -y &amp;&gt;/dev/nullt=$(echo $?)if [[ &quot;$t&quot; != 0 ]];then    echo &quot;rsync is not install,try to install is faild,please check you yum configure or network! &quot;    exit 5fised -i &apos;s/yes/no/&apos; /etc/xinetd.d/rsync cat &gt; /etc/rsyncd.conf &lt;&lt;EOFuid = rootgid = rootuser chroot = nomax connections = 0[nginxconf]path=/usr/local/nginx/conf/ignore errorsread only = yeslist = nohosts allow = 10.15.6.50auth users = syncusersecrets file = /etc/server.pass[blogdata]path=/data/blog_data_bak/ignore errorsread only = yeslist = nohosts allow = 10.23.16.8auth users = syncusersecrets file = /etc/server.passEOFcat &gt; /etc/server.pass &lt;&lt;EOFsyncuser:password-not-foundEOFchmod 600 /etc/server.passservice xinetd restart &amp;&gt;/dev/nullres=$(netstat -nutlp | grep 873 | grep -v grep | wc -l)if [[ $res -ne 1 ]];then    echo &quot;Something wrong! please check.&quot;ficat &lt;&lt;EOFRynsc configure is success!config file is /etc/rsyncd.confpass file is /etc/server.passEOF</code></pre>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;rsync 自动安装脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
#home_page http://grapedlinux.cn

rpm -q rsync &amp;amp;&amp;gt;/dev/null;
rpm -q xinetd &amp;amp;&amp;gt;/dev/nu
      
    
    </summary>
    
      <category term="shellscripts" scheme="http://www.grapedlinux.cn/categories/shellscripts/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Redis详解</title>
    <link href="http://www.grapedlinux.cn/2017/04/04/17040403/"/>
    <id>http://www.grapedlinux.cn/2017/04/04/17040403/</id>
    <published>2017-04-04T15:35:45.000Z</published>
    <updated>2017-04-04T16:29:20.088Z</updated>
    
    <content type="html"><![CDATA[<p><strong>一、Redis介绍</strong></p><ul><li>redis是一个key-value存储系统，官方站点<a href="http://redis.io" target="_blank" rel="noopener">http://redis.io</a></li><li>和memcached类似，但支持数据持久化</li><li>支持更多value类型，除了和string外，还支持hash、lists(链表）、sets(集合）和sorted sets（有序集合）集中数据类型</li><li>redis使用了两种文件格式：全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中的数据写入磁盘，便于下次读取文件进行加载。增量请求文件则是把内存中的数据序列化为操作请求，用于读取文件进行replay得到数据</li><li>redis的存储分为内存存储、磁盘存储和log文件三部分</li></ul><p><strong>二、Redis下载安装</strong><br>下载解压：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cd /usr/local/src</span><br><span class="line">wget   https://codeload.github.com/antirez/redis/tar.gz/2.8.21</span><br><span class="line">mv 2.8.21 redis-2.8.21.tar.gz</span><br><span class="line">tar xf redis-2.8.21.tar.gz</span><br></pre></td></tr></table></figure></p><p>安装：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">cd redis-2.8.21</span><br><span class="line">yum install -y gcc gcc-c++</span><br><span class="line">make</span><br><span class="line"></span><br><span class="line">cd src &amp;&amp; make PREFIX=/usr/local/redis install</span><br></pre></td></tr></table></figure></p><p><strong>三、Redis配置</strong></p><p>配置Redis的配置文件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir /usr/local/redis/etc</span><br><span class="line">vim  /usr/local/redis/etc/redis.conf</span><br></pre></td></tr></table></figure></p><p>加入如下内容：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">daemonize yes</span><br><span class="line">pidfile /usr/local/redis/var/redis.pid</span><br><span class="line">port 6379</span><br><span class="line">timeout 300</span><br><span class="line">loglevel debug</span><br><span class="line">logfile /usr/local/redis/var/redis.log</span><br><span class="line">databases 16</span><br><span class="line">save 900 1</span><br><span class="line">save 300 10</span><br><span class="line">save 60 10000</span><br><span class="line">rdbcompression yes</span><br><span class="line">dbfilename dump.rdb</span><br><span class="line">dir /usr/local/redis/var/</span><br><span class="line">appendonly no</span><br><span class="line">appendfsync always</span><br></pre></td></tr></table></figure></p><p>下面是redis.conf的主 要配置参数的意义：<br>daemonize：是否以后台daemon方式运行<br>pidfile：pid文件位置<br>port：监听的端口号<br>timeout：请求超时时间<br>loglevel：log信息级别<br>logfile：log文件位置<br>databases：开启数据库的数量<br>save x x ：保存快照的频率，第一个x表示多长时间，第三个x表示执行多少次写操作。在一定时间内执行一定数量的写操作时，自动保存快照。可设置多个条件。<br>rdbcompression：是否使用压缩<br>dbfilename：数据快照文件名（只是文件名，不包括目录）<br>dir：数据快照的保存目录（这个是目录）<br>appendonly：是否开启appendonlylog，开启的话每次写操作会记一条log，这会提高数据抗风险能力，但影响效率。<br>appendfsync：appendonlylog如何同步到磁盘（三个选项，分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步）</p><p>编写一个redis启动脚本<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/init.d/redis   //加入如下内容：</span><br><span class="line">#!/bin/sh</span><br><span class="line">#</span><br><span class="line"># redis        init file for starting up the redis daemon</span><br><span class="line">#</span><br><span class="line"># chkconfig:   - 20 80</span><br><span class="line"># description: Starts and stops the redis daemon.</span><br><span class="line"></span><br><span class="line"># Source function library.</span><br><span class="line">. /etc/rc.d/init.d/functions</span><br><span class="line"></span><br><span class="line">name=&quot;redis-server&quot;</span><br><span class="line">basedir=&quot;/usr/local/redis&quot;</span><br><span class="line">exec=&quot;$basedir/bin/$name&quot;</span><br><span class="line">pidfile=&quot;$basedir/var/redis.pid&quot;</span><br><span class="line">REDIS_CONFIG=&quot;$basedir/etc/redis.conf&quot;</span><br><span class="line"></span><br><span class="line">[ -e /etc/sysconfig/redis ] &amp;&amp; . /etc/sysconfig/redis</span><br><span class="line"></span><br><span class="line">lockfile=/var/lock/subsys/redis</span><br><span class="line"></span><br><span class="line">start() &#123;</span><br><span class="line">    [ -f $REDIS_CONFIG ] || exit 6</span><br><span class="line">    [ -x $exec ] || exit 5</span><br><span class="line">    echo -n $&quot;Starting $name: &quot;</span><br><span class="line">    daemon --user $&#123;REDIS_USER-redis&#125; &quot;$exec $REDIS_CONFIG&quot;</span><br><span class="line">    retval=$?</span><br><span class="line">    echo</span><br><span class="line">    [ $retval -eq 0 ] &amp;&amp; touch $lockfile</span><br><span class="line">    return $retval</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">stop() &#123;</span><br><span class="line">    echo -n $&quot;Stopping $name: &quot;</span><br><span class="line">    killproc -p $pidfile $name</span><br><span class="line">    retval=$?</span><br><span class="line">    echo</span><br><span class="line">    [ $retval -eq 0 ] &amp;&amp; rm -f $lockfile</span><br><span class="line">    return $retval</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">restart() &#123;</span><br><span class="line">    stop</span><br><span class="line">    start</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">reload() &#123;</span><br><span class="line">    false</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">rh_status() &#123;</span><br><span class="line">    status -p $pidfile $name</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">rh_status_q() &#123;</span><br><span class="line">    rh_status &gt;/dev/null 2&gt;&amp;1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">case &quot;$1&quot; in</span><br><span class="line">    start)</span><br><span class="line">        rh_status_q &amp;&amp; exit 0</span><br><span class="line">        $1</span><br><span class="line">        ;;</span><br><span class="line">    stop)</span><br><span class="line">        rh_status_q || exit 0</span><br><span class="line">        $1</span><br><span class="line">        ;;</span><br><span class="line">    restart)</span><br><span class="line">        $1</span><br><span class="line">        ;;</span><br><span class="line">    reload)</span><br><span class="line">        rh_status_q || exit 7</span><br><span class="line">        $1</span><br><span class="line">        ;;</span><br><span class="line">    force-reload)</span><br><span class="line">        force_reload</span><br><span class="line">        ;;</span><br><span class="line">    status)</span><br><span class="line">        rh_status</span><br><span class="line">        ;;</span><br><span class="line">    condrestart|try-restart)</span><br><span class="line">        rh_status_q || exit 0</span><br><span class="line">        restart</span><br><span class="line">        ;;</span><br><span class="line">    *)</span><br><span class="line">        echo $&quot;Usage: $0 &#123;start|stop|status|restart|condrestart|try-restart&#125;&quot;</span><br><span class="line">        exit 2</span><br><span class="line">esac</span><br><span class="line">exit $?</span><br></pre></td></tr></table></figure></p><p>因为脚本启动时以redis用户启动的，所以需要增加redis用户<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">useradd -s /sbin/nologin redis</span><br><span class="line">mkdir /usr/local/redis/var</span><br><span class="line">chmod 777 /usr/local/redis/var</span><br><span class="line">chmod 755 /etc/init.d/redis</span><br><span class="line">chkconfig  --add redis</span><br><span class="line">chkconfig redis on</span><br><span class="line">service redis start</span><br></pre></td></tr></table></figure></p><p><strong>四、Redis数据类型</strong></p><p><strong>string</strong>：是最简单的类型，你可以理解成Memcached一样的类型，一个key对应一个value，支持的操作与Memcached的操作类似，它的功能更丰富。设置可以存二进制的对象。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/redis/bin/redis-cli </span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; mset key1 szk key2 love key3 yc</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; mget key1 key2 key3</span><br><span class="line">1) &quot;szk&quot;</span><br><span class="line">2) &quot;love&quot;</span><br><span class="line">3) &quot;yc&quot;</span><br></pre></td></tr></table></figure></p><p> <strong>list</strong>:是一个链表结构，主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链接的名字。使用List结构，我们可以轻松的实现最新消息排行等功能。使用List结构，我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列，可以利用list的push操作，将任务存在list中，然后工作线程再用pop操作将任务取出进行执行。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; lpush list1 123</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; lpush list1 aaa</span><br><span class="line">(integer) 2</span><br><span class="line">127.0.0.1:6379&gt; lpush list1 &quot;123 456&quot;</span><br><span class="line">(integer) 3</span><br><span class="line">127.0.0.1:6379&gt; rpop list1</span><br><span class="line">&quot;123&quot;</span><br><span class="line">127.0.0.1:6379&gt; rpop list1</span><br><span class="line">&quot;aaa&quot;</span><br><span class="line">127.0.0.1:6379&gt; rpop list1</span><br></pre></td></tr></table></figure></p><p><strong>set</strong>:是集合，和我们数学中的集合概念类似，对集合的操作有添加删除元素，有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中，可以将一个用户所有的关注人存在一个集合中，将其所有粉丝存在一个集合。因为Redis非常人性化的为几个提供了求交集、并集、差集等操作，那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能，对上面的所有集合 操作，你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。QQ有一个社交功能叫做”好友标签”，这时就可以使用redis的集合来实现，把每一个用户的标签都存储在一个集合之中。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; sadd set1 zbc</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; sadd set1 szk</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; smembers set1</span><br><span class="line">1) &quot;zbc&quot;</span><br></pre></td></tr></table></figure></p><p><strong>sorted set</strong>:是有序集合，它比set多了一个权重参数score，使得集合中的元素能够按score进行有序排列，比如一个存储全班同学成绩的Sorted Sets，其集合value可以是同学的学号，而score就可以是其考试得分，这样在数据插入集合的时候，就已经进行了天然的排序。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; zadd mset2 2 &quot;cde 123&quot;</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zadd mset2 4 &quot;a123a&quot;</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zadd mset2 24 &quot;123-aaa&quot;</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zrange mset2 0 -1</span><br><span class="line">1) &quot;cde 123&quot;</span><br><span class="line">2) &quot;a123a&quot;</span><br><span class="line">3) &quot;123-aaa&quot;</span><br></pre></td></tr></table></figure></p><p><strong> hash</strong>：在memcached中，经常将一些结构化的信息打包成hashmap，在客户端序列化后存储为一个字符串的值（一般是JSON格式），比如用户的昵称、年龄、性别、积分等。</p><p><strong>六、Redis通用配置</strong></p><ul><li>daemonize no #默认情况下，redis并不是以daemon形式来运行的。通过daemonize配置项可以控制redis的运行形式。</li><li>pidfile /path/to/redis.pid #当以daemon形式运行时，redis会生成一个pid文件，默认会生成在/var/run/redis.pid</li><li>bind 192.168.1.200 #指定绑定的IP，可以有多个</li><li>port 6379 #指定监听端口</li><li>unixsocket /tmp/redis.sock #也可以监听socket</li><li>unixsocketperm 755 #当监听socket时可以指定权限为755</li><li>timeout 0 #当一个redis-client一直没有请求发向server端，那么server端有权主动关闭这个连接，可以通过timeout来设置“空间超时时限”,0表示永不关闭</li><li>tcp-keepalive 0 #TCP连接保活策略，可以通过tcp-keepalive配置项来进行设置，单位为秒，假如设置为60秒，则server端会每60秒向连接空闲的客户端发起一次ACk请求，以检查客户端是否已经挂掉，对于无响应的客户端则会关闭其连接。如果设置为0，则不会进行保活检测</li><li>loglevel notice #日志级别，有四种debug，verbose，notice，warning</li><li>logfile “” #定义日志路径</li><li>syslog-ident redis #如果希望日志打印到sysllog中，通过syslog-enabled来控制</li><li>syslog-facility local0 #指定syslog的设备，可以是USER或者local0-local7</li><li>databases 16 #设置数据库的总数量，select n 选择数据库，0 - 15</li></ul><p><strong>七、Redis快照配置（rdb持久化）</strong></p><ul><li>save 900 1 #表示每15分钟且至少有1个key改变，就触发一次持久化</li><li>save 300 10 #表示每5分钟至少有10个key改变，就触发一次持久化</li><li>save 60 1000 #表示每60秒至少有10000个key改变，就触发一次持久</li><li>save “” #这样可以禁用rdb持久化</li><li>stop-write-on-bgsave-error yes #rdb持久化写入磁盘避免不了会出现失败的情况，默认一旦出现失败，redis会马上停止写操作。如果你觉得无所谓，那就可以使用选项关闭这个功能</li><li>rdbcompression yes #是否要压缩</li><li>rdbchecksum yes #是否进行数据校验</li><li>dir ./ #定义快照文件储存路径</li></ul><p><strong>八、Redis安全相关配置</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/local/redis/etc/redis.conf  #设置redis-server的密码</span><br><span class="line">#增加下面配置</span><br><span class="line"></span><br><span class="line">requirepass szk</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/redis/bin/redis-cli -a szk  #-a指定密码登录</span><br></pre></td></tr></table></figure><ul><li>rename-command CONFIG szk.config   #将CONFIG命令更名为szk.config，这样可以避免误操作，但 如果使用了AOF持久化，建议不要启用该功能</li><li>rename-command CONFIG “”  #也可以后面定义为空，这样就禁掉了该CONFIG命令</li></ul><p><strong>九、Redis限制相关配置</strong></p><ul><li>maxclients 10000 #限制最大客户端连接数</li><li>maxmemory  #设定最大内存使用数，单位是byte</li><li>maxmemory-policy volatile-lru #指定内存移除规则</li><li>maxmemory-samples 3 #LRU算大和最小TTL算法都并非是精确的算法，而是估算值。所以你可以设置样本的大小。假如redis默认会检查三个key，并选择其中LRU的那个，那么你可以改变这个key样本的数量。</li></ul><p><strong>十、Redis AOF持久化相关配置</strong></p><ul><li>appendonly no #如果是yes，则开启aof持久化</li><li>appendfilename “appendonly.aof” #指定aof文件名字，保存在dir参数指定的命令</li><li>appendfsync everysec #指定fsync()调用模式，有三种no(不调用fsync)，always（每次写都会调用fsync)，exerysec(每秒钟调用一次fsync)。第一种最快，第二种数据最安全，但性能会差一些，默认为第三种方案，性能和安全兼顾。</li><li>no-appendfsync-on-rewrite no #使用no可避免当写入量非常大时的磁盘IO阻塞</li><li>auto-aof-rewrite-percentage 10 #规定什么情况下触发aof重写。该值为一个比例，10表示当aof文件增幅达到10%时则会触发重写机制</li><li>auto-aof-rewrite-min-size 64mb #重写会有一个条件，就是不能低于64MB</li></ul><p><strong>十一、Redis慢日志相关配置</strong></p><ul><li>针对慢日志，你可以设置两个参数，一个是执行时长，单位是微秒，另一个是慢日志的长度。当一个新的命令被写入日志时，最老的一条会从命令日志队列中被移除。</li><li>slowlog-log-slower-than 10000 #慢于10000ms则记录日志</li><li>slowlog-max-len 128 #日志长度</li></ul><p><strong>十二、Redis主从配置</strong></p><ol><li>分别按照之前介绍的步骤安装好redis并启动</li><li>master 配置文件不用动</li><li>slave配置文件上加一行:slaveof 192.168.1.200 6379</li><li>masterauth szk  #如果主上设置了密码，要加这行</li><li>分别启动master和slave<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">tail /usr/local/redis/var/redis.log </span><br><span class="line"></span><br><span class="line">3966] 18 Feb 15:02:58.330 * MASTER &lt;-&gt; SLAVE sync: receiving 192 bytes from master</span><br><span class="line">[3966] 18 Feb 15:02:58.330 * MASTER &lt;-&gt; SLAVE sync: Flushing old data</span><br><span class="line">[3966] 18 Feb 15:02:58.330 * MASTER &lt;-&gt; SLAVE sync: Loading DB in memory</span><br><span class="line">[3966] 18 Feb 15:02:58.330 * MASTER &lt;-&gt; SLAVE sync: Finished with success</span><br><span class="line">[3966] 18 Feb 15:03:03.344 - DB 0: 7 keys (0 volatile) in 8 slots HT.</span><br><span class="line">[3966] 18 Feb 15:03:03.344 - 1 clients connected (0 slaves), 466840 bytes in use</span><br><span class="line">[3966] 18 Feb 15:03:08.396 - DB 0: 7 keys (0 volatile) in 8 slots HT.</span><br><span class="line">[3966] 18 Feb 15:03:08.397 - 1 clients connected (0 slaves), 466848 bytes in use</span><br></pre></td></tr></table></figure></li></ol><p>测试：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/redis/bin/redis-cli -a szk      #主</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; set key1 szk</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; get key1            </span><br><span class="line">&quot;szk&quot;</span><br></pre></td></tr></table></figure></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/redis/bin/redis-cli             #从</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; get key1</span><br><span class="line">&quot;szk&quot;</span><br><span class="line"></span><br><span class="line">OK</span><br></pre></td></tr></table></figure><p><strong>十三、Redis主从其他相关配置</strong></p><ul><li>slave-read-only yes #让从只读</li><li>repl-ping-slave-period 10  #设置slave向master发起ping的频率，每10s发起一次</li><li>repl-timeout 60  #设置slave ping不同master多少s后就超时</li><li>repl-disable-tcp-nodelay no  #是否开启tcp_nodeay，开启后将会使用更少的带宽，但会有延迟，所以建议关闭</li><li>repl-backlog-size 1mb  #同步队列的长度，backuplog是master的一个缓冲区，主从断开后，master会先把数据写到缓冲区，slave再次连接会从缓冲区中同步数据</li><li>repl-backlog-ttl 3600  #主从断开后，缓冲区的有效期，默认1小时</li><li>slave-priority 100  #多个slave是可以设置优先级的，数值越小优先级越高，应用于集群中，支持slave切换为mster，优先级最高的才会切换</li><li>min-slave-to-write 3 #和下面的一起使用，它的意思是master发现有超过3个slave的延迟高于10s，那么master就会暂时停止写操作。这两个数值任何一个为0，则关闭该功能，默认第一数值是0</li><li>min-slaves-max-log 10 </li></ul><p><strong>十四、string常用操作</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; set key1 szk  #给key1赋值为szk</span><br><span class="line">OK </span><br><span class="line">127.0.0.1:6379&gt; get key1    #获取这个值value</span><br><span class="line">&quot;szk&quot;</span><br><span class="line">127.0.0.1:6379&gt; set key1 yc  #一个key对应一个value，多次赋值，会覆盖前面的value</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; get key1  </span><br><span class="line">&quot;yc&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; setex key3 10 1   #用来给key设定过期时间,ttl key3查看时间</span><br><span class="line">OK</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; mset key1 1 key2 2 key3 3    #同时设置多个key</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; mget key1 key2 key3    </span><br><span class="line">1) &quot;1&quot;</span><br><span class="line">2) &quot;2&quot;</span><br><span class="line">3) &quot;3&quot;</span><br></pre></td></tr></table></figure></p><p><strong>十五、Hash常用操作</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; hset hash1 name szk</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; hset hash1  age 23</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; hset hash1  job it</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; hgetall hash1 </span><br><span class="line">1) &quot;name&quot;</span><br><span class="line">2) &quot;szk&quot;</span><br><span class="line">3) &quot;age&quot;</span><br><span class="line">4) &quot;23&quot;</span><br><span class="line">5) &quot;job&quot;</span><br><span class="line">6) &quot;it&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; hmset hash2 name yc age 24 job teacher    #批量创建</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; hgetall hash2</span><br><span class="line">1) &quot;name&quot;</span><br><span class="line">2) &quot;yc&quot;</span><br><span class="line">3) &quot;age&quot;</span><br><span class="line">4) &quot;24&quot;</span><br><span class="line">5) &quot;job&quot;</span><br><span class="line">6) &quot;teacher&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; hdel hash2 job     #删除某个值</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; hgetall hash2</span><br><span class="line">1) &quot;name&quot;</span><br><span class="line">2) &quot;yc&quot;</span><br><span class="line">3) &quot;age&quot;</span><br><span class="line">4) &quot;24&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; hkeys hash2   #查看所有的key</span><br><span class="line">1) &quot;name&quot;</span><br><span class="line">2) &quot;age&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; hvals hash2   #查看所有的values</span><br><span class="line">1) &quot;yc&quot;</span><br><span class="line">2) &quot;24&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; hlen hash2    #查看hash有几个filed</span><br><span class="line">(integer) 2</span><br></pre></td></tr></table></figure></p><p><strong>十六、list常用操作</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; lpush list1 a    #从左边插入</span><br><span class="line"></span><br><span class="line">(integer) 3</span><br><span class="line">127.0.0.1:6379&gt; lpush list1 b     #从左边插入</span><br><span class="line">(integer) 4</span><br><span class="line">127.0.0.1:6379&gt; lpush list1 c      #从左边插入</span><br><span class="line">(integer) 5</span><br><span class="line">127.0.0.1:6379&gt; lrange list1 0 -1       #从左边往右罗列，最先插入在最后边</span><br><span class="line">1) &quot;c&quot;</span><br><span class="line">2) &quot;b&quot;</span><br><span class="line">3) &quot;a&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; lpop list1          #从最左边取出</span><br><span class="line">&quot;c&quot;</span><br><span class="line">127.0.0.1:6379&gt; lrange list1 0 -1    #从左边往右罗列</span><br><span class="line">1) &quot;b&quot;</span><br><span class="line">2) &quot;a&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; rpush list1 1          #从右边插入</span><br><span class="line">(integer) 5</span><br><span class="line">127.0.0.1:6379&gt; rpush list1 2           #从右边插入</span><br><span class="line">(integer) 6</span><br><span class="line">127.0.0.1:6379&gt; rpush list1 3           #从右边插入</span><br><span class="line">(integer) 7</span><br><span class="line">127.0.0.1:6379&gt; lrange list1 0 -1       #从右往左罗列，最后插入在最后边</span><br><span class="line">1) &quot;b&quot;</span><br><span class="line">2) &quot;a&quot;</span><br><span class="line">3) &quot;1&quot;</span><br><span class="line">4) &quot;2&quot;</span><br><span class="line">5) &quot;3&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; linsert list1  before 3  5        #在3前面插入一个5</span><br><span class="line">(integer) 8</span><br><span class="line">127.0.0.1:6379&gt; lrange list1 0 -1</span><br><span class="line">1) &quot;b&quot;</span><br><span class="line">2) &quot;a&quot;</span><br><span class="line">3) &quot;1&quot;</span><br><span class="line">4) &quot;2&quot;</span><br><span class="line">5) &quot;5&quot;</span><br><span class="line">6) &quot;3&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; lset list1 7 6             #将0开始的第7个元素换成6</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; lrange list1 0 -1</span><br><span class="line">1) &quot;b&quot;</span><br><span class="line">2) &quot;a&quot;</span><br><span class="line">3) &quot;456&quot;</span><br><span class="line">4) &quot;123&quot;</span><br><span class="line">5) &quot;1&quot;</span><br><span class="line">6) &quot;2&quot;</span><br><span class="line">7) &quot;5&quot;</span><br><span class="line">8) &quot;6&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; lindex list1 7     #查看从0开始的第7个元素</span><br><span class="line">&quot;6&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; llen list1          #查看列表中有几个元素</span><br><span class="line">(integer) 8</span><br></pre></td></tr></table></figure></p><p><strong>十七、set数据常用操作 </strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; sadd set1 1        #向集合set1中放入元素</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; sadd set1 2</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; sadd set1 3</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; sadd set1 4</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; smembers set1    #查看集合中所有元素</span><br><span class="line">1) &quot;zbc&quot;</span><br><span class="line">2) &quot;1&quot;</span><br><span class="line">3) &quot;szk&quot;</span><br><span class="line">4) &quot;2&quot;</span><br><span class="line">5) &quot;3&quot;</span><br><span class="line">6) &quot;4&quot;</span><br><span class="line">127.0.0.1:6379&gt; spop set1     #随机取出一个元素，删除</span><br><span class="line">&quot;szk&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; sdiff set1 seta       #比较差集，以set1为主来比较</span><br><span class="line">1) &quot;zbc&quot;</span><br><span class="line">2) &quot;4&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; sdiffstore set3  seta set1   #比较差集，将结果存入set3中</span><br><span class="line">(integer) 2</span><br><span class="line">127.0.0.1:6379&gt; SMEMBERS set3    #tab自动补全，但显示为大写</span><br><span class="line">1) &quot;2&quot;</span><br><span class="line">2) &quot;szk&quot;</span><br></pre></td></tr></table></figure></p><p><strong>十八、zset常用操作</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; zadd zset1 1 abc     #创建有序集合</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zadd zset1 10 aabc   #创建有序集合</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zadd zset1 5 aaa    #创建有序集合</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zadd zset1 88 bbb   #创建有序集合</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; zadd zset1 888 szk   #创建有序集合</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; ZRANGE zset1 0 -1   #显示所有元素，按顺序显示</span><br><span class="line">1) &quot;abc&quot;</span><br><span class="line">2) &quot;aaa&quot;</span><br><span class="line">3) &quot;aabc&quot;</span><br><span class="line">4) &quot;bbb&quot;</span><br><span class="line">5) &quot;szk&quot;</span><br><span class="line">127.0.0.1:6379&gt; ZRANGE zset1 0 -1 withscores    #可以带上分值</span><br><span class="line">1) &quot;abc&quot;</span><br><span class="line">2) &quot;1&quot;</span><br><span class="line">3) &quot;aaa&quot;</span><br><span class="line">4) &quot;5&quot;</span><br><span class="line">5) &quot;aabc&quot;</span><br><span class="line">6) &quot;10&quot;</span><br><span class="line">7) &quot;bbb&quot;</span><br><span class="line">8) &quot;88&quot;</span><br><span class="line">9) &quot;szk&quot;</span><br><span class="line">10) &quot;888&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; ZREM zset1 abc       #删除指定元素</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; ZRANGE zset1 0 -1 withscores</span><br><span class="line">1) &quot;aaa&quot;</span><br><span class="line">2) &quot;5&quot;</span><br><span class="line">3) &quot;aabc&quot;</span><br><span class="line">4) &quot;10&quot;</span><br><span class="line">5) &quot;bbb&quot;</span><br><span class="line">6) &quot;88&quot;</span><br><span class="line">7) &quot;szk&quot;</span><br><span class="line">8) &quot;888&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; zrevrank zset1 szk  #返回元素的索引值，索引值从0开始，按score正向排序</span><br><span class="line">(integer) 0</span><br><span class="line">127.0.0.1:6379&gt; zrank zset1 szk     #同上，不同的是，按score反序排序</span><br><span class="line">(integer) 3</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; ZCARD  zset1   #查看集合元素的个数</span><br><span class="line">(integer) 4 </span><br><span class="line">127.0.0.1:6379&gt; zcount zset1 1 20   #查看分值区间内的元素个数</span><br><span class="line">(integer) 2</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; zrangebyscore zset1 1 100 withscores   #返回分支范围在1-100的元素</span><br><span class="line">1) &quot;aaa&quot;</span><br><span class="line">2) &quot;5&quot;</span><br><span class="line">3) &quot;aabc&quot;</span><br><span class="line">4) &quot;10&quot;</span><br><span class="line">5) &quot;bbb&quot;</span><br><span class="line">6) &quot;88&quot;</span><br><span class="line">127.0.0.1:6379&gt; zrangebyscore zset1 0 10    #删除分支范围在0-10的元素，按score排序</span><br><span class="line">1) &quot;aaa&quot;</span><br><span class="line">2) &quot;aabc&quot;</span><br></pre></td></tr></table></figure></p><p><strong>十九、键值和服务器命令</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379&gt; keys *            #列出所有键值</span><br><span class="line">1) &quot;key3&quot;</span><br><span class="line">2) &quot;seta&quot;</span><br><span class="line">3) &quot;hash1&quot;</span><br><span class="line">4) &quot;list1&quot;</span><br><span class="line">5) &quot;key2&quot;</span><br><span class="line">6) &quot;zset1&quot;</span><br><span class="line">7) &quot;mset2&quot;</span><br><span class="line">8) &quot;set2&quot;</span><br><span class="line">9) &quot;set1&quot;</span><br><span class="line">10) &quot;key1&quot;</span><br><span class="line">11) &quot;hash2&quot;</span><br><span class="line">12) &quot;set3&quot;</span><br><span class="line">127.0.0.1:6379&gt; keys key*</span><br><span class="line">1) &quot;key3&quot;</span><br><span class="line">2) &quot;key2&quot;</span><br><span class="line">3) &quot;key1&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; EXISTS list1      #查看是否有list1</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; del key1      #删除key1</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; EXISTS key1</span><br><span class="line">(integer) 0</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; EXPIRE key3 10     #设置过期时间</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379&gt; get key3</span><br><span class="line">&quot;3&quot;</span><br><span class="line">127.0.0.1:6379&gt; ttl key3    #查看key的过期时间，-1不存在过期  -2不存储键值</span><br><span class="line">(integer) -2</span><br><span class="line">127.0.0.1:6379&gt; EXists key3 </span><br><span class="line">(integer) 0</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; select 0     #切换库，默认16个库</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; select 1</span><br><span class="line">OK</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379[1]&gt; set key1 111   #新建一个键值</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379[1]&gt; keys *</span><br><span class="line">1) &quot;key1&quot;</span><br><span class="line">127.0.0.1:6379[1]&gt; move set1 2    #移动到库2</span><br><span class="line">(integer) 0</span><br><span class="line">127.0.0.1:6379[1]&gt; select 2     #切换库2</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379[2]&gt; keys *    </span><br><span class="line">1) &quot;key1&quot;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">127.0.0.1:6379[2]&gt; EXPIRE key1 200    #设置过期时间</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379[2]&gt; ttl key1</span><br><span class="line">(integer) 193</span><br><span class="line">127.0.0.1:6379[2]&gt; PERSIST key1     #取消过期时间</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379[2]&gt; ttl key1</span><br><span class="line">(integer) -1</span><br><span class="line">127.0.0.1:6379[2]&gt; RANDOMKEY    #随机返回一个key</span><br><span class="line">&quot;key1&quot;</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379[2]&gt; RENAME key1 szk   #更改一个key的名字</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379[2]&gt; keys *</span><br><span class="line">1) &quot;szk&quot;</span><br><span class="line">127.0.0.1:6379[2]&gt; type szk         #查看一个键值的类型</span><br><span class="line">string</span><br></pre></td></tr></table></figure></p><p><strong>二十、服务相关的操作</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1:6379[2]&gt; DBSIZE    #查看一个库的键值数</span><br><span class="line">(integer) 1</span><br><span class="line">127.0.0.1:6379[2]&gt; select 0</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; DBSIZE </span><br><span class="line">(integer) 10</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; info   #查看redis服务信息</span><br><span class="line"># Server</span><br><span class="line">redis_version:2.8.21</span><br><span class="line">redis_git_sha1:00000000</span><br><span class="line">略</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; flushdb    #清空当前数据库中所有的键</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; keys *</span><br><span class="line">(empty list or set)</span><br><span class="line"></span><br><span class="line">127.0.0.1:6379&gt; flushall   #清空所有数据库中的所有的key</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379&gt; SELECT 1</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379[1]&gt; keys *</span><br><span class="line">(empty list or set)</span><br></pre></td></tr></table></figure></p><p><strong>二十一、PHP中应用Redis</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">cd /usr/local/src</span><br><span class="line">wget  http://pecl.php.net/get/redis-2.2.5.tgz</span><br><span class="line">tar xf redis-2.2.5.tgz</span><br><span class="line">cd redis-2.2.5</span><br><span class="line">/usr/local/php/bin/phpize</span><br><span class="line">./configure --with-php-config=/usr/local/php/bin/php-confi</span><br><span class="line">make ; make install</span><br><span class="line">mv /usr/local/php/lib/php/extensions/no-debug-zts-20100525/redis.so /usr/lib64/</span><br><span class="line"></span><br><span class="line">vim /usr/local/php/php.ini</span><br><span class="line"></span><br><span class="line">extension_dir = /usr/lib64/</span><br><span class="line">extension = redis.so</span><br><span class="line"></span><br><span class="line">usr/local/php/bin/php -m | grep redis</span><br><span class="line">redis</span><br></pre></td></tr></table></figure></p><p>加载成功，可以重启 nginx 看看 phpinfo 页</p><p><strong>二十二、Redis实现session共享</strong><br>php.ini中加入<br>session.save_handler = “redis”<br>session.save_path = “tcp://127.0.0.1:6379”<br>或者apache虚拟主机加入<br>php_value session.save_handler “redis”<br>php_value session.save_path “tcp://127.0.0.1:6379”<br>或者php-fpm.conf对应的pool中加入<br>php_value[session.save_handler] = redis<br>php_value[session.save_path] = “ tcp://127.0.0.1:6379 “</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;一、Redis介绍&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;redis是一个key-value存储系统，官方站点&lt;a href=&quot;http://redis.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://redis.i
      
    
    </summary>
    
      <category term="redis" scheme="http://www.grapedlinux.cn/categories/redis/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>nginx+tomcat 配置负载均衡集群</title>
    <link href="http://www.grapedlinux.cn/2017/04/04/17040401/"/>
    <id>http://www.grapedlinux.cn/2017/04/04/17040401/</id>
    <published>2017-04-04T02:38:51.000Z</published>
    <updated>2017-04-04T03:40:09.996Z</updated>
    
    <content type="html"><![CDATA[<h5 id="一、Hello-world"><a href="#一、Hello-world" class="headerlink" title="一、Hello world"></a>一、Hello world</h5><h6 id="1、前期环境准备"><a href="#1、前期环境准备" class="headerlink" title="1、前期环境准备"></a>1、前期环境准备</h6><ol><li>准备两个解压版tomcat，如何同时启动两个tomcat，方法如下：<br>首先去<a href="http://tomcat.apache.org/download-70.cgi" target="_blank" rel="noopener">apache tomcat官网</a>下载一个tomcat解压版。<img src="https://static.oschina.net/uploads/space/2017/0328/160127_sJXZ_3203872.png" alt="image"><br>解压该压缩包，生成n份tomcat 分别命名为 tomcat1，tomcat2，<br><img src="https://static.oschina.net/uploads/space/2017/0328/160419_P4o4_3203872.png" alt="image"><br>然后修改server.xml配置文件，分别进入tomcat/conf/目录，修改server.xml，一共三处。<br><img src="https://static.oschina.net/uploads/space/2017/0328/160549_uR0Y_3203872.png" alt="image"><br>第一处：<br><img src="https://static.oschina.net/uploads/space/2017/0329/094952_RXZx_3203872.png" alt="image"><br>第二处、tomcat访问端口号：<br><img src="https://static.oschina.net/uploads/space/2017/0329/095118_fqsy_3203872.png" alt="image"><br>第三处：<br><img src="https://static.oschina.net/uploads/space/2017/0329/095239_9NmQ_3203872.png" alt="image"><br>之后修改bin下的启动文件<br>分别进入tomcat/bin目录，修改 startup.bat<br>在文件第一行添加如下配置（添加时删除#注释，在startup.bat文件中rem代表注释）：在文件第一行添加如下配置（添加时删除#注释，在startup.bat文件中rem代表注释）：<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># tomcat名称</span><br><span class="line">set TITLE=&quot;tomcat1&quot;</span><br><span class="line"># tomcat启动路径</span><br><span class="line">set CATALINA_BASE=&quot;D:\tools\tomcat1&quot;</span><br><span class="line">set CATALINA_HOME=&quot;D:\tools\tomcat1&quot;</span><br><span class="line"># JDK所在路径，如果环境变量已经配置，则可忽略，前提是你所有tomcat要共用一个jdk。另外如果设置，此处路径不能有空格</span><br><span class="line">SET JAVA_HOME=&quot;D:\Java\jdk1.7.0_45&quot;</span><br></pre></td></tr></table></figure></li></ol><p>如图：<br><img src="https://static.oschina.net/uploads/space/2017/0329/170630_Ttmb_3203872.png" alt="image"><br><img src="https://static.oschina.net/uploads/space/2017/0329/171827_v9qA_3203872.png" alt="image"><br>启动tomcat<br>平常直接双击startup.bat即可，但是为了查看配置信息，可以在cmd中启动，如下图：<br><img src="https://static.oschina.net/uploads/space/2017/0329/171214_rx4B_3203872.png" alt="image"><br>访问tomcat<br>在浏览器地址栏输入：<a href="http://localhost:8081" target="_blank" rel="noopener">http://localhost:8081</a> 和 <a href="http://localhost:8082" target="_blank" rel="noopener">http://localhost:8082</a><br><img src="https://static.oschina.net/uploads/space/2017/0329/171320_bKZP_3203872.png" alt="image"></p><ol start="2"><li><a href="http://nginx.org/en/download.html" target="_blank" rel="noopener">nginx官网</a>下载解压版nginx。</li><li>创建一个简单的web项目。为了直观的区分访问的哪个tomcat，在页面写上标记8081、8082。<img src="https://static.oschina.net/uploads/space/2017/0330/102251_yVyP_3203872.png" alt="image"></li><li>分别部署到对应的tomcat下。如图：<img src="https://static.oschina.net/uploads/space/2017/0330/104335_4Scb_3203872.png" alt="image"><h6 id="2、配置nginx"><a href="#2、配置nginx" class="headerlink" title="2、配置nginx"></a>2、配置nginx</h6>进入nginx-1.10.1\conf路径，修改配置文件nginx.conf。</li><li><p>配置服务器组，在http{}节点之间添加upstream配置。（注意不要写localhost，不然访问速度会很慢）</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">upstream nginxDemo &#123;</span><br><span class="line">    server 127.0.0.1:8081;   #服务器地址1</span><br><span class="line">    server 127.0.0.1:8082;   #服务器地址2</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>修改nginx监听的端口号80，改为8080。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen       8080;</span><br><span class="line">    ......</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>在location{}中，利用proxy_pass配置反向代理地址；此处“http://”不能少，后面的地址要和第一步upstream定义的名称保持一致。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">location / &#123;</span><br><span class="line">        root   html;</span><br><span class="line">        index  index.html index.htm;</span><br><span class="line">        proxy_pass http://nginxDemo; #配置方向代理地址</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></li></ol><p>如下图：<br><img src="https://static.oschina.net/uploads/space/2017/0330/113528_YZCP_3203872.png" alt="image"></p><h6 id="3、启动nginx和tomcat，访问"><a href="#3、启动nginx和tomcat，访问" class="headerlink" title="3、启动nginx和tomcat，访问"></a>3、启动nginx和tomcat，访问</h6><p>我是Windows系统，所以直接在nginx-1.10.1目录下双击nginx.exe即可。可在任务管理器中查看：<br><img src="https://static.oschina.net/uploads/space/2017/0330/113005_QuQG_3203872.png" alt="image"><br>最后在浏览器输入地址：<a href="http://localhost:8080/nginxDemo/index.jsp，每次访问就会轮流访问tomcat了（如果F5刷新不管用，建议试试鼠标指针放到地址栏，点击Enter键）。" target="_blank" rel="noopener">http://localhost:8080/nginxDemo/index.jsp，每次访问就会轮流访问tomcat了（如果F5刷新不管用，建议试试鼠标指针放到地址栏，点击Enter键）。</a><br><img src="https://static.oschina.net/uploads/space/2017/0330/112827_dFRT_3203872.png" alt="image"><br><img src="https://static.oschina.net/uploads/space/2017/0330/112757_RGPA_3203872.png" alt="image"><br>到这里，一个非常简单的负载均衡就配置完成了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h5 id=&quot;一、Hello-world&quot;&gt;&lt;a href=&quot;#一、Hello-world&quot; class=&quot;headerlink&quot; title=&quot;一、Hello world&quot;&gt;&lt;/a&gt;一、Hello world&lt;/h5&gt;&lt;h6 id=&quot;1、前期环境准备&quot;&gt;&lt;a href=&quot;#1
      
    
    </summary>
    
      <category term="负载均衡" scheme="http://www.grapedlinux.cn/categories/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/"/>
    
    
      <category term="nginx,java" scheme="http://www.grapedlinux.cn/tags/nginx-java/"/>
    
  </entry>
  
  <entry>
    <title>Nginx主要应用场景</title>
    <link href="http://www.grapedlinux.cn/2017/04/03/17040301/"/>
    <id>http://www.grapedlinux.cn/2017/04/03/17040301/</id>
    <published>2017-04-03T03:23:42.000Z</published>
    <updated>2017-04-03T03:26:42.397Z</updated>
    
    <content type="html"><![CDATA[<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>本文只针对Nginx在不加载第三方模块的情况能处理哪些事情，由于第三方模块太多所以也介绍不完，当然本文本身也可能介绍的不完整，毕竟只是我个人使用过和了解到过得。所以还请见谅，同时欢迎留言交流。</p><h4 id="Nginx能做什么"><a href="#Nginx能做什么" class="headerlink" title="Nginx能做什么"></a>Nginx能做什么</h4><h5 id="1-反向代理"><a href="#1-反向代理" class="headerlink" title="1. 反向代理"></a>1. 反向代理</h5><h5 id="2-负载均衡"><a href="#2-负载均衡" class="headerlink" title="2. 负载均衡"></a>2. 负载均衡</h5><h5 id="3-HTTP服务器（包含动静分离）"><a href="#3-HTTP服务器（包含动静分离）" class="headerlink" title="3. HTTP服务器（包含动静分离）"></a>3. HTTP服务器（包含动静分离）</h5><h5 id="4-正向代理"><a href="#4-正向代理" class="headerlink" title="4. 正向代理"></a>4. 正向代理</h5><p>以上就是我了解到的Nginx在不依赖第三方模块能处理的事情，下面详细说明每种功能怎么做。</p><h5 id="反向代理"><a href="#反向代理" class="headerlink" title="反向代理"></a>反向代理</h5><p>反向代理应该是Nginx做的最多的一件事了，什么是反向代理呢，以下是百度百科的说法：反向代理（Reverse Proxy）方式是指以代理服务器来接受internet上的连接请求，然后将请求转发给内部网络上的服务器，并将从服务器上得到的结果返回给internet上请求连接的客户端，此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问，所以需要一台代理服务器，而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境，当然也可能是同一台服务器，端口不同而已。 下面贴上一段简单的实现反向代理的代码。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">server &#123;  </span><br><span class="line">        listen       80;                                                         </span><br><span class="line">        server_name  localhost;                                               </span><br><span class="line">        client_max_body_size 1024M;</span><br><span class="line"></span><br><span class="line">        location / &#123;</span><br><span class="line">            proxy_pass http://localhost:8080;</span><br><span class="line">            proxy_set_header Host $host:$server_port;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>保存配置文件后启动Nginx，这样当我们访问localhost的时候，就相当于访问localhost:8080了。</p><h5 id="负载均衡"><a href="#负载均衡" class="headerlink" title="负载均衡"></a>负载均衡</h5><p>负载均衡也是Nginx常用的一个功能，负载均衡其意思就是分摊到多个操作单元上进行执行，例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等，从而共同完成工作任务。简单而言就是当有2台或以上服务器时，根据规则随机的将请求分发到指定的服务器上处理，负载均衡配置一般都需要同时配置反向代理，通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略，还有2种常用的第三方策略。</p><h6 id="1、RR（默认）"><a href="#1、RR（默认）" class="headerlink" title="1、RR（默认）"></a>1、RR（默认）</h6><p>每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器down掉，能自动剔除。<br>简单配置<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">upstream test &#123;</span><br><span class="line">     server localhost:8080;</span><br><span class="line">     server localhost:8081;</span><br><span class="line"> &#125;</span><br><span class="line"> server &#123;</span><br><span class="line">     listen       81;                                                         </span><br><span class="line">     server_name  localhost;                                               </span><br><span class="line">     client_max_body_size 1024M;</span><br><span class="line"></span><br><span class="line">     location / &#123;</span><br><span class="line">         proxy_pass http://test;</span><br><span class="line">         proxy_set_header Host $host:$server_port;</span><br><span class="line">     &#125;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure></p><p>负载均衡的核心代码为<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">upstream test &#123;</span><br><span class="line">    server localhost:8080;</span><br><span class="line">    server localhost:8081;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>这里我配置了2台服务器，当然实际上是一台，只是端口不一样而已，而8081的服务器是不存啊在的,也就是说访问不到，但是我们访问<a href="http://localhost" target="_blank" rel="noopener">http://localhost</a> 的时候,也不会有问题，会默认跳转到<a href="http://localhost:8080" target="_blank" rel="noopener">http://localhost:8080</a> 具体是因为Nginx会自动判断服务器的状态，如果服务器处于不能访问（服务器挂了），就不会跳转到这台服务器，所以也避免了一台服务器挂了影响使用的情况，由于Nginx默认是RR策略，所以我们不需要其他更多的设置。</p><h6 id="2、权重"><a href="#2、权重" class="headerlink" title="2、权重"></a>2、权重</h6><p>指定轮询几率，weight和访问比率成正比，用于后端服务器性能不均的情况。 例如<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">upstream test &#123;</span><br><span class="line">    server localhost:8080 weight=9;</span><br><span class="line">    server localhost:8081 weight=1;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>那么10次一般只会有1次会访问到8081，而有9次会访问到8080</p><h6 id="3、ip-hash"><a href="#3、ip-hash" class="headerlink" title="3、ip_hash"></a>3、ip_hash</h6><p>上面的2种方式都有一个问题，那就是下一个请求来的时候请求可能分发到另外一个服务器，当我们的程序不是无状态的时候（采用了session保存数据），这时候就有一个很大的很问题了，比如把登录信息保存到了session中，那么跳转到另外一台服务器的时候就需要重新登录了，所以很多时候我们需要一个客户只访问一个服务器，那么就需要用iphash了，iphash的每个请求按访问ip的hash结果分配，这样每个访客固定访问一个后端服务器，可以解决session的问题。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">upstream test &#123;</span><br><span class="line">    ip_hash;</span><br><span class="line">    server localhost:8080;</span><br><span class="line">    server localhost:8081;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h6 id="4、fair（第三方）"><a href="#4、fair（第三方）" class="headerlink" title="4、fair（第三方）"></a>4、fair（第三方）</h6><p>按后端服务器的响应时间来分配请求，响应时间短的优先分配。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">upstream backend &#123; </span><br><span class="line">    fair; </span><br><span class="line">    server localhost:8080;</span><br><span class="line">    server localhost:8081;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h6 id="5、url-hash（第三方）"><a href="#5、url-hash（第三方）" class="headerlink" title="5、url_hash（第三方）"></a>5、url_hash（第三方）</h6><p>按访问url的hash结果来分配请求，使每个url定向到同一个后端服务器，后端服务器为缓存时比较有效。 在upstream中加入hash语句，server语句中不能写入weight等其他的参数，hash_method是使用的hash算法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">upstream backend &#123; </span><br><span class="line">    hash $request_uri; </span><br><span class="line">    hash_method crc32; </span><br><span class="line">    server localhost:8080;</span><br><span class="line">    server localhost:8081;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>以上5种负载均衡各自适用不同情况下使用，所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用，由于本文主要介绍Nginx能做的事情，所以Nginx安装第三方模块不会再本文介绍</p><h5 id="HTTP服务器"><a href="#HTTP服务器" class="headerlink" title="HTTP服务器"></a>HTTP服务器</h5><p>Nginx本身也是一个静态资源的服务器，当只有静态资源的时候，就可以使用Nginx来做服务器，同时现在也很流行动静分离，就可以通过Nginx来实现，首先看看Nginx做静态资源服务器<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">       listen       80;                                                         </span><br><span class="line">       server_name  localhost;                                               </span><br><span class="line">       client_max_body_size 1024M;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">       location / &#123;</span><br><span class="line">              root   e:\wwwroot;</span><br><span class="line">              index  index.html;</span><br><span class="line">          &#125;</span><br><span class="line">   &#125;</span><br></pre></td></tr></table></figure></p><p>这样如果访问<a href="http://localhost" target="_blank" rel="noopener">http://localhost</a> 就会默认访问到E盘wwwroot目录下面的index.html，如果一个网站只是静态页面的话，那么就可以通过这种方式来实现部署。</p><h5 id="动静分离"><a href="#动静分离" class="headerlink" title="动静分离"></a>动静分离</h5><p>动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来，动静资源做好了拆分以后，我们就可以根据静态资源的特点将其做缓存操作，这就是网站静态化处理的核心思路<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">upstream test&#123;  </span><br><span class="line">       server localhost:8080;  </span><br><span class="line">       server localhost:8081;  </span><br><span class="line">    &#125;   </span><br><span class="line"></span><br><span class="line">    server &#123;  </span><br><span class="line">        listen       80;  </span><br><span class="line">        server_name  localhost;  </span><br><span class="line"></span><br><span class="line">        location / &#123;  </span><br><span class="line">            root   e:\wwwroot;  </span><br><span class="line">            index  index.html;  </span><br><span class="line">        &#125;  </span><br><span class="line"></span><br><span class="line">        # 所有静态请求都由nginx处理，存放目录为html  </span><br><span class="line">        location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ &#123;  </span><br><span class="line">            root    e:\wwwroot;  </span><br><span class="line">        &#125;  </span><br><span class="line"></span><br><span class="line">        # 所有动态请求都转发给tomcat处理  </span><br><span class="line">        location ~ \.(jsp|do)$ &#123;  </span><br><span class="line">            proxy_pass  http://test;  </span><br><span class="line">        &#125;  </span><br><span class="line"></span><br><span class="line">        error_page   500 502 503 504  /50x.html;  </span><br><span class="line">        location = /50x.html &#123;  </span><br><span class="line">            root   e:\wwwroot;  </span><br><span class="line">        &#125;  </span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><p>这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下，而tomcat只负责处理jsp和请求，例如当我们后缀为gif的时候，Nginx默认会从wwwroot获取到当前请求的动态图文件返回，当然这里的静态文件跟Nginx是同一台服务器，我们也可以在另外一台服务器，然后通过反向代理和负载均衡配置过去就好了，只要搞清楚了最基本的流程，很多配置就很简单了，另外localtion后面其实是一个正则表达式，所以非常灵活</p><h5 id="正向代理"><a href="#正向代理" class="headerlink" title="正向代理"></a>正向代理</h5><p>正向代理，意思是一个位于客户端和原始服务器(origin server)之间的服务器，为了从原始服务器取得内容，客户端向代理发送一个请求并指定目标(原始服务器)，然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候，可以用Nginx来实现正向代理，但是目前Nginx有一个问题，那么就是不支持HTTPS，虽然我百度到过配置HTTPS的正向代理，但是到最后发现还是代理不了，当然可能是我配置的不对，所以也希望有知道正确方法的同志们留言说明一下。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">resolver 114.114.114.114 8.8.8.8;</span><br><span class="line">server &#123;</span><br><span class="line"></span><br><span class="line">    resolver_timeout 5s;</span><br><span class="line"></span><br><span class="line">    listen 81;</span><br><span class="line"></span><br><span class="line">    access_log  e:\wwwroot\proxy.access.log;</span><br><span class="line">    error_log   e:\wwwroot\proxy.error.log;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        proxy_pass http://$host$request_uri;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>resolver是配置正向代理的DNS服务器，listen 是正向代理的端口，配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。</p><h5 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h5><p>Nginx是支持热启动的，也就是说当我们修改配置文件后，不用关闭Nginx，就可以实现让配置生效，当然我并不知道多少人知道这个，反正我一开始并不知道，导致经常杀死了Nginx线程再来启动。。。Nginx从新读取配置的命令是</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nginx -s reload</span><br></pre></td></tr></table></figure><p>windows下面就是</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nginx.exe -s reload</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h4 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h4&gt;&lt;p&gt;本文只针对Nginx在不加载第三方模块的情况能处理哪些事情，由于第三方模块太多所以也介绍不完，当然本文本身也可能介绍的不完整，毕竟只是我个人
      
    
    </summary>
    
      <category term="nginx" scheme="http://www.grapedlinux.cn/categories/nginx/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Zabbix安装配置</title>
    <link href="http://www.grapedlinux.cn/2017/04/02/17040202/"/>
    <id>http://www.grapedlinux.cn/2017/04/02/17040202/</id>
    <published>2017-04-02T14:31:38.000Z</published>
    <updated>2017-04-03T01:43:56.117Z</updated>
    
    <content type="html"><![CDATA[<h6 id="zabbix安装配置"><a href="#zabbix安装配置" class="headerlink" title="zabbix安装配置"></a>zabbix安装配置</h6><p>安装zabbix<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel-release</span><br></pre></td></tr></table></figure></p><p>安装rpm包的lamp环境<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y  httpd mysql mysql-libs php php-mysql mysql-server php-bcmath php-gd php-mbstring</span><br></pre></td></tr></table></figure></p><p>安装zabbix服务端<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install  zabbix20 zabbix20-agent zabbix20-server  zabbix20-server-mysql zabbix20-web zabbix20-web-mysql net-snmp-devel</span><br></pre></td></tr></table></figure></p><p>启动服务<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/zabbix-server start; /etc/init.d/zabbix-agent start; /etc/init.d/httpd start;</span><br></pre></td></tr></table></figure></p><p>修改一下mysql配置文件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/my.cnf    //修改或增加如下内容</span><br><span class="line"></span><br><span class="line">[mysql]</span><br><span class="line">default-character-set = utf8</span><br><span class="line"></span><br><span class="line">[mysqld]</span><br><span class="line">character_set_server = utf8</span><br></pre></td></tr></table></figure></p><p>启动mysql服务<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/mysqld start</span><br></pre></td></tr></table></figure></p><p>建库，导入数据<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mysql -uroot -p -e  &quot;create database zabbix&quot;</span><br><span class="line">mysql -uroot -p --default-character-set=utf8 zabbix &lt; /usr/share/zabbix-mysql/schema.sql</span><br><span class="line">mysql -uroot -p --default-character-set=utf8 zabbix &lt; /usr/share/zabbix-mysql/images.sql</span><br><span class="line">mysql -uroot -p --default-character-set=utf8  zabbix &lt; /usr/share/zabbix-mysql/data.sql</span><br></pre></td></tr></table></figure></p><p>网页安装zabbix<br>浏览器访问 <a href="http://ip/zabbix" target="_blank" rel="noopener">http://ip/zabbix</a>, 默认会有“It is not safe to rely on the system‘s timezone settings ”这样的警告信息，需要vim /etc/php.ini 设置 date.timezone=“Asia/Shanghai”点next<br>解决相关的报错信息，点retry  (vim /etc/php.ini)<br>输入mysql相关信息, 首先要测试一下，如果不通过，则需要调试，测试通过后，点next<br>Name 写127.0.0.1，（可以自定义）点next，再点next，最后点finish<br>默认管理员账号密码为 admin:zabbix<br>这时会遇到“zabbix server is not running”这样的错误，需要编辑一下 /etc/zabbix/zabbix_server.conf ，配置DBUser, DBPassword<br>接入要监控的主机<br>在客户端上<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">yum install zabbix20-agent</span><br><span class="line">vim /etc/zabbix_agentd.conf </span><br><span class="line">//更改Server=服务端ip; </span><br><span class="line"></span><br><span class="line">ServerActive=0.0.0.0:10050</span><br><span class="line">Hostname=xxx</span><br></pre></td></tr></table></figure></p><p>启动客户端<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">etc/init.d/zabbix-agent start</span><br></pre></td></tr></table></figure></p><p>服务端上命令行测试：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">zabbix_get -s 客户端ip -p10050 -k &quot;system.hostname&quot;</span><br></pre></td></tr></table></figure></p><p>在web界面下，点”configuration” –&gt; “host” –&gt; 右上角点”Create Host”  其中host name,  visible name自定义，可以选择groups，这里默认即可，ip address 写入客户端ip<br>配置监控项目模板：点“templates”, 点add, 在弹出的小窗口中选择Template OS Linux, 然后点select, 最后点save<br>自定义templates<br>Zabbix自带了很多模板，模板中有很多监控项目，比如CPU、网卡、内存、进程等等。使用系统自带模板有点太多了，所以我们可以自定义模板。点configuration 选择 templates，点右上角的create template<br>Template name和Visible name  自定义，Groups 选择templates, 点save<br>然后我们去挑选一些项目拷贝到该模板下：比如我们找到Template OS Linux 点一下items,选择我们想要的项目，然后在下面选择copy selected to … 然后点go<br>Group 选择templates, 找到刚才我们自定义的templates,点copy<br>点configuration 选择 templates可以看到新建的templates中已经有刚刚我们copy的items了<br>我们可以使用和上面相同的方法自定义拷贝Triggers（触发器 ）,它用来设置告警的阀值，当然我们也可以自定义编辑它。<br>例如：<a href="http://ask.apelearn.com/question/8091" target="_blank" rel="noopener">监控客户端网卡流量</a><br>配置发邮件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">yum install -y sendmail </span><br><span class="line">mkdir -p /home/zabbix/bin</span><br><span class="line">vim /home/zabbix/bin/baojing.sh //加入内容：</span><br><span class="line"></span><br><span class="line">#! /bin/bash</span><br><span class="line">echo &quot;$3&quot; |/bin/mail -s &quot;$2&quot; $1</span><br><span class="line">//保存退出后给予执行权限</span><br><span class="line">chmod +x /home/zabbix/bin/baojing.sh</span><br></pre></td></tr></table></figure></p><p>在zabbix_server.conf配置文件中，有参数AlertScriptsPath和ExternalScripts<br>AlertScriptsPath=/home/zabbix/bin/ —用户自定义的media types脚本<br>ExternalScripts=/home/zabbix/bin/ —用户自定义的检查的脚本（item）<br>这样才能找到你的脚本，因为你在frontend中只是输入脚本的名称，没有路径。<br>创建mediea types: “Administration” –&gt;”Media types”，点击右上角“Create Media Type”其中Description填”baojing” 或其它自定义名称，Type选择”Script”，Script填”baojing.sh”然后点”Save”.<br>创建user: “Adimistration” –&gt; “Users”在右上角，选择”Users”，点击”Create User”, alias: test1,自定义name和lastname password:123456;group 选择guest，回到上面点一下media,type 选择baojing，send to 写要发送邮件的邮箱，点add, 最后点save<br>创建action: “configuration” –&gt; actions,右上角“Create Actions”, Name自定义，我这里写”baojing”,其他默认，然后点右侧的“Operations”下的“New”按钮，“Operation Type”选择“Send message”，“Send Message to”选择一个或多个要发送消息的用户组，Send to Users选择我们之前新增的test1, “Send only to”选择baojing , 点一下add<br>最后点save。</p><p>扩展：<br><a href="http://zhujiangtao.blog.51cto.com/6387416/1313630" target="_blank" rel="noopener">zabbix历史记录乱码问题</a><br><a href="http://ask.apelearn.com/question/8090" target="_blank" rel="noopener">zabbix图形中乱码问题</a><br><a href="http://xianglinhu.blog.51cto.com/5787032/d-6" target="_blank" rel="noopener">Zabbix自定义监控脚本配置</a><br><a href="http://xianglinhu.blog.51cto.com/5787032/d-6" target="_blank" rel="noopener">Zabbix汇总</a></p><hr>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h6 id=&quot;zabbix安装配置&quot;&gt;&lt;a href=&quot;#zabbix安装配置&quot; class=&quot;headerlink&quot; title=&quot;zabbix安装配置&quot;&gt;&lt;/a&gt;zabbix安装配置&lt;/h6&gt;&lt;p&gt;安装zabbix&lt;br&gt;&lt;figure class=&quot;highlight p
      
    
    </summary>
    
      <category term="monitor" scheme="http://www.grapedlinux.cn/categories/monitor/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Nagios 安装和配置</title>
    <link href="http://www.grapedlinux.cn/2017/04/02/17040201/"/>
    <id>http://www.grapedlinux.cn/2017/04/02/17040201/</id>
    <published>2017-04-01T16:35:21.000Z</published>
    <updated>2017-04-01T16:36:47.284Z</updated>
    
    <content type="html"><![CDATA[<h5 id="Nagios-安装和配置"><a href="#Nagios-安装和配置" class="headerlink" title="Nagios 安装和配置"></a>Nagios 安装和配置</h5><p>Nagios官网:<a href="http://www.nagios.org" target="_blank" rel="noopener">http://www.nagios.org</a><br>实验环境：一台服务端（IP：192.168.0.200）；一台客户端（IP：192.168.0.201）。</p><h6 id="1-Nagios安装-服务端（192-168-0-200）"><a href="#1-Nagios安装-服务端（192-168-0-200）" class="headerlink" title="1. Nagios安装 - 服务端（192.168.0.200）"></a>1. Nagios安装 - 服务端（192.168.0.200）</h6><p>Centos6默认的yum源里没有nagios相关的rpm包，但是我们可以安装一个epel的扩展源：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel-release</span><br></pre></td></tr></table></figure></p><p>然后安装nagios相关的包<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y httpd nagios nagios-plugins nagios-plugins-all nrpe nagios-plugins-nrpe</span><br></pre></td></tr></table></figure></p><p>设置登录nagios后台的用户和密码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">htpasswd -c /etc/nagios/passwd nagiosadmin</span><br></pre></td></tr></table></figure></p><p>检测配置文件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nagios -v /etc/nagios/nagios.cfg</span><br></pre></td></tr></table></figure></p><p>启动服务：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service httpd start; service nagios start</span><br></pre></td></tr></table></figure></p><p>浏览器访问： http:/192.168.0.200ip/nagios/</p><h6 id="2-Nagios安装-客户端（192-168-0-201）"><a href="#2-Nagios安装-客户端（192-168-0-201）" class="headerlink" title="2. Nagios安装 - 客户端（192.168.0.201）"></a>2. Nagios安装 - 客户端（192.168.0.201）</h6><p>在客户端机器上:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel-release</span><br><span class="line">yum install -y nagios-plugins nagios-plugins-all nrpe nagios-plugins-nrpe </span><br><span class="line"></span><br><span class="line">vim /etc/nagios/nrpe.cfg</span><br><span class="line">找到“allowed_hosts=127.0.0.1” 改为 “allowed_hosts=127.0.0.1,192.168.0.200”</span><br><span class="line">找到” dont_blame_nrpe=0” 改为  “dont_blame_nrpe=1”</span><br></pre></td></tr></table></figure></p><p>启动客户端<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/nrpe start</span><br></pre></td></tr></table></figure></p><h6 id="3-监控中心（192-168-0-200）添加被监控主机（192-168-0-201）"><a href="#3-监控中心（192-168-0-200）添加被监控主机（192-168-0-201）" class="headerlink" title="3. 监控中心（192.168.0.200）添加被监控主机（192.168.0.201）"></a>3. 监控中心（192.168.0.200）添加被监控主机（192.168.0.201）</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">cd /etc/nagios/conf.d/</span><br><span class="line">vim 192.168.0.201.cfg                   //加入：</span><br><span class="line">define host&#123;</span><br><span class="line">        use                     linux-server            </span><br><span class="line">        host_name           192.168.0.201201</span><br><span class="line">        alias                       0.201</span><br><span class="line">        address                 192.168.0.201</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">define service&#123;</span><br><span class="line">        use                     generic-service</span><br><span class="line">        host_name               192.168.0.201</span><br><span class="line">        service_description     check_ping</span><br><span class="line">        check_command           check_ping!100.0,20%!200.0,50%</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">define service&#123;</span><br><span class="line">        use                     generic-service</span><br><span class="line">        host_name               192.168.0.201</span><br><span class="line">        service_description     check_ssh</span><br><span class="line">        check_command           check_ssh</span><br><span class="line">        max_check_attempts 5 ；当nagios检测到问题时，一共尝试检测5次都有问题才会告警，如果该数值为1，那么检测到问题立即告警</span><br><span class="line">        normal_check_interval 1 ；重新检测的时间间隔，单位是分钟，默认是3分钟</span><br><span class="line">        notification_interval 60 ；在服务出现异常后，故障一直没有解决，nagios再次对使用者发出通知的时间。单位是分钟。如果你认为，所有的事件只需要一次通知就够了，可以把这里的选项设为0。 </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">define service&#123;</span><br><span class="line">        use                     generic-service</span><br><span class="line">        host_name               192.168.0.201</span><br><span class="line">        service_description     check_http</span><br><span class="line">        check_command           check_http</span><br><span class="line">        max_check_attempts      5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以上服务不依赖于客户端nrpe服务，我们可以想象，我们在自己电脑上可以使用ping或者telnet探测远程任何一台机器是否存活、是否开启某个端口或服务。 而当我们想要检测客户端上的某个具体服务的情况时，就需要借助于nrpe了，比如想知道客户端机器的负责或磁盘使用情况。</p><h6 id="4-继续添加服务"><a href="#4-继续添加服务" class="headerlink" title="4.  继续添加服务"></a>4.  继续添加服务</h6><p>服务端<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/objects/commands.cfg</span><br><span class="line">//增加：</span><br><span class="line">    define command&#123;</span><br><span class="line">        command_name    check_nrpe</span><br><span class="line">        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure></p><p>继续编辑<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/conf.d/192.168.0.12.cfg</span><br><span class="line">//增加如下内容：</span><br><span class="line"></span><br><span class="line">define service&#123;</span><br><span class="line">        use     generic-service</span><br><span class="line">        host_name       192.168.0.12</span><br><span class="line">        service_description     check_load</span><br><span class="line">        check_command           check_nrpe!check_load</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">define service&#123;</span><br><span class="line">        use     generic-service</span><br><span class="line">        host_name       192.168.0.12</span><br><span class="line">        service_description     check_disk_hda1</span><br><span class="line">        check_command           check_nrpe!check_hda1</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">define service&#123;</span><br><span class="line">        use     generic-service</span><br><span class="line">        host_name       192.168.0.12</span><br><span class="line">        service_description     check_disk_hda2</span><br><span class="line">        check_command           check_nrpe!check_hda2</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>说明：<br>check_nrpe!check_load：这里的check_nrpe就是在commands.cfg刚刚定义的，check_load是远程主机上的一个检测脚本<br>在远程主机上vim /etc/nagios/nrpe.cfg 搜索check_load，这行就是在服务端上要执行的脚本了，我们可以手动执行这个脚本<br>把check_hda1更改一下：/dev/hda1 改为 /dev/sda1<br>再加一行command[check_hda2]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/sda2<br>客户端上重启一下nrpe服务:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service nrpe restart</span><br></pre></td></tr></table></figure></p><p>服务端也重启一下nagios服务:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service nagios restart</span><br></pre></td></tr></table></figure></p><h6 id="5-配置告警"><a href="#5-配置告警" class="headerlink" title="5.   配置告警"></a>5.   配置告警</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/objects/contacts.cfg </span><br><span class="line">//增加：</span><br><span class="line"></span><br><span class="line">define contact&#123;</span><br><span class="line">        contact_name               123</span><br><span class="line">        use                             generic-contact</span><br><span class="line">        alias                           aming</span><br><span class="line">        email              lishiming2009@139.com</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">define contact&#123;</span><br><span class="line">        contact_name               456</span><br><span class="line">        use                             generic-contact</span><br><span class="line">        alias                            aaa</span><br><span class="line">        email              aminglinux@139.com</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">define contactgroup&#123;</span><br><span class="line">        contactgroup_name           common</span><br><span class="line">        alias                                  common</span><br><span class="line">        members                          123,456</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><p>然后在要需要告警的服务里面加上contactgroup</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">define service&#123;</span><br><span class="line">        use     generic-service</span><br><span class="line">        host_name       192.168.0.12</span><br><span class="line">        service_description     check_load</span><br><span class="line">        check_command           check_nrpe!check_load</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">        contact_groups        common</span><br><span class="line">        notifications_enabled  1    ；是否开启提醒功能。1为开启，0为禁用。一般，这个选项会在主配置文件（nagios.cfg）中定义，效果相同。</span><br><span class="line">        notification_period   24x7   ；发送提醒的时间段。非常重要的主机（服务）我定义为7×24，一般的主机（服务）就定义为上班时间。如果不在定义的时间段内，无论什么问题发生，都不会发送提醒。        </span><br><span class="line">        notification_options:w,u,c,r   ；这个是service的状态。w为waning， u为unknown, c为critical, r为recover(恢复了），类似的还有一个  host对应的状态：d,u,r   d = 状态为DOWN, u = 状态为UNREACHABLE , r = 状态恢复为OK，需要加入到host的定义配置里。</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>扩展：<br><a href="http://www.aminglinux.com/bbs/thread-7380-1-1.html" target="_blank" rel="noopener">调用短信接口</a><br><a href="http://www.aminglinux.com/bbs/thread-7917-1-1.html" target="_blank" rel="noopener">整合微信</a></p><h6 id="6-配置图形显示-pnp4nagios"><a href="#6-配置图形显示-pnp4nagios" class="headerlink" title="6.   配置图形显示 pnp4nagios"></a>6.   配置图形显示 pnp4nagios</h6><p>安装<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install pnp4nagios rrdtool</span><br></pre></td></tr></table></figure></p><p>配置主配置文件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/nagios.cfg  //修改如下配置</span><br><span class="line"></span><br><span class="line">process_performance_data=1   </span><br><span class="line">host_perfdata_command=process-host-perfdata</span><br><span class="line">service_perfdata_command=process-service-perfdata</span><br><span class="line">enable_environment_macros=1</span><br></pre></td></tr></table></figure></p><p>修改commands.cfg<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/objects/commands.cfg  //注释掉原有对process-host-perfdata和process-service-perfdata，重新定义</span><br><span class="line"></span><br><span class="line">define command &#123;  </span><br><span class="line">       command_name    process-service-perfdata  </span><br><span class="line">       command_line    /usr/bin/perl /usr/libexec/pnp4nagios/process_perfdata.pl  </span><br><span class="line">&#125;  </span><br><span class="line">  </span><br><span class="line">define command &#123;  </span><br><span class="line">       command_name    process-host-perfdata  </span><br><span class="line">       command_line    /usr/bin/perl /usr/libexec/pnp4nagios/process_perfdata.pl -d HOSTPERFDATA  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>修改配置文件templates.cfg</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/objects/templates.cfg define host &#123;</span><br><span class="line">        name       hosts-pnp</span><br><span class="line">        register   0</span><br><span class="line">        action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&amp;srv=_HOST_</span><br><span class="line">        process_perf_data               1</span><br><span class="line">&#125;</span><br><span class="line">define service &#123;</span><br><span class="line">        name       srv-pnp</span><br><span class="line">        register   0</span><br><span class="line">        action_url /pnp4nagios/index.php/graph?host=$HOSTNAME$&amp;srv=$SERVICEDESC$</span><br><span class="line">        process_perf_data               1</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>修改host和service配置</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/nagios/conf.d/192.168.0.12.cfg </span><br><span class="line">把 “define host&#123;</span><br><span class="line">        use                     linux-server” </span><br><span class="line">改为：</span><br><span class="line">define host&#123;</span><br><span class="line">        use                     linux-server,hosts-pnp</span><br><span class="line"></span><br><span class="line">修改对应的service，比如</span><br><span class="line">把</span><br><span class="line">define service&#123;</span><br><span class="line">        use     generic-service</span><br><span class="line">        host_name       192.168.0.12</span><br><span class="line">        service_description     check_disk_hda1</span><br><span class="line">        check_command           check_nrpe!check_hda1</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br><span class="line">改为：</span><br><span class="line">define service&#123;</span><br><span class="line">        use     generic-service,srv-pnp</span><br><span class="line">        host_name       192.168.0.12</span><br><span class="line">        service_description     check_disk_hda1</span><br><span class="line">        check_command           check_nrpe!check_hda1</span><br><span class="line">        max_check_attempts 5</span><br><span class="line">        normal_check_interval 1</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>重启和启动各个服务：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">service nagios restart</span><br><span class="line">service httpd restart</span><br><span class="line">service npcd start</span><br></pre></td></tr></table></figure></p><p>两种访问方法：</p><p>ip/nagios/<br>ip/pnp4nagios/</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h5 id=&quot;Nagios-安装和配置&quot;&gt;&lt;a href=&quot;#Nagios-安装和配置&quot; class=&quot;headerlink&quot; title=&quot;Nagios 安装和配置&quot;&gt;&lt;/a&gt;Nagios 安装和配置&lt;/h5&gt;&lt;p&gt;Nagios官网:&lt;a href=&quot;http://www.n
      
    
    </summary>
    
      <category term="monitor" scheme="http://www.grapedlinux.cn/categories/monitor/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>CentOS上搭建Git服务器</title>
    <link href="http://www.grapedlinux.cn/2017/04/01/17040102/"/>
    <id>http://www.grapedlinux.cn/2017/04/01/17040102/</id>
    <published>2017-04-01T08:43:10.000Z</published>
    <updated>2017-04-01T08:43:57.039Z</updated>
    
    <content type="html"><![CDATA[<p>Git是一个分布式版本控制软件，原来是linux内核开发者Linus Torvalds为了更好地管理linux内核开发而创立的。发展至今，Git已经成为了一个相当好用的版本管理工具。相比于SVN，如果想要保存一些微小的修改也必须得提交服务器保存才可以，这样使服务器的版本号过多，而Git解决了这个问题，一些小的修改只在本地提交即可，只需最后修改完成后再提交服务器。正是由于这样的便捷性，现在越来越多的社区项目都开始使用Git来取代SVN之类较为传统的版本管理工具进行开发。<br>使用CentOS搭建Git服务器是一件比较轻松的事儿，本次折腾主要涉及git, gitosis, gitweb的安装配置。其中，gitosis和gitweb是两种比较常用的方式，gitosis是以SSH方式访问和管理git， gitweb是通过http的方式访问和管理。利用这些工具即可满足Git服务器的基本功能。此外比较好的一点是，Git的管理工具几乎不会给服务器带来较大的性能压力。下面正式开始我们的Git安装配置记录。</p><h6 id="一、安装Git"><a href="#一、安装Git" class="headerlink" title="一、安装Git"></a>一、安装Git</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install git</span><br></pre></td></tr></table></figure><p>然后进行配置：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">useradd --home /home/git git</span><br><span class="line">passwd git</span><br></pre></td></tr></table></figure></p><p>创建完用户后就可以切换到git用户下进行后面的设置，如用户名和邮箱：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">su git</span><br><span class="line">git config --global user.name &quot;somebody&quot;</span><br><span class="line">git config --global user.email &quot;somebody@example.com&quot;</span><br></pre></td></tr></table></figure></p><p>设置默认将会保存在~/.gitconfig文件中。<br>此时，Git的功能就已经可以使用了。为了方便后面的操作，可以先来创建一个空版本库。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir ~/repo</span><br></pre></td></tr></table></figure></p><p>然后建立项目目录<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir ~/repo/huhamhire-hosts</span><br></pre></td></tr></table></figure></p><p>切换到项目目录，并进行初始化<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd ~/repo/huhamhire-hosts</span><br><span class="line">git init -bare</span><br></pre></td></tr></table></figure></p><p>至此，一个初始的空项目版本库就配置完成了，后面安装了gitosis之后便可向库中推送我们的代码库内容。</p><h6 id="二、安装gitosis"><a href="#二、安装gitosis" class="headerlink" title="二、安装gitosis"></a>二、安装gitosis</h6><p>在安装之前，可以看一下gitosis的实现原理：<br><a href="http://geeklu.com/2012/10/gitosis/" target="_blank" rel="noopener">浅谈Gitosis实现原理</a><br>先切换回root权限。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">su root</span><br></pre></td></tr></table></figure></p><p>并先安装python-setuptool<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install python-setuptools</span><br></pre></td></tr></table></figure></p><p>然后开始安装gitosis，值得注意的是gitosis的安装程序本身就是由git管理的，需要使用git来获取。这里在/tmp目录下进行相关的安装操作：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /tmp</span><br><span class="line">git clone https://github.com/res0nat0r/gitosis.git</span><br></pre></td></tr></table></figure></p><p>接下来进入下载的gitosis版本库进行安装:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd gitosis</span><br><span class="line">python setup.py install</span><br></pre></td></tr></table></figure></p><p>安装完成后，便进入对gitosis的设置阶段。由于gitosis需要通过SSH进行管理，所以需要创建SSH密钥对，并将公钥放在服务器端，私钥放在客户端。一般的流程是客户端创建完密钥后，将公钥传到服务器上生效。不过，偷懒的话直接在服务器上操作问题也不大。</p><p>切换到git用户并建立文件夹.ssh：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">su git</span><br><span class="line">mkdir /home/git/.ssh</span><br></pre></td></tr></table></figure></p><p>一定记得，在客户机上生成公钥，上传到服务器，或者在服务器上生成，下载到客户机。<br>进入~/.ssh目录并使用ssh-keygen生成公钥：cd /home/git/.ssh<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure></p><p>注意不能忘记私钥的密码。默认会生成~/.ssh/id_rsa.pub公钥文件。<br>有了密钥以后便可初始化gitosis，使gitosis获得对Git的管理权限：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gitosis-init &lt; /home/git/.ssh/id_rsa.pub</span><br></pre></td></tr></table></figure></p><p>初始化之后，会在/home/git/repositories创建gitosis-admin.git项目，可以通过维护这个项目来对gitosis进行配置。<br>除此以外，还需要对gitosis-admin.git/hooks/post-update目录赋上特殊权限：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod u+x /home/git/repositories/gitosis-admin.git/hooks/post-update</span><br></pre></td></tr></table></figure></p><p>至此，服务器端的gitosys配置就完成了。</p><h6 id="三、设置并使用gitosys"><a href="#三、设置并使用gitosys" class="headerlink" title="三、设置并使用gitosys"></a>三、设置并使用gitosys</h6><p>在服务器端完成了gitosys的配置之后，便可在客户端进行接下来的设置，以便使用Git服务器。<br>较为正规的做法是在客户端通过gitosis-admin版本库做管理设置，之后提交到服务器使项目权限生效，当然也可以使用操作系统的ssh登录方式进行验证，不过这里仅介绍前面一种方法。<br>在进行以下操作时，需要确认一下，你的公钥是不是已经放在客户机~/.ssh/目录下。如果你也在用github的话，那么你需要设置一下多公钥共存的东西。.ssh/config，在这个文件中写入：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Host github.com</span><br><span class="line">    HostName github.com</span><br><span class="line">    User git</span><br><span class="line">    IdentityFile C:/Users/abc/.ssh/id_rsa</span><br><span class="line">Host git.oschina.net</span><br><span class="line">    HostName git.oschina.net</span><br><span class="line">    User git</span><br><span class="line">    IdentityFile C:/Users/abc/.ssh/id_rsa_a</span><br><span class="line">Host abc.ueder.info</span><br><span class="line">    HostName abc.ueder.info</span><br><span class="line">    User git</span><br><span class="line">    Port 1000</span><br><span class="line">    IdentityFile C:/Users/abc/.ssh/id_rsa_new</span><br></pre></td></tr></table></figure></p><p>如我就使用了好几个git服务，每个都有自己的公钥，需要配置文件来区分开来，并且我自己的服务器ssh端口已经不是默认端口，需要在配置文件中声明，否则在每次clone的时候要声明端口。<br>在客户机上下载gitosis-admin版本库，这里以linux客户机为例：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone git@VPS的IP/Domain:/home/git/repositories/gitosis-admin.git</span><br></pre></td></tr></table></figure></p><p>获取完成后对gitosis-admin/gitosis.conf文件进行设置，以上面新建的项目为例，新增：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[group huhamhire-hosts]</span><br><span class="line">writable = huhamhire-hosts</span><br><span class="line">members = hamhire@myhost</span><br></pre></td></tr></table></figure></p><p>随后要将客户端的公钥放到keydir目录下，并随后提交设置到服务器：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">cp ~/.ssh/id_rsa.pub ~/gitosis-admin/keydir/hamhire@myhost.pub</span><br><span class="line">    </span><br><span class="line">cd ~/gitosis-admin</span><br><span class="line">git add ./</span><br><span class="line">git commit -a -m &quot;add new repo&quot;</span><br><span class="line">git push</span><br></pre></td></tr></table></figure></p><p>由于之前已经在/home/git/repo/目录下设置了huhamhire-hosts的版本库位置，所以可以直接进行推送操作。<br>在本例中可以通过hamhire@myhost:/home/git/repo/huhamhire-hosts的路径来提交项目。<br>至此，gitosys的配置全部完成。</p><h6 id="四、安装gitweb"><a href="#四、安装gitweb" class="headerlink" title="四、安装gitweb"></a>四、安装gitweb</h6><p>在配置完成了git服务器以后，如果需要方便在线查看，使用gitweb来提供一个简单网页版的版本显示界面是一个不错的选择。<br>在centos 下安装gitweb如下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">yum install fcgi-devel</span><br><span class="line">    </span><br><span class="line">cd /usr/local/src/</span><br><span class="line">git clone git://github.com/gnosek/fcgiwrap.git</span><br><span class="line">cd fcgiwrap</span><br><span class="line">autoreconf -i</span><br><span class="line">./configure</span><br><span class="line">make</span><br><span class="line">make install</span><br></pre></td></tr></table></figure></p><p>至此，fcgiwrap已经安装到 /usr/local/sbin/fcgiwrap<br>然后再安装spawn-fcgi<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install spawn-fcgi</span><br></pre></td></tr></table></figure></p><p>安装好后:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/sysconfig/spawn-fcgi</span><br><span class="line"># 修改文件为：</span><br><span class="line"></span><br><span class="line"># You must set some working options before the &quot;spawn-fcgi&quot; service will work.</span><br><span class="line"># If SOCKET points to a file, then this file is cleaned up by the init script.</span><br><span class="line">#</span><br><span class="line"># See spawn-fcgi(1) for all possible options.</span><br><span class="line">#</span><br><span class="line"># Example :</span><br><span class="line">#SOCKET=/var/run/php-fcgi.sock</span><br><span class="line">#OPTIONS=&quot;-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi&quot;</span><br><span class="line">FCGI_SOCKET=/var/run/fcgiwrap.socket</span><br><span class="line">FCGI_PROGRAM=/usr/local/sbin/fcgiwrap</span><br><span class="line">FCGI_USER=nginx</span><br><span class="line">FCGI_GROUP=nginx</span><br><span class="line">FCGI_EXTRA_OPTIONS=&quot;-M 0700&quot;</span><br><span class="line">OPTIONS=&quot;-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM&quot;</span><br></pre></td></tr></table></figure></p><p>然后设置开机运行：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chkconfig --levels 2345 spawn-fcgi on</span><br><span class="line">/etc/init.d/spawn-fcgi start</span><br></pre></td></tr></table></figure></p><p>这里已经完成了fcgi的安装运行。如果你用的nginx，还需要对nginx.conf进行配置，才能将.cgi的请求转发给fcgiwrap.socket<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">location /cgi-bin/ &#123;</span><br><span class="line"> # Disable gzip (it makes scripts feel slower since they have to complete</span><br><span class="line"> # before getting gzipped)</span><br><span class="line"> gzip off;</span><br><span class="line"> # Set the root to /usr/lib (inside this location this means that we are</span><br><span class="line"> # giving access to the files under /usr/lib/cgi-bin)</span><br><span class="line"> root /var/www/www.example.com;</span><br><span class="line"> # Fastcgi socket</span><br><span class="line"> fastcgi_pass unix:/var/run/fcgiwrap.socket;</span><br><span class="line"> # Fastcgi parameters, include the standard ones</span><br><span class="line"> include /etc/nginx/fastcgi_params;</span><br><span class="line"> # Adjust non standard parameters (SCRIPT_FILENAME)</span><br><span class="line"> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure></p><p>最后重启nginx就可以了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Git是一个分布式版本控制软件，原来是linux内核开发者Linus Torvalds为了更好地管理linux内核开发而创立的。发展至今，Git已经成为了一个相当好用的版本管理工具。相比于SVN，如果想要保存一些微小的修改也必须得提交服务器保存才可以，这样使服务器的版本号过
      
    
    </summary>
    
      <category term="github" scheme="http://www.grapedlinux.cn/categories/github/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>linux监控之cacti</title>
    <link href="http://www.grapedlinux.cn/2017/04/01/17040101/"/>
    <id>http://www.grapedlinux.cn/2017/04/01/17040101/</id>
    <published>2017-04-01T05:56:18.000Z</published>
    <updated>2017-04-01T06:02:19.365Z</updated>
    
    <content type="html"><![CDATA[<p>cacti 重图形，有数据历史，需用到数据库支持，支持web配置，默认不支持告警，可以加插件。</p><h5 id="cacti安装配置"><a href="#cacti安装配置" class="headerlink" title="cacti安装配置"></a>cacti安装配置</h5><h6 id="1-首先要安装epel扩展源"><a href="#1-首先要安装epel扩展源" class="headerlink" title="1. 首先要安装epel扩展源"></a>1. 首先要安装epel扩展源</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install  epel-release</span><br></pre></td></tr></table></figure><h6 id="2-（lamp）然后分别安装httpd、php、mysql"><a href="#2-（lamp）然后分别安装httpd、php、mysql" class="headerlink" title="2. （lamp）然后分别安装httpd、php、mysql"></a>2. （lamp）然后分别安装httpd、php、mysql</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y  httpd php php-mysql mysql mysql-server mysql-devel php-gd  libjpeg libjpeg-devel libpng libpng-devel</span><br></pre></td></tr></table></figure><h6 id="3-安装cacti-net-snmp-rrdtool"><a href="#3-安装cacti-net-snmp-rrdtool" class="headerlink" title="3. 安装cacti  net-snmp  rrdtool"></a>3. 安装cacti  net-snmp  rrdtool</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y cacti  net-snmp  net-snmp-utils  rrdtool</span><br></pre></td></tr></table></figure><h6 id="4-启动服务："><a href="#4-启动服务：" class="headerlink" title="4. 启动服务："></a>4. 启动服务：</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/etc/init.d/mysqld start</span><br><span class="line">/etc/init.d/httpd  start</span><br><span class="line">/etc/init.d/snmpd start</span><br></pre></td></tr></table></figure><h6 id="5-编辑httpd配置文件"><a href="#5-编辑httpd配置文件" class="headerlink" title="5. 编辑httpd配置文件"></a>5. 编辑httpd配置文件</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/httpd/conf.d/cacti.conf  </span><br><span class="line"></span><br><span class="line"># 把&quot;Deny from all&quot; 改为  &quot;Allow from all&quot;</span><br><span class="line">/etc/init.d/httpd  restart</span><br></pre></td></tr></table></figure><h6 id="6-导入数据创建cacti库"><a href="#6-导入数据创建cacti库" class="headerlink" title="6.  导入数据创建cacti库"></a>6.  导入数据创建cacti库</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mysql -uroot  -e &quot;create database cacti&quot; #创建数据库</span><br><span class="line">mysql -uroot -e &quot;grant all on cacti.* to &apos;cacti&apos;@&apos;127.0.0.1&apos; identified by &apos;cacti&apos;;&quot; #创建cacti用户</span><br><span class="line">mysql -uroot cacti &lt; /usr/share/doc/cacti-0.8.8b/cacti.sql #导入cacti文件</span><br></pre></td></tr></table></figure><h6 id="7-编辑cacti配置文件"><a href="#7-编辑cacti配置文件" class="headerlink" title="7.  编辑cacti配置文件"></a>7.  编辑cacti配置文件</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">vim /usr/share/cacti/include/config.php  更改如下：</span><br><span class="line">$database_type = &quot;mysql&quot;;</span><br><span class="line">$database_default = &quot;cacti&quot;;</span><br><span class="line">$database_name = &quot;cacti&quot;;</span><br><span class="line">$database_hostname = &quot;127.0.0.1&quot;;</span><br><span class="line">$database_username = &quot;cacti&quot;;</span><br><span class="line">$database_password = &quot;cacti&quot;;</span><br><span class="line">$database_port = &quot;3306&quot;;</span><br><span class="line">$database_ssl = false;</span><br></pre></td></tr></table></figure><h6 id="8-web访问cacti并安装"><a href="#8-web访问cacti并安装" class="headerlink" title="8. web访问cacti并安装"></a>8. web访问cacti并安装</h6><p><a href="http://192.168.209.131/cacti/" target="_blank" rel="noopener">http://192.168.209.131/cacti/</a><br>点两下“next” 和一次”Finish“ 即可<br>输入admin   admin 登录，重新设置新的密码</p><h6 id="9-执行poller-php-生成图形，-加入计划任务"><a href="#9-执行poller-php-生成图形，-加入计划任务" class="headerlink" title="9. 执行poller.php, 生成图形， 加入计划任务"></a>9. 执行poller.php, 生成图形， 加入计划任务</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/php /usr/share/cacti/poller.php添加cron任务</span><br><span class="line">//crontab -e  增加：</span><br><span class="line">*/5 * * * *  /usr/bin/php /usr/share/cacti/poller.php</span><br></pre></td></tr></table></figure><p>以下10-12步骤在客户端机器上操作</p><h6 id="10-安装snmp"><a href="#10-安装snmp" class="headerlink" title="10. 安装snmp"></a>10. 安装snmp</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y net-snmp</span><br></pre></td></tr></table></figure><h6 id="11-修改snmpd-conf"><a href="#11-修改snmpd-conf" class="headerlink" title="11. 修改snmpd.conf"></a>11. 修改snmpd.conf</h6><p>修改syslocation以及syscontact, 其中syslocation 可以写本机ip，syscontact写管理员邮箱<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">syslocation 192.168.209.131</span><br><span class="line">syscontact Root graped@aliyun.com</span><br></pre></td></tr></table></figure></p><h6 id="12-启动snmp"><a href="#12-启动snmp" class="headerlink" title="12. 启动snmp"></a>12. 启动snmp</h6><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service  snmpd  start</span><br></pre></td></tr></table></figure><h6 id="13-登录cacti管理后台，点console-再点Device，-在右上角点”Add“"><a href="#13-登录cacti管理后台，点console-再点Device，-在右上角点”Add“" class="headerlink" title="13.  登录cacti管理后台，点console , 再点Device， 在右上角点”Add“"></a>13.  登录cacti管理后台，点console , 再点Device， 在右上角点”Add“</h6><p>Description  写本机ip或你自定义一个名字<br>Hostname  写本机ip<br>Host Template  选ucd/net  SNMP Host<br>SNMP Version  选Version 2<br>点右下角的create<br>点右上角的”Create Graphs for this Host“<br>Graph Types:  选择SNMP - Interface Statistics<br>在下面框中选择要监控的网卡，比如我选择eth0, 在最右侧小方块里打对勾，然后点右下角的create<br>（如果在这一步找不到网卡，可以根据这个帖子修改配置文件：<a href="http://ask.apelearn.com/question/8089" title="cacti监控找到网卡的方法" target="_blank" rel="noopener">cacti监控找到网卡的方法</a>）<br>Graph Types:  再选择 Graph Template Based<br>在下面的框中，选择你要监控的项目，比如ucd/net - Load Average<br>在右侧小方块中打对勾，然后点右下角的create</p><h6 id="14-点左侧的Graph-Trees"><a href="#14-点左侧的Graph-Trees" class="headerlink" title="14. 点左侧的Graph Trees"></a>14. 点左侧的Graph Trees</h6><p>选中”Default Tree“<br>点右上角的Add<br>Tree Item Type 选择 ”Host“<br>Host 选择我们刚刚增加的那个机器ip<br>点右下角的create</p><h6 id="15-点左上角的Graphs"><a href="#15-点左上角的Graphs" class="headerlink" title="15. 点左上角的Graphs"></a>15. 点左上角的Graphs</h6><p>在左侧可以看到<br>Defaut Tree下面已经增加了我们刚刚添加的主机，图形一开始不会那么快出来，要等一小会才可以。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;cacti 重图形，有数据历史，需用到数据库支持，支持web配置，默认不支持告警，可以加插件。&lt;/p&gt;
&lt;h5 id=&quot;cacti安装配置&quot;&gt;&lt;a href=&quot;#cacti安装配置&quot; class=&quot;headerlink&quot; title=&quot;cacti安装配置&quot;&gt;&lt;/a&gt;cact
      
    
    </summary>
    
      <category term="monitor" scheme="http://www.grapedlinux.cn/categories/monitor/"/>
    
    
      <category term="linux" scheme="http://www.grapedlinux.cn/tags/linux/"/>
    
  </entry>
  
</feed>
