<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>icyway的博客</title>
    <description>lalalalala的博客
</description>
    <link>http://icyway.github.io/</link>
    <atom:link href="http://icyway.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 19 Jul 2017 08:53:37 +0000</pubDate>
    <lastBuildDate>Wed, 19 Jul 2017 08:53:37 +0000</lastBuildDate>
    <generator>Jekyll v3.4.5</generator>
    
      <item>
        <title>nginx之实时打印日志到kafka（二）</title>
        <description>&lt;h2 id=&quot;编译安装nginx&quot;&gt;编译安装nginx&lt;/h2&gt;

&lt;p&gt;涉及的包软件及其下载地址：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://nginx.org/&quot;&gt;nginx-1.10.3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://luajit.org/download.html&quot;&gt;LuaJIT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/openresty/lua-nginx-module&quot;&gt;lua-nginx-module&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/simpl/ngx_devel_kit&quot;&gt;ngx_devel_kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/doujiang24/lua-resty-kafka&quot;&gt;lua-resty-kafka&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mpx/lua-cjson&quot;&gt;lua-cjson&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;安装luajit&quot;&gt;安装LuaJIT&lt;/h4&gt;
&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;LuaJIT
make &lt;span class=&quot;nv&quot;&gt;PREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/LuaJIT
make install &lt;span class=&quot;nv&quot;&gt;PREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/LuaJIT
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/usr/local/LuaJIT/lib&quot;&lt;/span&gt; &amp;gt; /etc/ld.so.conf.d/usr_local_luajit_lib.conf
ldconfig
&lt;span class=&quot;c&quot;&gt;#注意环境变量!&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LUAJIT_LIB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/LuaJIT/lib
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LUAJIT_INC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/LuaJIT/include/luajit-2.0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;把export的内容追加到 /etc/profile 也可以&lt;/p&gt;

&lt;h4 id=&quot;解压lua-nginx-module&quot;&gt;解压lua-nginx-module&lt;/h4&gt;

&lt;h4 id=&quot;解压ngx_devel_kit&quot;&gt;解压ngx_devel_kit&lt;/h4&gt;

&lt;h4 id=&quot;安装nginx&quot;&gt;安装nginx&lt;/h4&gt;

&lt;p&gt;编译内容：&lt;/p&gt;
&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;--prefix&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/nginx/ --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/tmp/ngx_log_if-master --add-module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/lua-nginx-module --add-module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/ngx_devel_kit --user&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx --group&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;dynamic --with-http_image_filter_module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;dynamic --with-http_geoip_module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;dynamic --with-mail&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;dynamic --with-stream_ssl_module --with-debug --with-cc-opt&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'&lt;/span&gt; --with-ld-opt&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;' -Wl,-E'&lt;/span&gt; --with-pcre&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/tmp/pcre-8.40
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;导入lua-cjson模块&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd lua-cjson
make
make install
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;注意&lt;/em&gt;：这里很容易报错，原因就是找不到正确的luajit路径，解决方法：&lt;code class=&quot;highlighter-rouge&quot;&gt;vim Makefile&lt;/code&gt;,更改&lt;code class=&quot;highlighter-rouge&quot;&gt;PREFIX&lt;/code&gt;及其下面的路径即可。&lt;/p&gt;

&lt;p&gt;到此安装基本完成，剩下的就是写nginx的配置文件。提供一下我个人测试用的，如下：&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;lua_package_path &quot;/usr/local/nginx/lualib/kafka/?.lua;;&quot;;
    lua_shared_dict   config 1m;

    include /etc/nginx/conf.d/*.conf;

    server {
	listen       80;
	server_name  192.168.20.66;

	access_log  /var/log/nginx/edu.wps.cn.access.log  main;
        location /lua {
                default_type text/plain;
                content_by_lua 'ngx.say(&quot;hello world&quot;)';
		log_by_lua '
		local cjson = require &quot;cjson&quot;  
		local client = require &quot;resty.kafka.client&quot;
                local producer = require &quot;resty.kafka.producer&quot;
		local broker_list = {  
                { host = &quot;kafka-ip&quot;, port = 9092 },
                }
		local log_json = {}  
                log_json[&quot;uri&quot;]=ngx.var.uri  
                log_json[&quot;args&quot;]=ngx.var.args  
                log_json[&quot;host&quot;]=ngx.var.host  
                log_json[&quot;request_body&quot;]=ngx.var.request_body  
                log_json[&quot;remote_addr&quot;] = ngx.var.remote_addr  
                log_json[&quot;remote_user&quot;] = ngx.var.remote_user  
                log_json[&quot;time_local&quot;] = ngx.var.time_local  
                log_json[&quot;status&quot;] = ngx.var.status  
                log_json[&quot;body_bytes_sent&quot;] = ngx.var.body_bytes_sent  
                log_json[&quot;http_referer&quot;] = ngx.var.http_referer  
                log_json[&quot;http_user_agent&quot;] = ngx.var.http_user_agent  
                log_json[&quot;http_x_forwarded_for&quot;] = ngx.var.http_x_forwarded_for  
                log_json[&quot;upstream_response_time&quot;] = ngx.var.upstream_response_time  
                log_json[&quot;request_time&quot;] = ngx.var.request_time
		local message = cjson.encode(log_json);
		local bp = producer:new(broker_list, { producer_type = &quot;async&quot; })
		local ok, err = bp:send(&quot;test1&quot;, nil, message)

		if not ok then  
                	ngx.log(ngx.ERR, &quot;kafka send err:&quot;, err)  
                	return  
            	end  
        	';
        }


    }
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;还有，nginx.conf的error_log 开到info级别，这样lua模块报的错误都可以在error.log中看到，对解决问题很有帮助。&lt;/p&gt;

&lt;h4 id=&quot;lua-resty-kafka&quot;&gt;lua-resty-kafka&lt;/h4&gt;
&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;cp -rf /tmp/lua-resty-kafka-master/lib/resty /usr/local/nginx/lualib/kafka/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这样就会向kafka里面打进去一个json字符串。&lt;/p&gt;

&lt;p&gt;在kafka那里起一个consumer接收如下：
&lt;img src=&quot;/assets/img/kafka01.png&quot; alt=&quot;result-kafka&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;

&lt;p&gt;因为之前没用过kafka，对于nginx嵌入lua的应用也比较少，此次遇到了很多的坑。差不多用了三天 才把这套系统弄完。总之，相信自己，不懂的就去学，不会的就去查，在一次次填坑中进步是最快的。&lt;/p&gt;
</description>
        <pubDate>Mon, 17 Jul 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/07/17/nginx-lua-kafka2.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/07/17/nginx-lua-kafka2.html</guid>
        
        
        <category>运维</category>
        
      </item>
    
      <item>
        <title>nginx之实时打印日志到kafka（一）</title>
        <description>&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;
&lt;p&gt;老板和产品给开发提出需求，为优化产品服务，需要对web日志进行分析，做一些可视化、饼状、柱状的东西。
初步方案是：利用nginx的lua模块，将日志 实时打进kafka集群，开发把kafka里面的队列数据取出来，进行分析展示。&lt;/p&gt;

&lt;p&gt;nginx+lua+kafka是我负责搭建配置调试。&lt;/p&gt;

&lt;p&gt;我在网上看了看，不晓得为什么很少人这么做，所以导致这样的有效成功案例特别少，借鉴的地方不是很多，只能自己试着去做。&lt;/p&gt;

&lt;h2 id=&quot;kafka安装调试&quot;&gt;kafka安装调试&lt;/h2&gt;
&lt;p&gt;之前没用过kafka，这次填了不少坑。反正是测试环境，为了尽快理清逻辑实现功能，建议此处用单点kafka和单点zookeeper。
kafka&lt;a href=&quot;http://kafka.apache.org/downloads.html&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;kafka是需要jdk（jre）环境的，此处我安装的是openjdk1.8
解压tgz文件之后不需要编译安装，只需要把目录移动到工作目录，改一下目录名字就可以，在运行服务之前改一下配置文件。&lt;/p&gt;

&lt;p&gt;1、vim /data/kafka/config/server.properties&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;broker.id=1&lt;/code&gt;此处是kafka集群中，标识不同节点的id&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;listeners=PLAINTEXT://ip:9092&lt;/code&gt;此处要写本机ip&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;zookeeper.connect=localhost:2181&lt;/code&gt;指定kafka受哪些zk调度，多个用’ , ‘隔开。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注：&lt;/em&gt; 也可以再加上host.name  port&lt;/p&gt;

&lt;p&gt;2、vim /data/kafka/config/zookeeper.properties&lt;/p&gt;

&lt;p&gt;因为kafka默认受zk调度，下载的包中自带 精简zookeeper，此配置文件即为zk的配置文件，单点zk不需要改什么配置，若是集群则需要在配置文件中指定所有集群节点和端口。&lt;/p&gt;

&lt;p&gt;3、首先 开启zookeeper服务&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;/data/kafka/bin/zookeeper-server-start.sh /data/kafka/config/zookeeper.properties&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4、开启 kafka服务&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt; /data/kafka/bin/kafka-server-start.sh /data/kafka/config/server.properties&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;5、测试kafka功能
创建topic&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注&lt;/em&gt;： localhost 或者本机ip，后同&lt;/p&gt;

&lt;p&gt;查看topic&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bin/kafka-topics.sh --list --zookeeper localhost:2181&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;发送消息&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;另起终端，启动consumer&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test1 --from-beginning&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;接受发送消息，可以在nginx或者另外的节点测试。&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Jul 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/07/14/nginx-lua-kafka1.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/07/14/nginx-lua-kafka1.html</guid>
        
        
        <category>运维</category>
        
      </item>
    
      <item>
        <title>Ubuntu阿里源</title>
        <description>&lt;h2 id=&quot;ubuntu版本名称&quot;&gt;Ubuntu版本名称&lt;/h2&gt;

&lt;p&gt;一开始的时候，我就想只记录一下Ubuntu的阿里源。提笔之时，突然发现有必要做一些linux版本
常识的说明。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;linux&lt;/strong&gt;一般有两种版本，一个是核心（kernel)版，一个是发行(distribution)版。核心版的序号由三部分数字构成，其形式为：&lt;/p&gt;

&lt;p&gt;major.minor.patchlevel&lt;/p&gt;

&lt;p&gt;其中，majoro为主版本号，minor为次版本号，二者共同构成了当前核心版本号。patchlevel表示对当前版本的修订次数。例如，2.2.11表示对核心作用2.2 版本的第11次修订。根据约定，次版本号为奇数时，表示该版本加入新内容，但不一定稳定，相当于测试版；次版本号为偶数时，表示这是一个可以使用的稳定版本。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;linux的内核&lt;/strong&gt;具有两种不同的版本号，实验版本（开发版）和产品化版本（稳定版）。要确定linux版本的类型，只要查看一下版本号：每一个版本号由三位数字组成。第一位数是发布的内核主版本。第二位偶数表示稳固版本；奇数表示开发中版本。第三位是错误修补的次数。&lt;/p&gt;

&lt;p&gt;Ubuntu每一年会发行一个主版本，每两年会发行一LTS（Long Term Support）版本。个人而言，比较喜欢用主版本是偶数的版本，如：12.04/14.04/16.04。&lt;/p&gt;

&lt;p&gt;有意思的是ubuntu每个版本都有它的开发代号，开发代号有三个热点：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;都是动物&lt;/li&gt;
  &lt;li&gt;都是两个词，并且两个词的首字母相同&lt;/li&gt;
  &lt;li&gt;从6.06开始，首字母从D开始递增&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如：
ubuntu16.04，它的代号是Xenial Xerus（好客的非洲地松鼠）&lt;/p&gt;

&lt;p&gt;鉴于国内的资源访问，我感觉阿里源的速度还是不错的，&lt;/p&gt;

&lt;p&gt;地址：&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
##测试版源
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# 源码
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
##测试版源
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
# Canonical 合作伙伴和附加
deb http://archive.canonical.com/ubuntu/ xenial partner
deb http://extras.ubuntu.com/ubuntu/ xenial main
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;其实，我爱debian更多一些。&lt;/p&gt;

&lt;p&gt;嘿嘿。。。&lt;/p&gt;
</description>
        <pubDate>Wed, 26 Apr 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/04/26/ubuntu16-resources.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/04/26/ubuntu16-resources.html</guid>
        
        <category>Ubuntu</category>
        
        
        <category>资源</category>
        
      </item>
    
      <item>
        <title>rabbitmq集群要点</title>
        <description>&lt;h2 id=&quot;rabbitmq-简介&quot;&gt;rabbitmq 简介&lt;/h2&gt;
&lt;p&gt;rabbitmq是实现了高级消息队列协议（AMQP）的开源消息代理软件（亦称面向消息的中间件）。
是由Erlang语言编写，mq集群也是基于Erlang分布式、并行运算等特点实现的。它支持多种客户端，如：
python、ruby、php、java等&lt;/p&gt;

&lt;h2 id=&quot;rabbitmq-部件&quot;&gt;rabbitmq 部件&lt;/h2&gt;
&lt;p&gt;不管是开发还是运维，要想很好的使用rabbitmq，必须对它的部件有一个功能性的认识，接下来我就
简单介绍一下：&lt;/p&gt;
&lt;h4 id=&quot;queue&quot;&gt;Queue&lt;/h4&gt;
&lt;p&gt;Queue（队列）是rabbitmq的内部对象，是消息队列载体，用于存储消息。每个消息都可以被投入到一个或多个队列&lt;/p&gt;

&lt;h4 id=&quot;producer&quot;&gt;producer&lt;/h4&gt;
&lt;p&gt;producer：消息生产者，就是投递消息的程序。&lt;/p&gt;

&lt;h4 id=&quot;consumer&quot;&gt;consumer&lt;/h4&gt;
&lt;p&gt;consumer：消息消费者，就是接受消息的程序。&lt;/p&gt;

&lt;h4 id=&quot;exchange&quot;&gt;Exchange&lt;/h4&gt;
&lt;p&gt;Exchange：消息交换机，它指定消息按什么规则，路由到哪个队列。exchange可以将消息路由到一个或多个Queue中（或者丢弃）。&lt;/p&gt;

&lt;h4 id=&quot;broker&quot;&gt;Broker&lt;/h4&gt;
&lt;p&gt;Broker：简单来说就是消息队列服务器实体。&lt;/p&gt;

&lt;h4 id=&quot;vhost&quot;&gt;vhost&lt;/h4&gt;
&lt;p&gt;虚拟主机，一个broker里可以开设多个vhost，用作不同用户的权限分离。&lt;/p&gt;

&lt;h4 id=&quot;binding&quot;&gt;Binding&lt;/h4&gt;
&lt;p&gt;RabbitMQ中通过Binding将Exchange与Queue关联起来，这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。&lt;/p&gt;

&lt;h4 id=&quot;binding-key&quot;&gt;Binding key&lt;/h4&gt;
&lt;p&gt;在绑定（Binding）Exchange与Queue的同时，一般会指定一个binding key；消费者将消息发送给Exchange时，一般会指定一个routing key；当binding key与routing key相匹配时，消息将会被路由到对应的Queue中。&lt;/p&gt;

&lt;p&gt;binding key 不是所有情况都有效，依赖于Exchange Type&lt;/p&gt;

&lt;h4 id=&quot;exchange-types&quot;&gt;Exchange Types&lt;/h4&gt;
&lt;p&gt;RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种（&lt;a href=&quot;http://www.amqp.org/specification/0-10/amqp-org-download&quot;&gt;AMQP规范&lt;/a&gt;里还提到两种Exchange Type，分别为system与自定义，这里不予以描述）&lt;/p&gt;

&lt;h4 id=&quot;routing-key&quot;&gt;Routing Key&lt;/h4&gt;
&lt;p&gt;路由关键字，exchange根据这个关键字进行消息投递。&lt;/p&gt;

&lt;h4 id=&quot;channel&quot;&gt;channel&lt;/h4&gt;
&lt;p&gt;消息通道，在客户端的每个连接里，可建立多个channel，每个channel代表一个会话任务。&lt;/p&gt;

&lt;h2 id=&quot;rabbitmq集群&quot;&gt;RabbitMQ集群&lt;/h2&gt;
&lt;p&gt;RabbitMQ可以通过三种方法来部署分布式集群系统，分别是：cluster,federation,shovel&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;h4 id=&quot;cluster&quot;&gt;cluster&lt;/h4&gt;
    &lt;p&gt;不支持跨网段，用于同一个网段内的局域网
可以随意的动态增加或者减少
节点之间需要运行相同版本的RabbitMQ和Erlang&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4 id=&quot;federation&quot;&gt;federation&lt;/h4&gt;
    &lt;p&gt;应用于广域网，允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息，可以是单独机器或集群。federation队列类似于单向点对点连接，消息会在联盟队列之间转发任意次，直到被消费者接受。通常使用federation来连接internet上的中间服务器，用作订阅分发消息或工作队列。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h4 id=&quot;shovel&quot;&gt;shovel&lt;/h4&gt;
    &lt;p&gt;连接方式与federation的连接方式类似，但它工作在更低层次。可以应用于广域网。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;节点类型&quot;&gt;节点类型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;RAM node&lt;/strong&gt;:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中，好处是可以使得像交换机和队列声明等操作更加的快速。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disk node&lt;/strong&gt;:将元数据存储在磁盘中，单节点系统只允许磁盘类型的节点，防止重启RabbitMQ的时候，丢失系统的配置信息。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注&lt;/em&gt;：RabbitMQ要求在集群中至少有一个磁盘节点，所有其他节点可以是内存节点。单点rabbitmq也就必须是磁盘节点。&lt;/p&gt;

&lt;h3 id=&quot;erlang-cookie&quot;&gt;Erlang Cookie&lt;/h3&gt;
&lt;p&gt;Erlang Cookie是保证不同节点可以相互通信的密钥，要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。&lt;/p&gt;

&lt;h2 id=&quot;rabbitmq-常用命令&quot;&gt;rabbitmq 常用命令&lt;/h2&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;查看集群状态信息：rabbitmqctl cluster_status
查看队列：rabbitmqctl list_queues
查看节点信息和状态：rabbitmqctl status
停止/启动应用：rabbitmqctl stop_app
重置应用：rabbitmqctl reset
加入节点：rabbitmqctl join_cluster {rabbit_node_name}
剔除节点：rabbitmqctl forget_cluster_node {rabbit_node_name}
开启插件：rabbitmq-plugins enable {插件名} （插件在$RABBITMQ_HOME/plugins ）
开启web需要：rabbitmq-plugins enable rabbitmq_management
添加用户：rabbitmqctl add_user {username} {password}
设置用户角色：rabbitmqctl set_user_tags {username} {tag}
删除用户：rabbitmqctl delete_user {username}
修改密码：rabbitmqctl change_password {username} {newpassword}
权限设置：rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read} 如：rabbitmqctl set_permissions -p / root &quot;.*&quot; &quot;.*&quot; &quot;.*&quot;
更改节点类型：rabbitmqctl change_cluster_node_type ram/disc（前后需要开关应用）
添加vhost: rabbitmqctl add vhost {name}
删除vhost: rabbitmqctl delete vhost {name}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;还有很多，不过这些已经够平时的工作。&lt;/p&gt;

&lt;h2 id=&quot;rabbitmq集群选择方式&quot;&gt;rabbitmq集群选择方式&lt;/h2&gt;
&lt;p&gt;建议选择haproxy进行负载，比较简单，完全支持4–7层的分发，还可以很好的保持长连接。&lt;/p&gt;

&lt;h2 id=&quot;集群注意事项&quot;&gt;集群注意事项&lt;/h2&gt;
&lt;p&gt;各个节点的erlang+rabbitmq的版本要一致&lt;/p&gt;

&lt;p&gt;erlang的cookie信息很重要&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.rabbitmq.com&quot;&gt;rabbitmq官网&lt;/a&gt;,上面有erlang和mq的下载&lt;/p&gt;

&lt;p&gt;建议rpm包安装erlang&lt;/p&gt;

&lt;p&gt;文章不够详细，却能够把很多要点强调
                            —-随笔&lt;/p&gt;

&lt;p&gt;参考博文：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.cnblogs.com/diegodu/p/4971586.html&quot;&gt;RabbitMQ基础概念详细介绍&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.blogjava.net/qbna350816/archive/2016/08/12/431554.html&quot;&gt;AMQP-0-9-1中文规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 20 Apr 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/04/20/rabbitmq-of-2017.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/04/20/rabbitmq-of-2017.html</guid>
        
        
        <category>运维</category>
        
      </item>
    
      <item>
        <title>jenkins简单流程+原理</title>
        <description>&lt;h2 id=&quot;jenkins简介&quot;&gt;Jenkins简介&lt;/h2&gt;
&lt;p&gt;突然提笔不敢言了，因为持续集成（Continuous Integration）、持续交付（Continuous Delivery）、持续不熟（Continuous Deployment）这一方向挺大的，不夸张的说，在比较传统的大公司，这可以是一个专门的岗位去负责这些事情。&lt;/p&gt;

&lt;p&gt;一般的开发流程包括如下：&lt;/p&gt;

&lt;p&gt;编码 -&amp;gt; 构建 -&amp;gt; 集成 -&amp;gt; 测试 -&amp;gt; 交付 -&amp;gt; 部署&lt;/p&gt;

&lt;p&gt;持续集成的必要性我也就不说了，Jenkins是各种项目的”自动化”编译、打包、分发部署，支持web可视化的工具。&lt;/p&gt;

&lt;p&gt;开源、自动化、插件多、支持多种语言。&lt;/p&gt;

&lt;p&gt;svn、git、maven等&lt;/p&gt;

&lt;p&gt;##Jenkins安装
实现Jenkins安装有两种方法：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jenkins.io/&quot;&gt;官网&lt;/a&gt;下载JAR包，直接运行&lt;code class=&quot;highlighter-rouge&quot;&gt;java -jar jenkins.jar&lt;/code&gt;即可&lt;/li&gt;
  &lt;li&gt;把包放到tomcat运行&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;具体的我就不啰嗦了，也很方便搜到。&lt;/p&gt;

&lt;h2 id=&quot;jenkins构建项目&quot;&gt;Jenkins构建项目&lt;/h2&gt;

&lt;p&gt;对我来说，一开始不了解Jenkins的工作流程，什么都是一步到位的，于是我就自己把构建过程一步一步分解，在web配置完，然后去后端查看变化。&lt;/p&gt;

&lt;p&gt;1、我选择的是使用Jenkins自由风格的构建方式，然后在GitHub project选择github地址，其他的什么都不动。去后端就可以看到Jenkins把git项目拉到了工作空间（workspace）中。&lt;/p&gt;

&lt;p&gt;2、因为我们的项目都是托管在gitlab中，我在&lt;em&gt;源码管理&lt;/em&gt;下面选择gitlab来源，然后配置用户、密码等。可以把项目下载到workspace中。&lt;/p&gt;

&lt;p&gt;3、在&lt;em&gt;构建&lt;/em&gt;这里，选择&lt;em&gt;execute shell&lt;/em&gt;，这里是比较重要的地方，持续构建、部署分发等都是在这里完成。我就简单的写了&lt;code class=&quot;highlighter-rouge&quot;&gt;cd ${WORKSPACE}/&lt;/code&gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;echo 123 &amp;gt; 123.txt&lt;/code&gt;;构建后就能看到在空间目录下有123.txt文件，在这里要学一下maven，使用mvn命令进行构建、打包等操作。&lt;/p&gt;

&lt;h2 id=&quot;maven介绍&quot;&gt;maven介绍&lt;/h2&gt;

&lt;p&gt;Maven 是一套软件工程管理和整合工具，可以进行构建、打包、解决依赖库等，我也不是很熟，详情给大家一个&lt;a href=&quot;http://wiki.jikexueyuan.com/project/maven/&quot;&gt;maven连接&lt;/a&gt;，一起学习。&lt;/p&gt;

&lt;p&gt;在此，大家还需要了解一下war、jar包，怎么运行等知识。反正我也不会java，很多知识还是需要学习的。。。&lt;/p&gt;
</description>
        <pubDate>Mon, 10 Apr 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/04/10/jenkins-of-2017.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/04/10/jenkins-of-2017.html</guid>
        
        
        <category>运维</category>
        
      </item>
    
      <item>
        <title>lua之运算符</title>
        <description>&lt;h2 id=&quot;lua运算符&quot;&gt;lua运算符&lt;/h2&gt;
&lt;h4 id=&quot;算术运算符&quot;&gt;算术运算符&lt;/h4&gt;
&lt;p&gt;+，-，*（乘），/（除），%（取余），^(乘幂)，-（负号）&lt;/p&gt;

&lt;h4 id=&quot;关系运算符&quot;&gt;关系运算符&lt;/h4&gt;
&lt;p&gt;==（等于），~=（不等于），&amp;gt;，&amp;lt;，&amp;gt;=，&amp;lt;=&lt;/p&gt;

&lt;h4 id=&quot;逻辑运算符&quot;&gt;逻辑运算符&lt;/h4&gt;
&lt;p&gt;and，or，not&lt;/p&gt;

&lt;h4 id=&quot;其它运算符&quot;&gt;其它运算符&lt;/h4&gt;
&lt;p&gt;..（连接符），#（一元运算符，返回字符串或表的长度）&lt;/p&gt;

&lt;h2 id=&quot;运算符优先级&quot;&gt;运算符优先级&lt;/h2&gt;

&lt;p&gt;not    - (unary)&lt;/p&gt;

&lt;p&gt;*      /&lt;/p&gt;

&lt;p&gt;+      -&lt;/p&gt;

&lt;p&gt;..&lt;/p&gt;

&lt;p&gt;&amp;lt;      &amp;gt;      &amp;lt;=     &amp;gt;=     ~=     ==&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;注：除了^和..外所有的二元运算符都是左连接的。
    &lt;h4 id=&quot;示例&quot;&gt;示例&lt;/h4&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;运算内容&lt;/th&gt;
      &lt;th&gt;等同&lt;/th&gt;
      &lt;th&gt;解释后&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;a+i &amp;lt; b/2+1&lt;/td&gt;
      &lt;td&gt;&amp;lt;–&amp;gt;&lt;/td&gt;
      &lt;td&gt;(a+i) &amp;lt; ((b/2)+1)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5+x^2*8&lt;/td&gt;
      &lt;td&gt;&amp;lt;–&amp;gt;&lt;/td&gt;
      &lt;td&gt;5+((x^2)*8)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;a &amp;lt; y and y &amp;lt;= z&lt;/td&gt;
      &lt;td&gt;&amp;lt;–&amp;gt;&lt;/td&gt;
      &lt;td&gt;(a &amp;lt; y) and (y &amp;lt;= z)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;-x^2&lt;/td&gt;
      &lt;td&gt;&amp;lt;–&amp;gt;&lt;/td&gt;
      &lt;td&gt;-(x^2)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;x^y^z&lt;/td&gt;
      &lt;td&gt;&amp;lt;–&amp;gt;&lt;/td&gt;
      &lt;td&gt;x^(y^z)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        <pubDate>Thu, 02 Mar 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/03/02/lua-operator-2017.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/03/02/lua-operator-2017.html</guid>
        
        
        <category>开发</category>
        
      </item>
    
      <item>
        <title>Docker 使用总结</title>
        <description>&lt;h2 id=&quot;docker-基本概念&quot;&gt;Docker 基本概念&lt;/h2&gt;

&lt;h3 id=&quot;镜像-image&quot;&gt;镜像 Image&lt;/h3&gt;

&lt;p&gt;镜像是一些打包好的已有的环境，可以被用来启动和创建容器，本身不能被直接修改。&lt;/p&gt;

&lt;h3 id=&quot;容器-container&quot;&gt;容器 Container&lt;/h3&gt;

&lt;p&gt;容器是镜像的实例化，是可以修改的，但是都是临时修改。&lt;/p&gt;

&lt;h3 id=&quot;容器启动过程&quot;&gt;容器启动过程&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;检查本地是否存在指定的镜像，不存在就从公有仓库下载&lt;/li&gt;
  &lt;li&gt;利用镜像创建并启动一个容器&lt;/li&gt;
  &lt;li&gt;分配一个文件系统，并在只读的镜像层外面挂载一层可读写层&lt;/li&gt;
  &lt;li&gt;从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去&lt;/li&gt;
  &lt;li&gt;从地址池配置一个 ip 地址给容器&lt;/li&gt;
  &lt;li&gt;执行用户指定的应用程序&lt;/li&gt;
  &lt;li&gt;执行完毕后容器被终止&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;docker-常用命令&quot;&gt;Docker 常用命令&lt;/h2&gt;

&lt;h3 id=&quot;image-操作&quot;&gt;Image 操作&lt;/h3&gt;

&lt;h4 id=&quot;基本操作&quot;&gt;基本操作&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;显示本地所有镜像&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;搜索一个image&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker search image_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;下载image&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker pull image_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;删除镜像&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rmi image_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;显示镜像历史&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker history image_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;制作镜像&quot;&gt;制作镜像&lt;/h4&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker build -t image_name DockerfilePath
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;这里DockerfilePath是Context上下文目录，在创建的时候会全部上传到Docker Server端，所以这个目录不要太大&lt;/p&gt;

&lt;h4 id=&quot;迁移镜像&quot;&gt;迁移镜像&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;保存镜像到文件&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker save image_name -o file.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;加载一个tar包的镜像&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker load -i file.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;container-操作&quot;&gt;Container 操作&lt;/h3&gt;

&lt;h4 id=&quot;显示相关&quot;&gt;显示相关&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;查看运行中的容器&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker ps

# 一行显示全部容器
docker ps | less -S

# 最近一次启动
docker ps -l

# 列出所有容器
docker ps -a
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;显示一个运行的容器里面的进程信息&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker top cid
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;显示容器详细信息&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker inspect cid
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;查看容器日志&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker logs cid

# 实时查看日志输出
docker logs -f cid
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;查看容器更改&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker diff cid
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;查看容器root用户密码&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker logs cid 2&amp;gt;&amp;amp;1 | grep '^User: ' | tail -n1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;运行相关&quot;&gt;运行相关&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;启动容器并执行一个命令（交互）&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# -t 终端
# -i 交互操作
docker run -it ubuntu /bin/bash

# 运行一个hello word然后就自动关闭
docker run image_name echo &quot;hello word&quot;

# 命名并启动容器
docker run --name test ubuntu

# 后台运行一个容器
docker run -d -it ubuntu

# 映射端口
docker run -p 8080:8080 ubuntu

# 挂载volumn
docker run -v ./test:/var/www

# container 内 root 拥有真正root权限
docker run --privileged=false

# 启动完镜像后自动删除
docker run -it --rm ubuntu bash
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;附着到正在运行的容器, 附着完以后退出会导致容器也终止&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker attach cid
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;进入正在运行的 container 并且执行&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker exec -it 839a6cfc9496 /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;在容器中运行一段程序&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run ubuntu apt-get update
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;拷贝文件出来&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker cp cid:/container_path to_path  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;修改容器&quot;&gt;修改容器&lt;/h4&gt;

&lt;p&gt;image相当于类，container相当于实例，不过可以动态给实例安装新软件，然后把这个container用commit命令固化成一个image&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;提交一个commit&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker commit cid new_image_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;删除容器&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rm cid

# 强制删除
docker rm -f cid

# 删除所有容器
docker rm `docker ps -a -q`
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;状态修改&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker start/stop/kill/restart cid
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;更改名字&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker rename old new
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h4 id=&quot;链接容器&quot;&gt;链接容器&lt;/h4&gt;

&lt;p&gt;sonar容器连接到mysql容器，并将mysql容器重命名为db。这样，sonar容器就可以使用db的相关的环境变量了。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run -it --name sonar -d -link mysql:db tpires/sonar-server
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;仓库操作&quot;&gt;仓库操作&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;登录到docker仓库&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker login
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;上传镜像&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker push new_image_name
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;dockerfile-常用命令&quot;&gt;Dockerfile 常用命令&lt;/h2&gt;

&lt;p&gt;有了 Dockerfile 可以自定义一些自己需要的镜像，在熟悉了 Docker 基本操作，然后使用过一些别人提供好的镜像以后，难免需要自己修改一部分。&lt;/p&gt;

&lt;h3 id=&quot;from&quot;&gt;FROM&lt;/h3&gt;

&lt;p&gt;指定基础镜像。例如：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ubuntu&lt;/li&gt;
  &lt;li&gt;nginx&lt;/li&gt;
  &lt;li&gt;redis&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;run&quot;&gt;RUN&lt;/h3&gt;

&lt;p&gt;执行一些命令&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;RUN echo '&amp;lt;h1&amp;gt;Hello, Docker!&amp;lt;/h1&amp;gt;' &amp;gt; /usr/share/nginx/html/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;每个RUN命令都会在容器中建立一层，所以尽量合并多个命令。例如&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;RUN buildDeps='gcc libc6-dev make' \
    &amp;amp;&amp;amp; apt-get update \
    &amp;amp;&amp;amp; apt-get install -y $buildDeps \
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;copy&quot;&gt;COPY&lt;/h3&gt;

&lt;p&gt;复制文件到指定目录 source -&amp;gt; target&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;COPY ./package.json /usr/src/app
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;cmd&quot;&gt;CMD&lt;/h3&gt;

&lt;p&gt;容器的启动命令&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CMD [&quot;nginx&quot;, &quot;-g&quot;, &quot;daemon off;&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;这个命令可以在启动时被覆盖。另外它也可以为 ENTRYPOINT 提供参数。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;CMD 理论上只能执行一次，如果想要执行两个命令，需要使用 &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;amp;&lt;/code&gt; 来连接两个命令，或者使用一个bash文件。更为高级一点的方法是用supervisor来管理&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;entrypoint&quot;&gt;ENTRYPOINT&lt;/h3&gt;

&lt;p&gt;ENTRYPOINT 和 CMD 有一部分重复工作，但是 ENTRYPOINT 可以让容器像软件一样执行。例如&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ENTRYPOINT /bin/echo
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;在容器启动时，之后增加的内容都属于这个命令的参数。&lt;/p&gt;

&lt;h3 id=&quot;env&quot;&gt;ENV&lt;/h3&gt;

&lt;p&gt;设置环境变量。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ENV key value&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;arg&quot;&gt;ARG&lt;/h3&gt;

&lt;p&gt;构建参数，在容器启动后不会存在。&lt;/p&gt;

&lt;h3 id=&quot;volume&quot;&gt;VOLUME&lt;/h3&gt;

&lt;p&gt;定义匿名卷，以免用户忘了挂载volumn，导致大量写入。这个 Volume 在容器启动前可以添加内容，但是并不是实际操作用户挂载的内容。在用户挂载完 volume 后，原来写在这里的内容会被复制到用户挂载的目录。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;注意：在 VOLUME 命令之后对这个目录的所有操作，将被忽略。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;expose&quot;&gt;EXPOSE&lt;/h3&gt;

&lt;p&gt;申明端口，可以用来默认映射端口，以及容器间互通。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;EXPOSE 22 80
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;workdir&quot;&gt;WORKDIR&lt;/h3&gt;

&lt;p&gt;指定工作目录。不仅是当前 docker 中的目录，同时也是运行容器时刚刚登录以后的目录。&lt;/p&gt;

&lt;h3 id=&quot;user&quot;&gt;USER&lt;/h3&gt;

&lt;p&gt;指定当前用户。&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;RUN groupadd -r redis &amp;amp;&amp;amp; useradd -r -g redis redis
USER redis
RUN [ &quot;redis-server&quot; ]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;healthcheck&quot;&gt;HEALTHCHECK&lt;/h3&gt;

&lt;p&gt;健康检查&lt;/p&gt;

&lt;h3 id=&quot;onbuild&quot;&gt;ONBUILD&lt;/h3&gt;

&lt;p&gt;当此容器作为别的容器的基础容器时操作内容&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM node:slim
RUN &quot;mkdir /app&quot;
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ &quot;npm&quot;, &quot;install&quot; ]
ONBUILD COPY . /app/
CMD [ &quot;npm&quot;, &quot;start&quot; ]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;docker-compose-常用指令&quot;&gt;Docker-compose 常用指令&lt;/h2&gt;

&lt;h3 id=&quot;depends_on&quot;&gt;depends_on&lt;/h3&gt;

&lt;p&gt;这个不仅可以保证build的先后顺序，还可以省去links的设置&lt;/p&gt;

&lt;h3 id=&quot;links&quot;&gt;links&lt;/h3&gt;

&lt;p&gt;和docker run命令一致，主要原因是在每次新开启container的时候，port可能会变，所以有了这个设置可以保证每次都可以绑定到正确的值。&lt;/p&gt;

&lt;h2 id=&quot;实例操作&quot;&gt;实例操作&lt;/h2&gt;

&lt;h3 id=&quot;创建一个lamp的项目&quot;&gt;创建一个LAMP的项目&lt;/h3&gt;

&lt;p&gt;首先是目录结构&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;├── README.md
├── apache
│   └── virtualhost.conf
├── docker-compose.yml
├── mysql
│   ├── Dockerfile
│   └── my.cnf
├── php
│   ├── Dockerfile
│   └── php.ini
└── src
    └── index.php
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;创建 docker-compose.yml&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;2'&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mysql&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;3306:3306&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;password&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;phpdata&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;MYSQL_USER&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;user&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;password&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dbdata:/var/lib/mysql&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;php&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./php&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;8080:80'&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./src:/var/www/html&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./apache:/etc/apache2/sites-enabled/&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mysql&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;phpmyadmin&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;phpmyadmin/phpmyadmin&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;8081:80'&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;links&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mysql:db&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;PMA_USER&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;PMA_PASSWORD&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;password&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;adminsessions:/sessions&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;mysql&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;php&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;dbdata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;adminsessions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;问题记录&quot;&gt;问题记录&lt;/h2&gt;

&lt;h3 id=&quot;mysql-挂载-volume-后启动时显示无权限&quot;&gt;Mysql 挂载 volume 后启动时显示无权限&lt;/h3&gt;

&lt;p&gt;设置mysql的启动模式 &lt;code class=&quot;highlighter-rouge&quot;&gt;privileged:true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;另外这个问题一般不会发生，我之前遇到主要原因是我把多个 volume 都映射到了一个上面，导致目录内部读写发生冲突。&lt;/p&gt;

</description>
        <pubDate>Tue, 21 Feb 2017 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2017/02/21/docker-summary.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2017/02/21/docker-summary.html</guid>
        
        <category>Docker</category>
        
        
        <category>工具</category>
        
      </item>
    
      <item>
        <title>zabbix之微信报警</title>
        <description>&lt;h2 id=&quot;微信报警流程&quot;&gt;微信报警流程&lt;/h2&gt;
&lt;p&gt;正常的搭建微信报警流程大致分为：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;申请注册企业公众号（https://qy.weixin.qq.com/）&lt;/li&gt;
  &lt;li&gt;公众号管理配置（各种应用、权限、部门、人员等）&lt;/li&gt;
  &lt;li&gt;查看微信接口并调试&lt;/li&gt;
  &lt;li&gt;编写zabbix微信报警脚本&lt;/li&gt;
  &lt;li&gt;zabbix web配置&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一般情况下，第一步就把很多人打退了，注册企业号需要营业执照，技术人员很难有营业执照的电子照。那么今天我来帮大家解决这个问题，直接pass掉前三步。&lt;/p&gt;

&lt;h2 id=&quot;zabbix微信报警&quot;&gt;zabbix微信报警&lt;/h2&gt;

&lt;h4 id=&quot;1首先你要有个github账号&quot;&gt;1、首先你要有个github账号&lt;/h4&gt;
&lt;p&gt;什么？你没有，那么还是算了吧，洗洗睡吧。&lt;/p&gt;
&lt;h4 id=&quot;2登录httpscftqqcom-使用github账号登录认证一下&quot;&gt;2、登录http://sc.ftqq.com ，使用github账号登录认证一下&lt;/h4&gt;
&lt;h4 id=&quot;3根据页面提示点击微信推送你会得到一串很长的数字&quot;&gt;3、根据页面提示，点击“微信推送”，你会得到一串很长的数字&lt;/h4&gt;
&lt;h4 id=&quot;4绑定微信扫码关注一个方糖公众号&quot;&gt;4、绑定微信，扫码关注一个“方糖”公众号&lt;/h4&gt;
&lt;h4 id=&quot;5根据此page下面的提示测试一下此时你是否可以收到信息&quot;&gt;5、根据此page下面的提示，测试一下，此时，你是否可以收到信息&lt;/h4&gt;
&lt;h4 id=&quot;6若能够收到信息则正常&quot;&gt;6、若能够收到信息，则正常&lt;/h4&gt;

&lt;p&gt;说白了，其实这就是一个web接口，get访问的方式把报警内容发送到你的微信，不单单是报警，每天你可以给自己发送天气预报、开心一笑等提示。&lt;/p&gt;

&lt;h2 id=&quot;zabbix报警脚本&quot;&gt;zabbix报警脚本&lt;/h2&gt;

&lt;p&gt;这个报警脚本很简单的，根据他给的提示，shell两三行就能实现：
curl &lt;em&gt;**&lt;/em&gt;   $1,$2,$3 。&lt;/p&gt;

&lt;p&gt;我自己用的python做的，代码如下：&lt;/p&gt;
&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#-*- coding:utf-8 -*-&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;urllib&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;urllib2&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;weixin_url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://sc.ftqq.com/&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.send&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;alert_data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;alert_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'text'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;alert_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'desp'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;urllib&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;urlencode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alert_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;#change dic to params&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;urllib2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;weixin_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;urllib2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;urlopen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#print response.read()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;提示&lt;/em&gt;：此python脚本chmod加上执行权限&lt;/p&gt;

&lt;h2 id=&quot;zabbix-web设置&quot;&gt;zabbix web设置&lt;/h2&gt;
&lt;p&gt;1、在管理–报警媒介类型，添加微信（确定编写的报警脚本在配置文件指定的目录里），类型是“脚本”，参数是：{ALERT.SENDTO}、{ALERT.SUBJECT}、{ALERT.MESSAGE} 三个&lt;/p&gt;

&lt;p&gt;2、管理–用户–报警媒介那里，添加微信，并且把自己从 “方糖”那里得到的一串数字填进去。&lt;/p&gt;

&lt;p&gt;3、配置–动作–触发器，把自己的报警条件，报警方式，报警频次设置好&lt;/p&gt;

&lt;p&gt;4、测试，自己指定“故障”进行报警，如：swapoff、改变passwd文件等。。。&lt;/p&gt;
</description>
        <pubDate>Tue, 06 Dec 2016 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2016/12/06/weixin-of-2016.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2016/12/06/weixin-of-2016.html</guid>
        
        
        <category>运维</category>
        
      </item>
    
      <item>
        <title>2016阅读书单</title>
        <description>&lt;h2 id=&quot;javascript-dom编程艺术-第2版&quot;&gt;JavaScript DOM编程艺术 （第2版）&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://img3.doubanio.com/lpic/s4677623.jpg&quot; alt=&quot;cover&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://book.douban.com/subject/6038371/&quot;&gt;购买地址&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 29 Sep 2016 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2016/09/29/book-list-of-2016.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2016/09/29/book-list-of-2016.html</guid>
        
        
        <category>读书</category>
        
      </item>
    
      <item>
        <title>VIM快捷键大全</title>
        <description>&lt;h2 id=&quot;vim简单介绍&quot;&gt;VIM简单介绍&lt;/h2&gt;
&lt;p&gt;vim有四种工作模式：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;命令模式(command-mode)&lt;/li&gt;
  &lt;li&gt;插入模式(insert-mode)&lt;/li&gt;
  &lt;li&gt;可视模式(visual-mode)&lt;/li&gt;
  &lt;li&gt;正常模式(normal-mode)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所有的快捷键都是基于这四种工作模式操作的。&lt;/p&gt;

&lt;h2 id=&quot;vim快捷键&quot;&gt;VIM快捷键&lt;/h2&gt;

&lt;p&gt;快捷键组合很多很多，一般情况下记住一些常用的即可。总怕自己总结的不到位，
这里是&lt;a href=&quot;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&quot;&gt;英文版本&lt;/a&gt;的详细介绍，有高清版方便学习。&lt;a href=&quot;http://op6l4yc3y.bkt.clouddn.com/vim-zh.gif&quot;&gt;中文版本&lt;/a&gt;也有。
&lt;img src=&quot;/assets/img/classic.png&quot; alt=&quot;vim-en&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我还搜寻了一个比较新的组合图（高清），&lt;a href=&quot;http://op6l4yc3y.bkt.clouddn.com/advanced.png&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 21 Mar 2016 00:00:00 +0000</pubDate>
        <link>http://icyway.github.io/2016/03/21/VIM-tool.html</link>
        <guid isPermaLink="true">http://icyway.github.io/2016/03/21/VIM-tool.html</guid>
        
        <category>VIM</category>
        
        
        <category>工具</category>
        
      </item>
    
  </channel>
</rss>
