ElasticSearch的一点点使用经验

为啥要使用

用户要搜索嘛,传统的mysql like语句不满足要求,需要更强大的搜索工具。

安装方法

使用添加es官方安装源的方式,这里就不重新复制一份了参考这里安装吧:官方源安装ES步骤

导入数据

创建索引首先需要创建索引

curl -XPOST http://127.0.0.1:9200/some_index -d'
{
"mappings": {
"my_type": {
"properties": {
"date": {
"type": "date",
"format": "yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
},
"settings": {
"analysis": {
"char_filter": {
"escape_sign": {
"type": "mapping",
"mappings": [
"@=>qsdvhi" //用户搜索的时候,把@转换为某个字符串
]
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": ["html_strip", "escape_sign", "tsconvert"], //繁体转简单
"tokenizer": "ik_max_word", //使用IK中文分词
"filter": [ "lowercase"]
}}
}}
}'
阅读全文 »

SVN命令行导出某个时间段内某个用户所有提交过的文件列表

公司使用的是SVN来做代码的管理,经常出现的情况是每天提交代码,等开发周期结束后需要整理出所以已提交过的文件,然后同步系统一次性更新到外网去。

windows下使用tortoiseSVN

非常方便

  1. 直接右键
  2. TortoiseSVN
  3. Show log
  4. 然后选中指定的多条commit记录
  5. 下面就自动整理出所有去重后的文件列表了,然后全选复制即可。
    阅读全文 »

SSH日志分析

今天闲着仔细看了下SSH的secure日志,发现了一些有意思的东西,记录在下!

几种常见的暴力破解提示的错误

  1. Did not receive identification string from
    有人尝试使用账号密码登录你的服务器

  2. vsftpd[11273]: pam_userdb(vsftpd:auth): user ‘acount’ granted access
    vsftpd授权登录

  3. Invalid user nagios from 115.28.108.179
    又是尝试登录

  4. Received disconnect from 121.42.0.88: 11: Terminating connection
    有攻击者尝试使用一些特定的代码暴力破解服务器,然后SSHD服务终止了此行为

    阅读全文 »

lnmp访问速度变慢排查方法

最近线上服务器遇到一个问题是网站突然访问变慢,使用17ce的GET测试都能让把网站给搞卡死,只能等待响应超时。抽空整理一下整个排查过程。

定位问题点

修改log_format分析是nginx出问题不是上游服务器出问题

首先我们需要判断的是到底在在nginx出问题了还是后面干活的php-fpm出问题了,所以我们修改nginx的日志格式为如下所示:

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
'$request_time $upstream_response_time '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';

其中第二行为新增配置,下面简单概括一下大致意思
$request_time

request processing time in seconds with a milliseconds resolution (1.3.9, 1.2.6); time elapsed since the first bytes were read from the client
从接收到第一个字节到发送回最后一个字节所经历的时间

$upstream_response_time

keeps time spent on receiving the response from the upstream server; the time is kept in seconds with millisecond resolution. Times of several responses are separated by commas and colons like addresses in the $upstream_addr variable.
接收上游服务器处理请求所消耗的时间(在lnmp架构里面一般就是php-fpm所处理的时间了)

阅读全文 »

服务器的简单反代

啥是反代

反向代理
其中一个作用就是隐藏源服务器,比如你的服务器存储着大量的盗版数据,你就很有必要把你的DCMA ignore的主机给隐藏起来。当然顺带还可以做缓存相关啦,好处多多。。。

上游源服务器

server
{
listen 80;
server_name www.example.com;
index index.html index.htm index.php;
root /home/wwwroot/movie/public;

charset utf-8;
location / {
allow 2.3.4.5; //仅允许反代服务器过来获取数据
deny all;
try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

location ~ .*\.(js|css|png|jpg|ico)?$
{
allow 2.3.4.5;
deny all;
expires 12h;
}

error_page 404 /index.php;

sendfile off;

location ~ \.php$ {
allow 2.3.4.5;
deny all;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}

location ~ /\.ht {
deny all;
}
access_log /home/wwwlogs/movie.log access;
error_log /home/wwwlogs/error_movie.log;
}

下游反代服务器

proxy_temp_path   /var/www/temp 1 2;
proxy_cache_path /var/www/cache levels=1:2 keys_zone=one:100m inactive=1d max_size=10g;
upstream source_server_alias {
server 1.2.3.4 max_fails=3 fail_timeout=10s; # 上游IP地址
}
server {
listen 80;
server_name www.new-example.com; # 对用户访问的域名
# 采用一定的缓存策略
location / {
proxy_cache one;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 10m;
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com"; # 带上源站域名访问(隐藏源服务器)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_cache_key $host$request_uri;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; # 忽略上游提供的缓存头部,由反代服务器自行决定缓存逻辑
add_header X-Cache-Status $upstream_cache_status; # 显示缓存命中情况
expires 10m; 缓存过期时间
}

# 不缓存某些请求域,直接请求源站
location ^~ /dt/ {
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
}

location /resource/ {
proxy_cache one;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 404 10m;
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_cache_key $host$request_uri;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
add_header X-Cache-Status $upstream_cache_status;
expires 1d;
}

# 图片相关的均缓存10天
location ~ .*\.(js|css|png|jpg|ico)?$ {
proxy_cache one;
proxy_cache_valid 200 302 10d;
proxy_cache_valid 404 10m;
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_cache_key $host$request_uri;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
add_header X-Cache-Status $upstream_cache_status;
expires 10d;
}
}

NFS简单折腾

NFS是干什么用的

简单的解释A服务器可以直接把B服务器的磁盘或文件映射到A服务器自己的文件系统中,这样A服务器就可以像操作本地文件一来操作其他服务器上面的文件

Server端

以CentOS 6.5为例

安装相关nfs相关软件

yum install nfs-utils nfs-utils-lib

配置nfs开机自启动

chkconfig nfs on 
service rpcbind start
service nfs start

设置共享目录

创建或编辑配置文件:/etc/exports
添加如下一行配置文件

/home/wwwroot/movie/public/ 106.186.99.222(rw,sync,anongid=501,anonuid=501,no_subtree_check)
  • 目录地址表示待共享的目录
  • IP地址表示客户端的IP
  • rw 表示允许客户端读写NFS上的文件
  • sync 表示同步确认
  • anongid 表示文件所属组ID
  • anonuid 表示文件所属用户ID
  • no_subtree_check 表示关闭子目录权限检查

注意上面的是anongid和anonuid是用户指定在clicnt端新增或修改的文件的权限,统一压成Server机上的uid为501,组id为501的权限。
设置完配置的时候,重新导入配置文件

exportfs -a

Client端

以Ubuntu 14.04为例

安装相关软件包

sudo apt-get update
sudo apt-get install nfs-common

新建挂载点

mkdir /mnt/nfs/movie/public/

挂载远端目录到本地

mount 162.243.128.43:/home/wwwroot/movie/public /mnt/nfs/movie/public/

查看是否挂载成功

df -h

测试

这个时候如果在Client上面修改或添加文件均会在Server上做对应的修改

服务器crontab时区问题

系统级

服务器时间统一调整成UTC时间

一般VPS默认使用UTC时间,使用date命令可以看到如下的结果

root@archlinux:/home/vagrant/dev/doutu/laravel# date
Wed Jun 15 19:22:30 AEST 2016

可以发现与国内的时间相差了8个小时

根据业务需要设置服务器的时区

使用tzselect命令进行交互式方式选择时区

root@archlinux:/home/vagrant/dev/doutu/laravel# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
8) Indian Ocean
9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 4
Please select a country whose clocks agree with yours.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#? 1

The following information has been given:

China
Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Wed Jun 15 17:29:41 CST 2016.
Universal Time is now: Wed Jun 15 09:29:41 UTC 2016.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

注意看上面的说明,为了永久有效的话,需要在~/.profile加入一行配置文件

TZ='Asia/Shanghai'; export TZ

然后重新登录一下即可。

业务级

以php为例,使用

ini_set('date.timezone','Asia/Shanghai');

nginx 403 Forbidden

问题来源一

目录权限设置不对

问题来源二

目录树下缺少index.php, index.html等

问题来源三

SELINUX没有关闭,这个晚上碰到真心是个坑啊
判断SELINUX是否开启

getenforce

临时关闭SELINUX,修改selinux配置文件
修改前:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

修改后:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

巨人的肩膀

Resolving “403 Forbidden” error
Nginx 403 forbidden for all files

pillow无法调用libjpeg的问题

问题

#!/usr/bin/python
from PIL import Image

im = Image.open('test.jpg')
print(im.format, im.size, im.mode)
im.resize((128, 128))
out = im.rotate(45)

执行后的结果如下:

(movies)[vagrant@crawler tutorial]$ python test.py
('JPEG', (1920, 1200), 'RGB')
Traceback (most recent call last):
File "test.py", line 7, in <module>
im.resize((128, 128))
File "/home/vagrant/dev/movies/lib/python2.7/site-packages/PIL/Image.py", line 1557, in resize
self.load()
File "/home/vagrant/dev/movies/lib/python2.7/site-packages/PIL/ImageFile.py", line 203, in load
d = Image._getdecoder(self.mode, d, a, self.decoderconfig)
File "/home/vagrant/dev/movies/lib/python2.7/site-packages/PIL/Image.py", line 420, in _getdecoder
raise IOError("decoder %s not available" % decoder_name)
IOError: decoder jpeg not available
阅读全文 »

Laravel 5.1事件系统

事件系统有啥用?

  • 解耦,抽出与核心业务关联不大的代码逻辑
  • 异步执行耗时长任务,加快页面响应速度

事件使用样例

现在需要完成这样一件事,当一个图片被用户收藏到一个专辑内时,专辑的封面会自动根据最新的4张图片来生成一个新的专辑封面。因为所有的图片均存储在第三方云存储上,每次都需要下载回来4张图片,在服务器上处理后再回传到云存储上,所以采用Laravel的事件系统来做。

创建事件触发器

php artisan make:event imageAddedToAlbum

这个时候会在app/Events里面生成对应的imageAddedToAlbum.php文件,当然手工创建也可以

阅读全文 »