elasticsearch附加参数含义(持续补充)

可选参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
keep_first_letter启用此选项时,例如:刘德华> ldh,默认值:true
keep_separate_first_letter启用该选项时,将保留第一个字母分开,例如:刘德华> l,d,h,默认:假的,注意:查询结果也许是太模糊,由于长期过频
limit_first_letter_length 设置first_letter结果的最大长度,默认值:16
keep_full_pinyin当启用该选项,例如:刘德华> [ liu,de,hua],默认值:true
keep_joined_full_pinyin当启用此选项时,例如:刘德华> [ liudehua],默认值:false
keep_none_chinese 在结果中保留非中文字母或数字,默认值:true
keep_none_chinese_together保持非中国信一起,默认值:true,如:DJ音乐家- > DJ,yin,yue,jia,当设置为false,例如:DJ音乐家- > D,J,yin,yue,jia,注意:keep_none_chinese必须先启动
keep_none_chinese_in_first_letter第一个字母保持非中文字母,例如:刘德华AT2016- > ldhat2016,默认值:true
keep_none_chinese_in_joined_full_pinyin保留非中文字母加入完整拼音,例如:刘德华2016- > liudehua2016,默认:false
none_chinese_pinyin_tokenize打破非中国信成单独的拼音项,如果他们拼音,默认值:true,如:liudehuaalibaba13zhuanghan- > liu,de,hua,a,li,ba,ba,13,zhuang,han,注意:keep_none_chinese和keep_none_chinese_together应首先启用
keep_original 当启用此选项时,也会保留原始输入,默认值:false
lowercase 小写非中文字母,默认值:true
trim_whitespace 默认值:true
remove_duplicated_term当启用此选项时,将删除重复项以保存索引,例如:de的> de,默认值:false,注意:位置相关查询可能受影响

gitlab-runner配置使用

gitlab-runner是和gitlab紧密结合的构建工具,本篇文章使用docker进行构建(docker自己参考百度)

  1. jenkins是很流行的可以和很多其他工具结合的一个构建工具。
  2. gitlab-runner看名字就知道只和gitlab结合。

docker pull镜像速度很慢

  1. 参考 文档

关于gitlab-ci

  1. 网上一搜很多关于安装gitlab-ci和gitlab-runner。
  2. 这里我说下,新版gitlab从8.0以上起,就已经集成了gitlab-ci。不需要额外安装。只需要安装gitlab-runner

docker安装gitlab,最新的版本

  1. docker pull sameersbn/gitlab:latest (官方镜像)

  2. 运行gitlab,443 22端口经常会冲突。这里我替换掉了,个人看情况使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker run --detach \
    --hostname ipxxx.xxx.xx \
    --publish 7043:443 --publish 7070:80 --publish 7022:22 \
    --name gitlabs \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    sameersbn:latest
  3. 更详细参考gitlab配置github

docker安装gitlab-runner

  1. docker pull gitlab/gitlab-runner

  2. 运行gitlab-runner

    1
    2
    3
    4
    docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /srv/gitlab-runner/config:/etc/gitlab-runner \
    gitlab/gitlab-runner:latest
  3. 详细参考docker-gitlab-runner

配置Gitlab Runner

  1. 进入gitlab-runner容器里面

  2. 要在gitlab中添加一个runner,只需要执行:gitlab-runner register 进行注册管道

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    gitlab-runner register

    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
    ## 输入你的gitlab地址 在gitlab项目的设置中查看pipelines中的url。不是项目的url
    Please enter the gitlab-ci token for this runner
    ## gitlab的token(在gitlab的Admin Area中) 或者仓库的token(仓库->设置->Runner)
    Please enter the gitlab-ci description for this runner
    ## Runner描述信息
    Please enter the gitlab-ci tags for this runner (comma separated):
    ## Runner的标签 可以指定仓库 只使用固定标签的Runner构建
    Whether to run untagged builds [true/false]:
    [false]: ## 这里我选择true,意思是是否在打了tag的运行。false是在tag上运行,true提交了就可以使用该管道编译
    Whether to lock Runner to current project [true/false]:
    [false]: ## 是否锁住管道,暂时没弄明白 false 吧
    Please enter the executor: parallels, shell, ssh, virtualbox, docker+machine, docker-ssh+machine, docker, docker-ssh, kubernetes:
    docker ## 这里我们选择shell 先来个简单的
    Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
  3. 上面的图形说明
    运行的记录
    url和token的配置

gitlab-runner配置好了。在要项目的根路径添加.gitlab-ci.yml 才会运行

  1. 简单的运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    before_script:
    - echo "before_script"
    # 定义 stages
    stages:
    - build
    - test
    # 定义 job
    job1:
    stage: test
    script:
    - echo "I am job1"
    - echo "I am in test stage"
    # 定义 job
    job2:
    stage: build
    script:
    - echo "I am job2"
    - echo "I am in build stage"
  2. 项目推上去就可以看到编译的结果打印输入上面的echo

这里我多写的只是如何使用,可以参考概念说明,2者结合能够真正掌握它的意思

gitlab-runner的概念说明

jenkins安装和gitlib hooks配置

jenkins安装

  1. docker pull xxx

jenkins配置gitlibhooks

  1. Jenkins插件安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Jenkins其实没有什么需要特别配置的,由于这次任务中需要利用Jenkins与git,gitlab协作,所以需要安装一些插件。在主面板上点击Manage Jenkins -> Manage Plugins。

    由于公司使用代理连接外网,首先需要为Jenkins插件安装配置proxy。点击Advanced标签即进入proxy设置页面。

    Aailable标签下就是可以安装的插件。

    要让Jenkins可以自动build git repo中的代码,需要安装GIT Client Plugin和GIT Plugin。

    要想Jenkins可以收到Gitlab发来的hook从而自动build,需要安装 Gitlab Hook Plugin。

    要让Jenkins可以在build完成之后根据TAP(test anything protocol)文件生成graph,需要安装 TAP Plugin。
  2. 安装gitlib-hooks地址

  3. 安装gitlib-hooks报错

    jenkins在安装Git hook plugins提示失败:

    OS : CentOS 6.5 64位
    Jenkins : 1.638
    JDK : 1.8.0_66
    Ruby-runtime : 0.13
    问题 : gitlab hook plugin无法安装的原因是因为ruby-runtime无法安装.

    <!--hexoPostRenderEscape:<figure class="highlight plaintext"><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">java.io.IOException: Failed to dynamically deploy this plugin</span><br><span class="line">at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1308)</span><br><span class="line">at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1107)</span><br><span class="line">at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)</span><br><span class="line">at java.util.concurrent.FutureTask.run(Unknown Source)</span><br><span class="line">at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:104)</span><br><span class="line">at java.lang.Thead.run(Unknown Source)</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  4. 解决办法:

    看上去是在下载过程中文件出现了问题. 首先关闭Jenkins.找到jenkins主目录下面的插件目录,我的目录在/home/web/.jenkins/plugins, 删除相关文件gitlab-hook.jpi和ruby-runtime.jpi

    重启jenkins, 试着重新安装.还是无法安装成功,报错信息,应该是下载文件的网络问题:手动下载相关的文件,现在地址在这里, 找到相关的插件,然后选择版本.下载到本地

    进入jenkins的系统设置->插件管理->高级->上传插件,把下载到本地文件的插件上传到jenkins的服务器进行安装.

  5. ruby文件比较大,直接上传可能会抛错,可以直接下载,放到${host}/jenkins/plugins中,然后重启

  6. 还是报错:

    <!--hexoPostRenderEscape:<figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">java.io.IOException: Failed to dynamically deploy this plugin</span><br><span class="line">at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1328)</span><br><span class="line">at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1126)</span><br><span class="line">at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)</span><br><span class="line">at java.util.concurrent.FutureTask.run(FutureTask.java:266)</span><br><span class="line">at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:110)</span><br><span class="line">at java.lang.Thread.run(Thread.java:745)</span><br><span class="line">Caused by: java.io.IOException: Failed to install ruby-runtime plugin</span><br><span class="line">at hudson.PluginManager.dynamicLoad(PluginManager.java:487)</span><br><span class="line">at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1324)</span><br><span class="line">... 5 more</span><br><span class="line">Caused by: java.io.IOException: Failed to initialize</span><br><span class="line">at hudson.ClassicPluginStrategy.load(ClassicPluginStrategy.java:441)</span><br><span class="line">at hudson.PluginManager.dynamicLoad(PluginManager.java:478)</span><br><span class="line">... 6 more</span><br><span class="line">Caused by: java.lang.ClassCircularityError: org/jruby/RubyClass</span><br><span class="line">at java.lang.Class.forName0(Native Method)</span><br><span class="line">at java.lang.Class.forName(Class.java:348)</span><br><span class="line">at org.jenkinsci.bytecode.ClassWriter.loadClass(ClassWriter.java:97)</span><br><span class="line">at org.jenkinsci.bytecode.ClassWriter.getCommonSuperClass(ClassWriter.java:64)</span><br><span class="line">at org.kohsuke.asm5.ClassWriter.getMergedType(ClassWriter.java:1654)</span><br><span class="line">at org.kohsuke.asm5.Frame.merge(Frame.java:1426)</span><br><span class="line">at org.kohsuke.asm5.Frame.merge(Frame.java:1374)</span><br><span class="line">at org.kohsuke.asm5.MethodWriter.visitMaxs(MethodWriter.java:1475)</span><br><span class="line">at org.kohsuke.asm5.tree.MethodNode.accept(MethodNode.java:833)</span><br><span class="line">at org.kohsuke.asm5.commons.JSRInlinerAdapter.visitEnd(JSRInlinerAdapter.java:187)</span><br><span class="line">at org.jenkinsci.bytecode.Transformer$1$1.visitEnd(Transformer.java:107)</span><br><span class="line">at org.kohsuke.asm5.MethodVisitor.visitEnd(MethodVisitor.java:877)</span><br><span class="line">at org.kohsuke.asm5.ClassReader.readMethod(ClassReader.java:1021)</span><br><span class="line">at org.kohsuke.asm5.ClassReader.accept(ClassReader.java:693)</span><br><span class="line">at org.kohsuke.asm5.ClassReader.accept(ClassReader.java:506)</span><br><span class="line">at org.jenkinsci.bytecode.Transformer.transform(Transformer.java:113)</span><br><span class="line">at hudson.ClassicPluginStrategy$AntClassLoader2.defineClassFromData(ClassicPluginStrategy.java:800)</span><br><span class="line">at jenkins.util.AntClassLoader.getClassFromStream(AntClassLoader.java:1310)</span><br><span class="line">at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1366)</span><br><span class="line">at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1326)</span><br><span class="line">at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1079)</span><br><span class="line">at java.lang.ClassLoader.loadClass(ClassLoader.java:357)</span><br><span class="line">at org.jenkinsci.jruby.RubyClassConverter.&lt;init&gt;(RubyClassConverter.java:12)</span><br><span class="line">at org.jenkinsci.jruby.JRubyXStream.register(JRubyXStream.java:25)</span><br><span class="line">at ruby.RubyRuntimePlugin.initRubyXStreams(RubyRuntimePlugin.java:44)</span><br><span class="line">at ruby.RubyRuntimePlugin.start(RubyRuntimePlugin.java:28)</span><br><span class="line">at hudson.ClassicPluginStrategy.startPlugin(ClassicPluginStrategy.java:449)</span><br><span class="line">at hudson.ClassicPluginStrategy.load(ClassicPluginStrategy.java:438)</span><br><span class="line">... 7 more</span><br><span class="line"></span><br><span class="line">网上继续寻找问题,在Jenkins的官网找到一个issue, 描述的就是这个问题. Phellipe Ribeiro最后给出了一个在CentOS的临时解决方案:</span><br><span class="line"></span><br><span class="line">编辑Jenkins的配置文件 /etc/sysconfig/jenkins 的JENKINS_JAVA_OPTIONS</span><br><span class="line"></span><br><span class="line">修改后 : JENKINS_JAVA_OPTIONS=&quot;-Djava.awt.headless=true -Dhudson.ClassicPluginStrategy.noBytecodeTransformer=true&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  7. 如果安装没有问题,或者已经修好了,可以重新gitlib-hooks插件

  8. 在gitLab项目中添加web hook(Project Settings –> WebHooks)

    原文参考地址

    <!--hexoPostRenderEscape:<figure class="highlight plaintext"><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">gitlab的web hook有很多种,可以满足不同的需求,因为我们的需求是push代码的时候触发,所以选的是Push events.</span><br><span class="line"></span><br><span class="line">Url的作用:这个地方填的url是gitlab发请求用的。其实它的原理就是当开发人员在git上的操作触发这个hook时,gitlab就向这个url发一个post请求。请求中带着一堆参数比如提交者是谁,提交的分支是哪个,commit号是多少等等。接受这个请求的那端可以利用这些信息去处理后续的一些事情,比如部署测试通知等等。</span><br><span class="line"></span><br><span class="line">此处,由于我们在jenkins上安装了gitlab hook插件,所以我们只需要按照它的使用方法在url里填上以下链接即可:</span><br><span class="line"></span><br><span class="line">http://your-jenkins-server/gitlab/notify_commit</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->
  9. 在jenkins里需要自动触发的job里的“源码管理”部分添加设置,如下图。填好git仓库url和需要检测的分支名称

mongo操作

mongodb使用总结

【grom】非内嵌类使用many-to-one or one-to-one等问题

1
若非内嵌类,则不能使用类似belongsTo = [xx:XX] 或者 hasOne = [xx:XX] 或者 XX xx等的关联方式,需要指定使用String xxId

【grom】非内嵌类使用one-to-many等问题

1
2
若非内嵌类,则不能使用类似List<XX> xxs的关联方式,否则虽不会报错,
但是却不能正常保存(保存的都为null);然而可以使用hasMany = [xxs: XX]的方式

【grom】数组查询

1
2
3
4
5
6
7
8
9
10
11
12
13
假设Cart中有List<String> strIds;则可以针对数组进行各式查询:
* 精确查询 -- (包括数组的顺序) -- 查询出strIds为["a0","a1","a2"]的数据
def cartList = Cart.createCriteria().list {
eq("strIds", ["a0","a1","a2"])
}
* 模糊查询 -- 数组包含即可 -- 查询出所有strIds中包含a8的数据
def cartList = Cart.createCriteria().list {
eq("strIds", "a8")
}
* 下标查询 -- 查询出所有strIds中下标8的值为a8的数据
def cartList = Cart.createCriteria().list {
eq("strIds.8", "a8")
}

mongo CRUD

导出

1
2
导出使用mongodump命令。mongodump --help查看命令的帮助。可以批量导出数据库表
* [地址](http://docs.mongodb.org/manual/reference/program/mongodump/)

导入

1
导入备份 mongorestore命令。该命令可以导入一个文件夹下所有集合。mongoimport只能导入单个json

添加用户

1
2
3
4
5
6
7
8
use test
db.createUser(
{
user:"user123",
pwd:"12345678",
roles:[ "readWrite", { role:"changeOwnPasswordCustomDataRole", db:"admin" } ]
}
)
* [地址](http://docs.mongodb.org/manual/tutorial/change-own-password-and-custom-data/)

修改用户

1
2
3
4
5
6
7
8
use test
db.updateUser(
"user123",
{
pwd: "KNlZmiaNUp0B",
customData: { title: "Senior Manager" }
}
)
  1. db.getCollection(‘order’).find({“logistics”:{ $in: [null],$exists:true}}) // 数值为null 字段也在
  2. mongo客户端 robomongo
  3. 建立唯一索引db.getCollection(‘xxx’).ensureIndex({id:1},{unique:true})

mvn私服配置

maven私服配置

  1. 下载nexus直接运行bin目录 ./nexus start启动;
  2. 浏览器输入http://localhost:8081/nexus
  3. maven需要配置。在~/.m2/setting.xml,添加一下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>

<proxies>
</proxies>

<servers>
</servers>

<mirrors>
<mirror>
<mirrorOf>*</mirrorOf>
<name>kingsilk</name>
<url>http://mvn.kingsilk.xyz/content/groups/public/</url>
<id>kingsilk</id>
</mirror>
</mirrors>

<profiles>
<profile>
<id>downloadSources</id>
<properties>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</properties>
</profile>
</profiles>

<activeProfiles>
<activeProfile>downloadSources</activeProfile>
</activeProfiles>
</settings>

1.nexus下载地址选择对应的包

clean install -Dmaven.test.skip=true

nginx上传图片错误和代理resolver错误

nginx日常使用

  1. 使用

在上传图片时候,使用电脑浏览器未有错误,手机客户端浏览器会抛错。nginx缓存大小

1
2
3
4
astcgi_buffers 32 8k;
client_body_buffer_size 1024k;
client_max_body_size 10m;
nginx http.conf http中

nginx proxy_pass

  1. 问题:no resolver defined to resolve xxx.xxx

    • 原因是Nginx0.6.18以后的版本中启用了一个resolver指令,在使用变量来构造某个server地址的时候一定要用resolver指令来制定DNS服务器的地址。在nginx的配置文件中的http{}部分添加一行resolver 8.8.8.8;即可
  2. 引申问题 由于resolver加入 8.8.8.8那么域名都会解析到广域网中的ip。 如果需要将域名解析至特定的ip。可以自己搭建一个dns服务器。

  • windows中搭建方法: 自行搜索,暂无看到好的解决方案。windows server可以支持
  • linux 中搭建方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    brew install  dnsmasq
    vim /usr/local/etc/dnsmasq.conf 该路径下没有在etc中
    vim /etc/dnsmasq.conf

    >>把以下注释打开
    domain-needed
    bogus-priv
    cache-size=51200
    listen-address=127.0.0.1
    resolv-file=/etc/resolv.conf

    >> 启动
    /etc/init.d/dnsmasq start 注:默认nobady用户。提示无权限修改上面conf中usre配置。填写对应用户

    >> 在nginx配置中增加
    location ~ /testa {
    resolver 127.0.0.1; // 本句
    proxy_pass http://beta.test.com; #apache环境
    }

redis安装

安装

1
2
安装到自己定义目录中,记住目录
#自启动添加 vim /etc/init.d/redis

centos

  1. 准备 init.d 脚本(可以搜索 redis rpm,找到rpm包后解压获取相应的init.d脚本,然后在再其基础上修改配置项)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/bin/sh
    # chkconfig: 2345 10 90
    # description:redis
    ##
    ## redis init file for starting up the redis daemon
    ##
    ## chkconfig: - 20 80
    ## description: Starts and stops the redis daemon.
    #
    ## Source function library.
    #
    REDISPORT=6379
    EXEC=/data0/soft/redis/redis-3.0.3/src/redis-server
    REDIS_CLI=/data0/soft/redis/redis-3.0.3/src/redis-cli

    PIDFILE=/var/run/redis.pid
    CONF="/data0/soft/redis/redis-3.0.3/redis.conf"

    case "$1" in
    start)
    if [ -f $PIDFILE ]
    then
    echo "$PIDFILE exists, process is already running or crashed"
    else
    echo "Starting Redis server..."
    $EXEC $CONF
    fi
    if [ "$?"="0" ]
    then
    echo "Redis is running..."
    fi
    ;;
    stop)
    if [ ! -f $PIDFILE ]
    then
    echo "$PIDFILE does not exist, process is not running"
    else
    PID=$(cat $PIDFILE)
    echo "Stopping ..."
    $REDIS_CLI -p $REDISPORT SHUTDOWN
    while [ -x ${PIDFILE} ]
    do
    echo "Waiting for Redis to shutdown ..."
    sleep 1
    done
    echo "Redis stopped"
    fi
    ;;
    restart|force-reload)
    ${0} stop
    ${0} start
    ;;
    *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
    exit 1
    esac

    并修改其中的配置项 vi /etc/init.d/redis

    1
    2
    3
    4
    exec="/data/software/redis/redis-2.8.14/src/redis-server"
    pidfile="/data/store/redis/redis.pid" # 应当与redis.conf中的配置保持一致
    REDIS_CONFIG="/data/software/redis/redis-2.8.14/redis.conf"
    REDIS_USER=redis

    最后为 init.d 脚本修改权限

    1
    2
    3
    4
    chmod u+x /etc/init.d/redis
    chkconfig --add redis
    chkconfig --list redis
    chkconfig --level 345 redis on
  2. 启动

    1
    service redis start

#centos7

1
2
3
4
5
vi /usr/lib/systemd/system/redis.service

systemctl enable redis

systemctl start redis

批量删除

redis-cli -h 127.0.0.1 -p 7001 -c keys “xxxx*” | xargs redis-cli -h 127.0.0.1 -p 7001 -c del {}

sonarQube代码配置

java代码规范工具安装和Idea下的使用

1
2
3
4
5
6
7
预置条件
1.已安装JAVA环境
2.已安装有MySQL数据库

软件下载地址:http://www.sonarqube.org/downloads/
下载SonarQube与SonarQube Runner
中文补丁包下载:http://docs.codehaus.org/display/SONAR/Chinese+Pack
  1. 数据库配置

    1
    2
    3
    4
    5
    6
    7
    进入数据库命令
    #mysql -u root -p
    mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
    mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
    mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
    mysql> FLUSH PRIVILEGES;
  2. 安装sonar

    1
    2
    3
    4
    5
    #vi conf/sonar.properties
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.jdbc.url=jdbc:mysql://test12.kingsilk.xyz:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    将上面几行注释打开
  3. 启动服务

    1
    2
    3
    4
    目录切换至sonar的<install_directory>/bin/linux-x86-64/目录,启动服务
    #./sonar.sh start 启动服务
    #./sonar.sh stop 停止服务
    #./sonar.sh restart 重启服务
  4. 安装sonar-runner

    1
    2
    3
    sonar是一个平台,运行还需要其他插件
    http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
    包含(maven jenkins)
  5. 添加到jenkins中

    1
    2
    3
    4
    5
    6
    7
    http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins  
    jenkins添加sonarQbue plugins
    在system config中填写 SonarQube servers
    必须配置:SonarQube Scanner ,用来扫描
    windows中配置:SonarQube Scanner for MSBuild

    在jenkins任务中进行配置:add build step添加:Execute SonarQube Scanner 。

tengine的安装和使用

由于官方的 Nginx 缺乏一些常用特性。比如:

  1. 对于负载均衡,nginx 不支持 sticky session 方式。如果使用 ip hash, 也可能会负载不均衡。
  2. 不支持对后台服务的health check。

因此,服务器上决定使用 Tengine 来取代 Nginx 官方版。

安装

  1. 安装依赖

    1
    2
    3
    4
    5
    6
    yum install openssl openssl-devel
    # 或者
    sudo apt-get install openssl libssl-dev
    sudo apt-get install build-essential
    sudo apt-get install linux-kernel-headers
    sudo apt-get install gcc libpcre3 libpcre3-dev zlib1g-dev
  2. 下载、编译并安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mkdir /usr/local/tengine

    cd /tmp
    wget http://tengine.taobao.org/download/tengine-2.1.0.tar.gz
    tar zxvf tengine-2.1.0.tar.gz
    chown -R root:root tengine-2.1.0
    cd tengine-2.1.0
    ./configure --prefix=/usr/local/tengine/tengine-2.1.0 --user=nginx
    make
    make install
  3. 修改配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cd /usr/local/tengine/tengine-2.1.0
    mkdir conf/conf.d
    vi conf/nginx.conf
    # 1. 启用 "log_format main ..."
    # 2. 在 "http {...}" 的 最后一行 加入 "include conf.d/*.conf;"
    # 3. 在最开始,设置 `user www`, 以非root 用户运行
    # 4. 修改 worker_process 为 CPU 核心数量

    useradd www
    chown -R www:www logs

centos 7

  1. 新建 systemd 所需的 service 文件: vi /usr/lib/systemd/system/tengine.service :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [Unit]
    Description=Tengine Server
    After=network.target

    [Service]
    Type=forking
    ExecStartPre=/usr/local/tengine/tengine-2.1.0/sbin/nginx -t
    ExecStart=/usr/local/tengine/tengine-2.1.0/sbin/nginx
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    WorkingDirectory=/usr/local/tengine/tengine-2.1.0/
    PIDFile=/usr/local/tengine/tengine-2.1.0/logs/nginx.pid
    Restart=always
    User=root
    LimitNOFILE=65535
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target
  2. 启用、启动

    1
    2
    3
    systemctl enable tengine
    systemctl start tengine
    systemctl status tengine

centos 6

  1. 下载 init.d 脚本。从 这里 为 CentOS 下载 Red Hat /etc/init.d/nginx, 并保存到 /etc/init.d/nginx

  2. 修改 /etc/init.d/nginx ,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        nginx="/usr/local/tengine-2.1.0/sbin/nginx"
    NGINX_CONF_FILE="/usr/local/tengine-2.1.0/conf/nginx.conf"
    ```

    ### ubuntu

    参考[这里](http://wiki.nginx.org/Upstart)

    1. make

    sudo apt-get install libpcre3 libpcre3-dev
    sudo apt-get install openssl libssl-dev

    1
    2
    3


    1. `vi /etc/init/tengine.conf`

mac

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
---------------------------- 需要PCRE依赖,没报错跳过
装nginx的时候报错:./configure: error: the HTTP rewrite module requires the PCRE library.
[##]、访问ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre
下载完成之后,使用CD命令进入到相应的下载文件夹,执行命令:
sudo tar xvfz pcre-8.12.tar.gz 解压文件
解压完成之后,执行命令
cd pcre-8.12
sudo ./configure --prefix=/usr/local --enable-utf8
sudo make
sudo make install
---------------------------- 需要openssl依赖,没报错跳过
================= openssl 不需要安装,tengin中使用的时源码包,下面介绍的只是如果安装的方法
安装/替换:openssl
如果你是32位系统的mac,那么输入
./config --prefix=/usr/local/openssl
如果你是64位系统的mac,那么输入
./Configure darwin64-x86_64-cc --prefix=/usr/local/openssl
sudo make
sudo make install
================
---------------------------

mac开发编译tengine

1
2
3
4
5
6
7
8
9
10
./configure --with-openssl=/usr/local  --prefix=/usr/local/openssl  --with-pcre=/usr/pcre
注:上面制定的路径都是未编译的文件夹,直接解压缩的。
xxxxxxxxxxxxxxx 64位电脑注意,过程中有5秒时间要求输入以下,也可以不输
./Configure darwin64-x86_64-cc, 该解决方法可能不行,还是会出现下面的问题
(注):出现ld: symbol(s) not found for architecture x86_64 。 这是由于64位电脑编译openssl错误导致的
解决方法:手动修改:vi objs/Makefile
./config --prefix=/Users/xxx/Downloads/openssl-1.0.1e/.openssl no-shared no-threads
改成
./Configure darwin64-x86_64-cc --prefix=/Users/xxx/Downloads/openssl-1.0.1e/.openssl no-shared no-threads
注:改了上面的问题还是会出现,这时候删除openssl文件,重新解压,在重新重第一不开始

tengine

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
description "tengine http daemon"

start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]

env DAEMON=/usr/local/tengine/tengine-2.1.0/sbin/nginx
env PID=/usr/local/tengine/tengine-2.1.0/logs/nginx.pid

expect fork
respawn
respawn limit 10 5
#oom never

pre-start script
$DAEMON -t
if [ $? -ne 0 ]
then exit $?
fi
end script
exec $DAEMON
  1. 启动

    1
    2
    sudo service tengine status
    sudo service tengine start

tengine使用演示配置

1.复杂配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  server {
listen *:80;
server_name {{域名}};
root /404;

client_max_body_size 20m;
ignore_invalid_headers off;

access_log logs/{{成功日志}}.access.log main;
error_log logs/{{错误日志}}.error.log;
#GZIP配置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css application/javascript text/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";

location ~ /local/test/(\d+) { # 这个必须在前面
set $p $1;

proxy_pass http://localhost:$p;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location ~ /local/test/ {
set $p 9999;
if ( $arg__ddnsPort ~ "^(\d*)$" ) {
set $p $1;
}

proxy_pass http://localhost:$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

2.简单配置没有变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen *:16000;
server_name {{域名}};
root html;
index index.html index.htm;

access_log logs/{{成功日志}}.access.log main;
error_log logs/{{错误日志}}.error.log;

`//alias会直接使用定义的路径.root会在定义的路径后面加上location`
location /local/test/ {
(alias/root) /home/zll/work/git-repo/kingsilk/qh-wap-front/target/dist/;
}

location /local/test/16000/ {
alias /home/zll/work/git-repo/kingsilk/qh-wap-front/target/dist/;
}
location /local/test/16000/api/ {
proxy_pass http://localhost:16030;

proxy_set_header Host $host; # ??? $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

配置使用tomcat的session集中存储

session存储

集群中有4种存储session的方式

  1. Session Sticky 。 每次请求都到一台机子中去
  2. Session Replication 每个容器对session进行同步复制
  3. Session数据集中存储 使用redis
  4. Cookie Based 数据放到cookie中传输

tomcat中配置Session Replication

  1. tomcat复制2份 端口勿冲突,不需要做任何修改,在这一行的下面加入如下代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    -- tomcat中有这么一行代码,打开注释即可
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
    channelSendOptions="8">

    <Manager className="org.apache.catalina.ha.session.DeltaManager"
    expireSessionsOnShutdown="false"
    notifyListenersOnReplication="true"/>

    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
    address="228.0.0.4"
    port="45564"
    frequency="500"
    dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
    address="auto"
    port="4000"
    autoBind="100"
    selectorTimeout="5000"
    maxThreads="6"/>

    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
    <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
    </Channel>

    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
    filter=""/>
    <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

    <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
    tempDir="/tmp/war-temp/"
    deployDir="/tmp/war-deploy/"
    watchDir="/tmp/war-listen/"
    watchEnabled="false"/>

    <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>