<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>服务器 on Allens' Blog</title><link>https://allens.tech/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8/</link><description>Recent content from Allens' Blog</description><generator>Hugo</generator><language>en-us</language><managingEditor>allens.leng@gmail.com (Allens)</managingEditor><webMaster>allens.leng@gmail.com (Allens)</webMaster><copyright>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</copyright><lastBuildDate>Thu, 12 Nov 2020 20:00:00 +0800</lastBuildDate><atom:link href="https://allens.tech/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>服务器资源监控</title><link>https://allens.tech/post/202011122000/</link><pubDate>Thu, 12 Nov 2020 20:00:00 +0800</pubDate><author>allens.leng@gmail.com (Allens)</author><guid>https://allens.tech/post/202011122000/</guid><description>
<![CDATA[<h1>服务器资源监控</h1><p>Author: Allens(allens.leng@gmail.com)</p>
        
          <h2 id="描述">
<a class="header-anchor" href="#%e6%8f%8f%e8%bf%b0"></a>
描述
</h2><p>最近手里很多服务器都出现了内存满了或者硬盘满了导致服务器宕机等问题，迫使资源监控成为我的必备技能之一。</p>
<h2 id="站点访问监控">
<a class="header-anchor" href="#%e7%ab%99%e7%82%b9%e8%ae%bf%e9%97%ae%e7%9b%91%e6%8e%a7"></a>
站点访问监控
</h2><p>我一直用的是 MySSL 企业版的网站监控，网站无法访问时，邮件 + 微信提醒还是挺好用的，当然如果不嫌麻烦的话，自己写一个脚本也是可以的。
<img src="/img/2020-11-12/1.jpeg" alt=""></p>
<h2 id="服务器内部资源监控">
<a class="header-anchor" href="#%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%86%85%e9%83%a8%e8%b5%84%e6%ba%90%e7%9b%91%e6%8e%a7"></a>
服务器内部资源监控
</h2><p>这边自己写了个脚本监控网站硬盘资源发送到钉钉，其中钉钉的部分是从 <a href="https://github.com/Berry961103">Berry</a> 那里直接拿来用的。</p>
<ul>
<li>go build 一个 diskMonitor</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Go" data-lang="Go"><span style="display:flex;"><span><span style="color:#f92672">package</span> <span style="color:#a6e22e">main</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> (
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;bytes&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;encoding/json&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;errors&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;fmt&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;io/ioutil&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;net/http&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;time&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;github.com/shirou/gopsutil/disk&#34;</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// SendGroupType .</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">type</span> <span style="color:#a6e22e">SendGroupType</span> <span style="color:#66d9ef">struct</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">MsgType</span> <span style="color:#66d9ef">string</span>   <span style="color:#e6db74">`json:&#34;msgtype&#34;`</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">Text</span>    <span style="color:#a6e22e">TextType</span> <span style="color:#e6db74">`json:&#34;text&#34;`</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">At</span>      <span style="color:#a6e22e">AtType</span>   <span style="color:#e6db74">`json:&#34;at&#34;`</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">IsAtAll</span> <span style="color:#66d9ef">bool</span>     <span style="color:#e6db74">`json:&#34;isAtAll&#34;`</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// TextType .</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">type</span> <span style="color:#a6e22e">TextType</span> <span style="color:#66d9ef">struct</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">Content</span> <span style="color:#66d9ef">string</span> <span style="color:#e6db74">`json:&#34;content&#34;`</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// AtType .</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">type</span> <span style="color:#a6e22e">AtType</span> <span style="color:#66d9ef">struct</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">AtMobiles</span> []<span style="color:#66d9ef">string</span> <span style="color:#e6db74">`json:&#34;atMobiles&#34;`</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// SendGroupResp .</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">type</span> <span style="color:#a6e22e">SendGroupResp</span> <span style="color:#66d9ef">struct</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">ErrMsg</span>  <span style="color:#66d9ef">string</span> <span style="color:#e6db74">`json:&#34;errmsg&#34;`</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">ErrCode</span> <span style="color:#66d9ef">int</span>    <span style="color:#e6db74">`json:&#34;errcode&#34;`</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> (
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">token</span>       = <span style="color:#e6db74">&#34;your token&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">allensPhone</span> = <span style="color:#e6db74">&#34;your dingtalk phone&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">b</span> = <span style="color:#ae81ff">1024</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">k</span> = <span style="color:#a6e22e">b</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">g</span> = <span style="color:#a6e22e">k</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">1024</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">diskInfo</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">disk</span>.<span style="color:#a6e22e">Usage</span>(<span style="color:#e6db74">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">diskInfo</span>.<span style="color:#a6e22e">Free</span><span style="color:#f92672">/</span><span style="color:#a6e22e">g</span> <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">3</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">SendDingRobot</span>(<span style="color:#e6db74">&#34;告警： 当前您的服务器 [ XXX ] 硬盘内存剩余已不足 3 G&#34;</span>, []<span style="color:#66d9ef">string</span>{
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">allensPhone</span>,
</span></span><span style="display:flex;"><span>		})
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// SendDingRobot Send text messages to ding robot</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">SendDingRobot</span>(<span style="color:#a6e22e">msg</span> <span style="color:#66d9ef">string</span>, <span style="color:#a6e22e">phone</span> []<span style="color:#66d9ef">string</span>) <span style="color:#66d9ef">error</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">t</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">TextType</span>{
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">Content</span>: <span style="color:#a6e22e">msg</span>,
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">a</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">AtType</span>{
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">AtMobiles</span>: <span style="color:#a6e22e">phone</span>,
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">g</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">SendGroupType</span>{
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">MsgType</span>: <span style="color:#e6db74">&#34;text&#34;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">Text</span>:    <span style="color:#a6e22e">t</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">At</span>:      <span style="color:#a6e22e">a</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">IsAtAll</span>: <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">sendGroup</span>(<span style="color:#a6e22e">g</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Errorf</span>(<span style="color:#e6db74">&#34;send ding Group err:[%s]&#34;</span>, <span style="color:#a6e22e">err</span>.<span style="color:#a6e22e">Error</span>())
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// SendGroup 发送消息到钉钉群机器人</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">sendGroup</span>(<span style="color:#a6e22e">sendGroup</span> <span style="color:#a6e22e">SendGroupType</span>) <span style="color:#66d9ef">error</span> {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">client</span> <span style="color:#f92672">:=</span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">http</span>.<span style="color:#a6e22e">Client</span>{
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">Timeout</span>: <span style="color:#a6e22e">time</span>.<span style="color:#a6e22e">Duration</span>(<span style="color:#ae81ff">15</span>) <span style="color:#f92672">*</span> <span style="color:#a6e22e">time</span>.<span style="color:#a6e22e">Second</span>,
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">reqData</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">Marshal</span>(<span style="color:#a6e22e">sendGroup</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">err</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">reader</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bytes</span>.<span style="color:#a6e22e">NewReader</span>(<span style="color:#a6e22e">reqData</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">resp</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">client</span>.<span style="color:#a6e22e">Post</span>(<span style="color:#e6db74">&#34;https://oapi.dingtalk.com/robot/send?access_token=&#34;</span><span style="color:#f92672">+</span><span style="color:#a6e22e">token</span>, <span style="color:#e6db74">&#34;application/json;charset=UTF-8&#34;</span>, <span style="color:#a6e22e">reader</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">err</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">resp</span>.<span style="color:#a6e22e">Body</span>.<span style="color:#a6e22e">Close</span>()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">data</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">ioutil</span>.<span style="color:#a6e22e">ReadAll</span>(<span style="color:#a6e22e">resp</span>.<span style="color:#a6e22e">Body</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">err</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">respData</span> <span style="color:#a6e22e">SendGroupResp</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">err</span> = <span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">Unmarshal</span>(<span style="color:#a6e22e">data</span>, <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">respData</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">err</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">respData</span>.<span style="color:#a6e22e">ErrCode</span> <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">errors</span>.<span style="color:#a6e22e">New</span>(<span style="color:#a6e22e">respData</span>.<span style="color:#a6e22e">ErrMsg</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li><code>SCP</code> 上传脚本到服务器上</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>scp diskMonitor myservice:~/monitor/disk
</span></span></code></pre></div><ul>
<li>Linux 定时任务</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>crontab -e
</span></span></code></pre></div><blockquote>
<p>后续参数</p>
        
        <hr><p>Published on 2020-11-12 at <a href='https://allens.tech/'>Allens' Blog</a>, last modified on 2020-11-12</p>]]></description><category>服务器</category></item><item><title>个人服务器的那点事</title><link>https://allens.tech/post/202009252024/</link><pubDate>Fri, 25 Sep 2020 20:00:00 +0800</pubDate><author>allens.leng@gmail.com (Allens)</author><guid>https://allens.tech/post/202009252024/</guid><description>
<![CDATA[<h1>个人服务器的那点事</h1><p>Author: Allens(allens.leng@gmail.com)</p>
        
          <h2 id="描述">
<a class="header-anchor" href="#%e6%8f%8f%e8%bf%b0"></a>
描述
</h2><p>私人服务器部署方案以及维护期间的一些心得</p>
<h2 id="访问加速">
<a class="header-anchor" href="#%e8%ae%bf%e9%97%ae%e5%8a%a0%e9%80%9f"></a>
访问加速
</h2><ul>
<li>图片格式：图片尽量选用 JPG 格式，PNG 格式的图片普遍要比 JPG 格式的图片大很多。</li>
<li>图片压缩：过大的资源加载会非常耗时，影响网站渲染的速度，用 <a href="https://tinypng.com/">tinypng</a> 或者 <a href="https://compressjpeg.com/zh/">compress</a> 压缩，清晰度损失很小。</li>
<li>CDN 加速：七牛云的收费性价比很高，可以使用七牛云的对象存储配合 CDN 加速。</li>
</ul>
<h2 id="网站部署">
<a class="header-anchor" href="#%e7%bd%91%e7%ab%99%e9%83%a8%e7%bd%b2"></a>
网站部署
</h2><p>结论先行：我的方案是本地先用 Hugo 生成好静态文件，将静态文件打包到镜像内，然后用 Go 写一个简单的阻塞，编译成二进制文件作为容器启动命令，然后打包成镜像推送到阿里云镜像仓库，然后在服务器用 docker compose 启动一个 Nginx ，通过共享卷的方式访问博客静态页面。</p>
<h3 id="为什么这么做">
<a class="header-anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%99%e4%b9%88%e5%81%9a"></a>
为什么这么做？
</h3><p><strong>为什么本地生成静态文件？</strong></p>
<ol>
<li>国内网络问题镜像下载缓慢</li>
<li>容器内生成，需要 Go 和 Hugo ，Go 依赖下载缓慢</li>
<li>带 Go 和 Hugo 的镜像太大</li>
</ol>
<p><strong>为什么不把博客打包成 Nginx？</strong></p>
<ol>
<li>本身希望服务器上的 Nginx 只是作为 Gateway，不要跟博客打包在一起，也正是这个原因用到了共享卷，为了让 Nginx 容器能访问到博客静态文件，共享卷有缓存问题，记得每次启动的时候清下卷。</li>
<li>希望服务器上只有一个 Nginx，其他的 Pod 只做基础服务。</li>
</ol>
<p><strong>为什么需要构建 Go 的二进制执行文件？</strong></p>
<ul>
<li>Docker 规定 Pod 容器要能提供服务，纯静态文件没有命令是无法启动的，所以我用了个小技巧，写了个 Go 的阻塞当做启动命令。</li>
</ul>
<h3 id="部署文件">
<a class="header-anchor" href="#%e9%83%a8%e7%bd%b2%e6%96%87%e4%bb%b6"></a>
部署文件
</h3><p><strong>dockerfile</strong></p>
        
        <hr><p>Published on 2020-09-25 at <a href='https://allens.tech/'>Allens' Blog</a>, last modified on 2020-09-25</p>]]></description><category>服务器</category></item></channel></rss>