CentOS安装Chromium和插件

安装Chromium:

1、下载新的软件源定义:

cd /etc/yum.repos.d

wget http://people.centos.org/hughesjr/chromium/6/chromium-el6.repo

yum install chromium

这样就安装完成了。

可以通过菜单来启动浏览器:

安装Pepper Flash插件:

1、下载 hughesjr 辅助安装脚本:

cd /tmp

wget https://raw.github.com/hughesjr/chromium_el_builder/master/chrome_pepperflash_copy.sh

2、设置 chrome_pepperflash_copy.sh 为可执行:

chmod +x chrome_pepperflash_copy.sh

3、 执行脚本进行安装(你可以查看一下脚本内容来了解发生了什么):

./chrome_pepperflash_copy.sh

安装后,如果需要通过命令行方式启动(带有Flash支持),可以输入以下命令:

/opt/chromium/chrome-wrapper %U –ppapi-flash-path=/opt/chromium/PepperFlash/libpepflashplayer.so –ppapi-flash-version=$(grep ‘”version”:’ /opt/chromium/PepperFlash/manifest.json | grep -Po ‘(?<=version”: “)(?:\d|\.)*’)

也可以修改系统菜单中的对应命令。

安装Google Chrome PDF Viewer插件:

1、下载 hughesjr 辅助安装脚本:

cd /tmp

wget https://raw.github.com/hughesjr/chromium_el_builder/master/chrome_libpdf_copy.sh

2、设置 chrome_libpdf_copy.sh 为可执行:

chmod +x chrome_libpdf_copy.sh

3、执行脚本进行安装(你可以查看一下脚本内容来了解发生了什么):

./chrome_libpdf_copy.sh

发表在 服务器 | 标签为 | 留下评论

FastDFS的STORAGE SERVER的7种状态和问题

正常状态必须是ACTIVE,如果运行以下命令:
/usr/bin/fdfs_monitor /etc/fdfs/client.conf

发现有以下状态的服务器:
Storage 2:
id = 192.168.0.2 WAIT_SYNC

经过各种重启都不解决问题,只好先删除,再加入
#从集群中删除
/usr/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.2

#在136服务器中,删除数据文件夹
rm -rf /data/fastdfs/data

#重启136节点
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

重新查状态
/usr/bin/fdfs_monitor /etc/fdfs/client.conf

状态变正常了。

Storage的状态

a)状态值:通常有以下七种状态:

# FDFS_STORAGE_STATUS:INIT      :初始化,尚未得到同步已有数据的源服务器

# FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到同步已有数据的源服务器

# FDFS_STORAGE_STATUS:SYNCING   :同步中

# FDFS_STORAGE_STATUS:DELETED   :已删除,该服务器从本组中摘除

# FDFS_STORAGE_STATUS:OFFLINE   :离线

# FDFS_STORAGE_STATUS:ONLINE    :在线,尚不能提供服务

# FDFS_STORAGE_STATUS:ACTIVE    :在线,可以提供服务

b)启动时状态改变:

当storage server的状态为FDFS_STORAGE_STATUS_ONLINE时,当该storage server向tracker server发起一次heart beat时,
tracker server将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。

组内新增加一台storage server A时,由系统自动完成已有数据同步,处理逻辑如下:

1. storage server A连接tracker server,tracker server将storage server A的状态设置为FDFS_STORAGE_STATUS_INIT。
storage server A询问追加同步的源服务器和追加同步截至时间点,如果该组内只有storage server A或该组内已成功上传的文件数为0,
则没有数据需要同步,storage server A就可以提供在线服务,此时tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE,否则
tracker server将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步的处理;

2. 假设tracker server分配向storage server A同步已有数据的源storage server为B。同组的storage server和tracker server
通讯得知新增了storage server A,将启动同步线程,并向tracker server询问向storage server A追加同步的源服务器和截至时间点。
storage server B将把截至时间点之前的所有数据同步给storage server A;而其余的storage server从截至时间点之后进行正常同步,只
把源头数据同步给storage server A。到了截至时间点之后,storage server B对storage server A的同步将由追加同步切换为正常同步,
只同步源头数据;

3. storage server B向storage server A同步完所有数据,暂时没有数据要同步时,storage server B请求tracker server将
storage server A的状态设置为FDFS_STORAGE_STATUS_ONLINE;

4 当storage server A向tracker server发起heart beat时,tracker server将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。

Tracker选择客户端下载文件的storage的原则

a)在同group下,获取最小的一个同步时间点(各个storage在同一时间,同步完成的时间点不一样)
b)在最小同步时间点之前的文件,按照用户的规则随意选择一个storage。
c)在最小同步时间点之后的文件,选择源storage提供给客户端。

发表在 服务器 | 标签为 | 留下评论

FastDFS常见配置和安装错误问题

Q:ERROR – file: connection_pool.c, line: 130, connect to 192.168.0.8:23000 fail, errno: 113, error info: No route to host

A:执行过程中可能出现防火墙阻止导致,检测打开端口或关闭防火墙。

Q:/fdfs_trackerd: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

A:export LD_LIBRARY_PATH=/usr/loal/lib(libevent的安装路径,可以通过find来查找)

Q:Command ‘ifconfig’ is available in ‘/sbin/ifconfig’
The command could not be located because ‘/sbin’ is not included in the PATH environment variable.
This is most likely caused by the lack of administrative priviledges associated with your user account.
ifconfig: command not found

A:export PATH=$PATH:/sbin

Q:nginx@ubuntu:~/fastdfs/bak$ ./run_nginx.sh
/home/nginx/nginx/sbin/nginx: error while loading shared libraries: libfastcommon.so: cannot open shared object file: No such file or directory

A:找不到fastdfs的库文件,因为前面执行了 export LD_LIBRARY_PATH=/usr/loal/lib,所以 为了使得使用方便,就把所有需要用到的LIB放在一起:

cp libf*.so /usr/local/lib
ls -l /usr/local/lib/libf* 如果没有链接映射,就需要自己做一个或者把四个文件全部拷过去
sudo ln -sf /home/nginx/fastdfs/lib/libfastcommon.so.1 /usr/local/lib/libfastcommon.so
sudo ln -sf /home/nginx/fastdfs/lib/libfdfsclient.so.1 /usr/local/lib/libfdfsclient.so

注意:做软链接的时候需要加绝对路径,不然会出现黑色的提示。

Q:400 badrequest
[2011-12-12 15:24:21] ERROR – file: /tmp/fastdfs-nginx-module/src/common.c, line: 561, logic file: M00/00/00/wKgBNU7lqyjzJZ4mAA4CRXl5SCQ670.jpg not exists
2016/12/12 15:24:21 [error] 14147#0: *1 open() “/home/nginx/nginx/html/favicon.ico” failed (2: No such file or directory), client: 192.168.0.123, server: localhost, request: “GET /favicon.ico HTTP/1.1”, host: “192.168.0.53:8090”

A:修改/fastdfs/conf/mod_fastdfs.conf
里面url_have_group_name = true

Q: 在tracker的日志里报出此类错误
ERROR – file: tracker_mem.c, line: 1406, the format of the file “/home/bstar/dfs_data/data/storage_sync_timestamp.dat” is invalid, group: group2, row count:1 > server count:0

A:修改data里面的 storage_sync_timestamp.dat,把group2的信息删掉,然后重启tracker

Q:在启动tracker的时候出现此类错误:
ERROR – file: ../common/fdfs_http_shared.c, line: 128, param “http.mime_types_filename” not exist or is empty

A:修改tracker.conf里面,把##include http.conf 改为#include http.conf ,再重启

Q:ERROR – file: tracker_http_check.c, line: 132, http check alive, connect to http server 192.168.0.53:8888 fail, errno: 111, error info: Connection refused

A:端口不对。要配置storage和nginx端口一致/

Q:ERROR – file: /home/nginx/install/fastdfs-nginx-module/src/common.c, line: 561, logic file: M00/00/00/wKhdglhsVC6AFKf9AAKZMwsher8772.jpg not exists

A:apache和nginx扩展模块版本v1.06及以上版本,需要在配置文件/etc/fdfs/fastdfs_mod.conf中设置storage server的存储路径信息。
一个示例如下所示:
store_path_count=1
store_path0=/home/yuqing/fastdfs
store_path_count和store_path#均需要正确设置,必须和storage.conf中的相应配置完全一致

Q: DEBUG – file: tracker_proto.c, line: 48, server: 192.168.0.51:22122, response status 28 != 0
tracker_query_storage fail, error no: 28, error info: No space left on device

A:空间不足

Q:EBUG – file: storage_disk_recovery.c, line: 699, disk recovery: begin recovery data path: /home/nginx/fastdfs …

A:这个是数据迁移后的问题,这个需要之前配置的sub_dir的数目前后保持一致。

Q:启动storage server时,一直处于僵死状态。
启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成。
出现这样情况,请检查连接不上tracker server的原因。

A:从V2.03以后,多tracker server在启动时会做时间上的检测,判断是否需要从别的tracker server同步4个系统文件。
触发时机是第一个storage server连接上tracker server后,并发起join请求。
如果集群中有2台tracker server,而其中一台tracker没有启动,可能会导致storage server一直处于僵死状态。

Q:执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2

A:错误号2表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。

Q:如何删除无效的storage server?

A:可以使用fdfs_monitor来删除。命令行如下:
/usr/local/bin/fdfs_monitor delete
例如:
/usr/local/bin/fdfs_monitor /etc/fdfs/client.conf delete group1 192.168.0.100
注意:如果被删除的storage server的状态是ACTIVE,也就是该storage server还在线上服务的情况下,是无法删除掉的。

Q:nginx和apache扩展模块与FastDFS server版本对应关系

A:扩展模块1.05: 针对FastDFs server v2.x,要求server版本大于等于v2.09
扩展模块1.07及以上版本: 针对FastDFs server v3.x

Q:上传文件失败,返回错误码28,这是怎么回事?

A:返回错误码28,表示磁盘空间不足。注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,缺省值为4GB,即预留4GB的空间。请酌情设置reserved_storage_space这个参数,比如可以设置为磁盘总空间的20%左右。

Q:nginx扩展模块,不能正常显示图片的问题

A:在配置文件/etc/fdfs/mod_fastdfs.conf中,缺省的设置是这样的:http.need_find_content_type=false这个参数在nginx中需要设置为true,apache中应该设置为false

Q:启动 FastDFS 的 tracker 和 storage 服务后,通过 fdfs_monitor 命令查看 tracker 和 storage 的通信状态,发现 storage 的状态始终为 offline,怎么办?

A:先查看 tracker 和 storage 的日志,确认服务是否有问题;如果日志显示正常,则有可能是在操作过程中,删除了 tracker 或 storage 某一方的缓存文件,导致缓存不匹配。此时,先关闭 tracker 和 storage 服务,删除 tracker.conf 和 storage.conf 中指定的 base_path 目录下的 data 文件,再重启服务即可。
注意:如果删除了 FastDHT 的 base_path 目录下的文件,切片集信息将全部丢失。

Q:分布式切图时,控制台为什么会提示“No buffer space available (maximum connections reached?):connect”?

A:分布式切图过程中,向 FastDFS 存储上传切片时,占用的端口数增多,可能会达到本地操作系统的端口数的上限,所以出现上述问题。可通过如下方式规避:
•Windows 系统

运行 “regedit.exe”,打开注册表,找到 “HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesTcpipParameters”位置,添加“TcpTimedWaitDelay”,类型为 DWORD,值为30;添加“MaxUserPort”,类型为 DWORD,值为20000(调大系统可用端口数)。
•Linux 系统

运行 “vi /etc/sysctl.conf”,编辑文件,加入以下内容:
net.ipv4.tcp_syncookies  = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle =  1
net.ipv4.tcp_fin_timeout = 30

然后执行“/sbin/sysctl -p”让参数生效即可。

Q:安装 FastDFS 和 FastDHT 后,为什么在 /usr/local/bin 目录下找不到 fdfs_trackerd、fdfs_storaged 和 fdhtd 这3个命令?

A:出现此问题的原因,是由于系统的 libevent 版本太低导致 FastDFS 编译失败。请检查 libevent 版本是否为1.4.x 或以上。

Q:启动 fastDHT 服务的时候,提示“段错误”,是什么原因?

A:这是因为 fdhtd 需要的依赖 libdb-5.3.so 没有正确安装或被指向链接。可以使用命令 ldd /usr/local/bin/fdhtd 查看 fdhtd 命令的依赖项,如果显示的 libdb 依赖不是5.3版本,请首先确认安装 db 时,是否指定了安装路径为 /usr 目录。如果是安装在 /usr 路径下的,但仍然没有正确依赖 libdb.5.3.so,则需要手动在 /lib64 目录下创建 libdb.so 的符号链接,指向 BDB 5.3 的动态库。

Q:FastDFS 和 FastDHT 服务正常,但是添加切图任务失败,查看 debug 版的 iserver.log,日志显示“向 FastDFS 的 storageServer 上传数据 tileset_names 时,发生 MyException ,异常信息是:getStoreStorage fail, errno code: 28”,这是什么原因?

A:错误代码28表示 No space left on device。FastDFS 可在 tracker.conf 配置文件中设置 reserved_storage_sapce 参数,即 storage 的预留存储空间大小,默认为10%。如果预留空间小于该设置值,将出现28错误。

发表在 服务器 | 标签为 | 留下评论

Mongodb CPU占用率超过300%的原因

有个投票项目,会用mongodb进行记录统计和判断,也就是会同时存在查询和写入的情况,刚开始的时候没问题,随着数据增加,过几十万,服务器撑不住了,ssd硬盘也不行,应该不至于如此,上网查找最终简单的创建了几个索引,到现在数据过百万记录也没任何压力。。。 说明索引很重要。。。

发表在 服务器 | 标签为 | 留下评论

mysql 5.6 创建用户root 并授权

老版本的mysql 5.1添加用户:

insert into user(host,user,password) values(‘127.0.0.1′,’root’,password(‘rootpw’));

新版本mysql5.6添加用户:

create user ‘root’@’127.0.0.1’ identified by ‘rootpw’;

赋予所有权限:

GRANT ALL PRIVILEGES ON *.* TO ‘root’@’127.0.0.1’ WITH GRANT OPTION;

发表在 服务器 | 标签为 | 留下评论

200 OK (from cache)和304 Not Modified

引发这个问题是今天测试前段图片服务器发现已经做了缓存还时不时200或304 经过检查原来是etag发生了变化,后端图片服务器上的文件生成时间不一致导致。改变nginx按ip分配即可。

这里简单说下:200是正常访问后的状态,200 OK (from cache)  是浏览器没有跟服务器确认,直接用了浏览器缓存;而 304 Not Modified 是浏览器和服务器多了一次缓存确认有效性,再用的缓存。

服务器返回如下几个缓存控制头部:

  1. Last-Modified:表示文档的最后修改时间,当去服务器验证时会拿这个时间去;
  2. Expires:http/1.0规范定义,表示文档在浏览器中的过期时间,当缓存的内容超过这个时间则需要重新去服务器获取最新的内容;
  3. Cache-Control:http/1.1规范定义,表示浏览器缓存控制,max-age=3153600表示文档可以在浏览器中缓存一年。
  4. ETag:发送到服务端进行内容变更验证的,而Catch-Control是用于控制缓存时间的(浏览器、代理层等)。nginx在生成etag时使用的算法是Last-Modified + Content-Length计算的。

总结:

  1. Last-Modified/Modified-Since 用于验证文档内容是否变更
  2. max-age/Expires 定义文档缓存时间,如在有效期内会返回 200(from cache)

这里以nginx为例

 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
  #etag off;
  #proxy_http_version 1.1;
  expires 1d;
 }
  • 200 from cache 的首要触发条件是图片需要嵌入在html页面中,同时不是刷新页面(而是直接在页面中跳转 或者 浏览器重新键入页面地址),如果使用 ctrl(cmd)+R 或者 F5 进行强制刷新,那么无论是什么网站,那么图片的请求都会是 304,如果是 ctrl(cmd)+shift+R 那么都会是 200 的重新请求;
  • 所以只要在页面中跳转,或者在地址栏重新键入地址,那么大量的资源请求,都会被浏览器主动拦截,请求状态码为 200 from cache,其中 200 from cache 和之前的 304 请求的请求头部信息并没有实质的改变;
  • 当使用 F5 等方式刷新后,taobao仍然有部分的图片可以是 200 from cache,这部分图片的请求的 initiator 基本是 js 或者 css,并不是直接嵌入在html页面中,而是通过 js 或者 css 进行加载,具体加载方式由于 taobao中该部分图片的引用方式被隐藏,所以并不好确定他们的优化方式;

 

 

发表在 服务器 | 标签为 , | 留下评论

Yii2使用composer安装Elasticsearch扩展和简单使用

依旧安装composer这里就不多说了,ElasticSearch安装 看这里,先cmd进入项目目录

prefer-dist参数前面是两个半角英文-

执行:

composer require –prefer-dist  yiisoft/yiisoft/yii2-elasticsearch “*”

php composer.phar require –prefer-dist yiisoft/yiisoft/yii2-elasticsearch “*”

安装成功后扩展目录就有了

在\advanced\common\config\main-local.php下添加

<?php
return [
    'components' => [
        'elasticsearch' => [
            'class' => 'yii\elasticsearch\Connection',
            'nodes' => [
                ['http_address' => 'localhost:9200'],
                // configure more hosts if you have a cluster
            ],
        ],
    ],
];
随便找个控制器添加以下代码,这里使用的是query查询找个控制器
use yii\elasticsearch\Query;
      $query = new Query;
      $query->fields(['id','title','content'])
         ->from('myweb', 'news')//读取已经添加好的对应索引
         //->query(['match' => ['id'=>418076]])
//       ->query(['match' => ['title'=>['query'=>"汽车 2016","operator"=>"and"]]])
         ->query(['multi_match' => ['query'=>"安全","fields"=>["title","content"]]])
         ->orderBy(['_score' => ['order' => 'desc'],'updatetime'=>['order' => 'desc']])
         ->options(['track_scores'=>true])//指定order by一般就不计算scores了 可以强制计算其相关性,可以设置track_scores为 true。
         ->highlight([
            'pre_tags' => '<em>',
            'post_tags' => '</em>',
            'fields' => ['title'=>new \stdClass(),'content'=>new \stdClass()]
         ])
         ->limit(100);
      // build and execute the query
      $command = $query->createCommand();
      $rows = $command->search(); // this way you get the raw output of elasticsearch.
      print_r($rows);
 使用Command来创建删除索引
use yii\elasticsearch\Command;
//Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
      $cmd=new Command();
      $db = Yii::$app->get('elasticsearch');
      $cmd->db=$db;
      $Mapping=["news"=>
         ["properties"=>[
            'id' => array('type' => 'long'),
            'title' => array('type' => 'string', 'analyzer'=>'ik', 'searchAnalyzer' => 'ik'),
            'content'  => array('type' => 'string', 'analyzer'=>'ik', 'searchAnalyzer' => 'ik'),
            'url'  => array('type' => 'string'),
            'updatetime' => array('type' => 'long'),
         ]]
      ];
//    $cmd->indexExists('myweb');//判断是否有对应索引
//    $cmd->typeExists('myweb','news');//判断是否有对应类型

      print_r($cmd->createIndex('myweb'),[
      'settings' => [ 'index' => ['refresh_interval' => '1s'] ],
            'mappings' => $Mapping,
        ]);//创建节点索引 deleteIndex 删除
      //exit;
      //print_r($cmd->closeIndex('myweb'));//关掉索引
      //根据map插入索引
      //cmd insert
      $posts = YII::$app->db->createCommand('SELECT * FROM news order by updatetime desc limit 1000')->queryAll();
      foreach ($posts as $rows) {//查询新闻插入
         print_r($cmd->insert('myweb', 'news',
            [
               'id' => $rows['contentid'],
               'title' => $rows['title'],
               'content' => $rows['description'],
               'url' => $rows['url'],
               'updatetime' => $rows['updatetime'],
            ],null, ['op_type' => 'create']
         ));
      }

      //cmd update
/*    print_r($cmd->update('myweb', 'news',1000,
         [
            'id'=>'1',
            'title' => '测试1',
         ]
      ));*/

      //exit;

也可以使用ActiveRecord 这里就不介绍了
发表在 开源代码 | 标签为 , | 留下评论

Redis客户端命令行批量删除某数据库下多个key

终端终端/usr/local/redis/bin/redis-cli 执行

不同的库记得带上选择库参数-n,这里给我挖坑。

获取所有Key命令:redis-cli  -n 1 keys ‘*’ ;

获取指定前缀的key:redis-cli  -n 1 KEYS “netpc.com.cn:*”

如果需要导出,可以redis-cli  -n 1 keys ‘*’ > /data/redis_key.txt

删除指定前缀的Key redis-cli  -n 1 KEYS “netpc.com.cn:*” | xargs redis-cli -n 1 DEL

发表在 软件 | 标签为 | 留下评论

Elasticsearch安装analysis-ik中文分词插件

环境:Elasticsearch 2.3.2和analysis-ik 1.9.3为例

一开始我下载了个最新版本的ik结果安装后启动提示版本不兼容。

/etc/init.d/elasticsearch start
Starting elasticsearch: Exception in thread “main” java.lang.IllegalArgumentException: Plugin [analysis-ik] is incompatible with Elasticsearch [2.3.2]. Was designed for version [5.0.0]

重新查找后很简单也不用mvn重新编译打包

到https://github.com/medcl/elasticsearch-analysis-ik/releases对应下载一个zip包,解压放到usr/share/elasticsearch/plugins/ik下即可。

配置词库(ik自带搜狗词库)
配置:/usr/share/elasticsearch/plugins/ik/config/ik/IKAnalyzer.cfg.xml

<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic;custom/sougou.dic</entry>

打开ES_HOME/config/elasticsearch.yml文件

在文件最后加入如下内容:

index:
  analysis:                   
    analyzer:      
      ik:
          alias: [ik_analyzer]
          type: org.elasticsearch.index.analysis.IkAnalyzerProvider
      ik_max_word:
          type: ik
          use_smart: false
      ik_smart:
          type: ik
          use_smart: true
index.analysis.analyzer.default.type: ik

重启elasticsearch
service elasticsearch restart

测试

http://localhost:9200/随便一个索引名/_analyze?analyzer=ik&pretty=true&text=深圳热销限时促销优惠600元

{
  "tokens" : [ {
    "token" : "深圳",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "CN_WORD",
    "position" : 0
  }, {
    "token" : "圳",
    "start_offset" : 1,
    "end_offset" : 2,
    "type" : "CN_WORD",
    "position" : 1
  }, {
    "token" : "热销",
    "start_offset" : 2,
    "end_offset" : 4,
    "type" : "CN_WORD",
    "position" : 2
  }, {
    "token" : "热",
    "start_offset" : 2,
    "end_offset" : 3,
    "type" : "CN_WORD",
    "position" : 3
  }, {
    "token" : "销",
    "start_offset" : 3,
    "end_offset" : 4,
    "type" : "CN_WORD",
    "position" : 4
  }, {
    "token" : "限时",
    "start_offset" : 4,
    "end_offset" : 6,
    "type" : "CN_WORD",
    "position" : 5
  }, {
    "token" : "促销",
    "start_offset" : 6,
    "end_offset" : 8,
    "type" : "CN_WORD",
    "position" : 6
  }, {
    "token" : "促",
    "start_offset" : 6,
    "end_offset" : 7,
    "type" : "CN_WORD",
    "position" : 7
  }, {
    "token" : "销",
    "start_offset" : 7,
    "end_offset" : 8,
    "type" : "CN_WORD",
    "position" : 8
  }, {
    "token" : "优惠",
    "start_offset" : 8,
    "end_offset" : 10,
    "type" : "CN_WORD",
    "position" : 9
  }, {
    "token" : "惠",
    "start_offset" : 9,
    "end_offset" : 10,
    "type" : "CN_WORD",
    "position" : 10
  }, {
    "token" : "600",
    "start_offset" : 10,
    "end_offset" : 13,
    "type" : "ARABIC",
    "position" : 11
  }, {
    "token" : "元",
    "start_offset" : 13,
    "end_offset" : 14,
    "type" : "COUNT",
    "position" : 12
  } ]
}
发表在 开源代码 | 标签为 | 留下评论

nginx_lua_graphicmagick搭建图片处理服务器

ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本

特性很牛叉,可自行百度查看,这里主要是示范一下,如何在Nginx下安装lua-nginx-module模块

安装包下载

nginx  地址:http://www.nginx.org
luajit 地址:http://luajit.org/download.html
HttpLuaModule 地址:http://wiki.nginx.org/HttpLuaModule

1.安装luajit
cd /usr/local/src
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -xzvf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make
make install

2.安装nginx
cd /usr/local/src
wget http://nginx.org/download/nginx-1.10.2.tar.gz
tar -xzvf nginx-1.10.2.tar.gz
cd nginx-1.10.2

3.导入环境变量,根据实际路径 有可能是/usr/local/luajit/下
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
4.下载最新的lua-nginx-module 模块 :https://github.com/openresty/lua-nginx-module/tags,不需要安装
cd /usr/local/src
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.7.tar.gz
tar -xzvf v0.10.7.tar.gz

./configure –prefix=/usr/server/nginx \
–conf-path=/usr/server/nginx/nginx.conf \
–add-module=/usr/server/nginx/lua-nginx-module-0.8.6
make -j2
make install

./sbin/nginx -t
如果出现error:
 error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file
就查找到so文件,做个软连接到/usr/lib 或 /usr/lib64下再运行nginx
ln -s /usr/local/lib/libluajit-5.1.so.2 /usr/lib/
ln -s /usr/local/lib/libluajit-5.1.so.2 /usr/lib64/
配置nginx.conf

location ~* ^/lua(/.*) {
      default_type 'text/plain';
      content_by_lua 'ngx.say("hello,lua")';
}
重启nginx
访问localhost/lua试试看

5.安装graphicmagick
wget ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/1.3/GraphicsMagick-1.3.25.tar.gz
tar zxf GraphicsMagick-1.3.25.tar.gz
cd GraphicsMagick-1.3.25
./configure –prefix=/usr/local/graphicsmagick
make&make install
/usr/local/graphicsmagick/bin/gm version

我贴下配置文件和lua代码

以下是nginx 
#对类似_100x100.gif/jpg/png/jpeg进行缩略图处理
 location ~* _([0-9]+)x([0-9]+)\.(gif|jpg|png|jpeg)$ { #匹配文件名规则
 #rewrite ^/(.*)$ /123.jpg last;
 root /home/wwwroot/; #站点根目录
 set $image_root /home/wwwroot; #图片目录
 set $thumbnail_root /home/wwwroot/thumbnail; #缩略图存放目录
 set $image_ext $3; #图片扩展
 #如果缩略图文件存在,直接返回
 set $file $thumbnail_root$uri;
 if (-f $file) {
 rewrite ^/(.*)$ /thumbnail/$1 last;
 }
 #如果缩略图文件不存在,则应用缩略图模块处理
 if (!-f $file) {
 rewrite_by_lua_file /data/lua/thumbnail.lua;
 }
 }
以下/data/lua/thumbnail.lua文件
local index = string.find(ngx.var.uri, "([0-9]+)x([0-9]+)");
 local originalUri = string.sub(ngx.var.uri, 0, index-2) .. '.' .. ngx.var.image_ext;--源文件路径
 lua_log('img_original_uri_new===' .. originalUri .. index .. ngx.var.image_ext ,ngx.ERR);--把信息输出到nginx的日志文件上 用于调试
 local area = string.sub(ngx.var.uri, index); 
 index = string.find(area, "([.])"); 
 area = string.sub(area, 0, index-1); 
 
 local image_sizes = {"80x80", "800x600", "40x40"}; --限制分辨率生成 也可以做一些别的判断
 function table.contains(table, element) 
  for _, value in pairs(table) do 
   if value == element then 
    return true 
   end 
  end 
  return false 
 end 
 function lua_log(msg,log_level) 
  ngx.log(log_level,msg)
 end
 if table.contains(image_sizes, area) then
 local command = "/usr/local/graphicsmagick/bin/gm convert " .. ngx.var.image_root .. originalUri .. " -thumbnail " .. area .. " -background gray -gravity center -extent " .. area .. " " .. ngx.var.file;
 os.execute(command);--执行转换命令 格式可以上网查
 --ngx.redirect("http://www.netpc.com.cn", 302);
 ngx.req.set_uri(ngx.var.uri, true); 
 else 
 ngx.exit(404); 
 end;
发表在 开源代码 | 标签为 , | 留下评论