Incapsula网页加速(CDN)相关技术信息

Incapsula是与CloudFlare齐名的国外CDN加速服务商,对于将网站空间放在国外访问速度不理想的朋友,推荐大家使用。

IP地址列表<

http://support.incapsula.com/entries/20199668

199.83.128.0/21  OR  199.83.128.1 - 199.83.135.254
198.143.32.0/19  OR  198.143.32.1 - 198.143.63.254
149.126.72.0/21  OR  149.126.72.1 - 149.126.79.254
103.28.248.0/22  OR  103.28.248.1 - 103.28.251.254
185.11.124.0/22  OR  185.11.124.1 - 185.11.127.254

PHP常用header状态代码

PHP的header状态代码,经常用,却总是忘记;今天整理了一下,备忘!

//200 正常状态
header('HTTP/1.1 200 OK');

//301 永久重定向,记得在后面要加重定向地址 Location:$url
header('HTTP/1.1 301 Moved Permanently');

//重定向,其实就是302 暂时重定向
header('Location: http://www.maiyoule.com/');

//设置页面304 没有修改
header('HTTP/1.1 304 Not Modified');

//显示登录框,
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="登录信息"');
echo '显示的信息!';

//403 禁止访问
header('HTTP/1.1 403 Forbidden');

//404 错误
header('HTTP/1.1 404 Not Found');

//500 服务器错误
header('HTTP/1.1 500 Internal Server Error');

//3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同)
header('Refresh: 3; url=http://www.maiyoule.com/');
echo '10后跳转到http://www.maiyoule.com';

//重写 X-Powered-By 值
header('X-Powered-By: PHP/5.3.0');
header('X-Powered-By: Brain/0.6b');

//设置上下文语言
header('Content-language: en');

//设置页面最后修改时间(多用于防缓存)
$time = time() - 60; //建议使用filetime函数来设置页面缓存时间
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT');

//设置内容长度
header('Content-Length: 39344');

//设置头文件类型,可以用于流文件或者文件下载
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="example.zip"'); 
header('Content-Transfer-Encoding: binary');
readfile('example.zip');//读取文件到客户端

//禁用页面缓存
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Pragma: no-cache');

//设置页面头信息
header('Content-Type: text/html; charset=iso-8859-1');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); 
header('Content-Type: image/jpeg'); 
header('Content-Type: application/zip'); 
header('Content-Type: application/pdf'); 
header('Content-Type: audio/mpeg');
header('Content-Type: application/x-shockwave-flash'); 

Windows下从源码编译Nginx

在制作xServer集成环境Windows版过程中,发现官方编译版组件较少,故自行从源码编译了Nginx,下面为详细步骤。

一、下载如下文件

VS2008     http://download.microsoft.com/download/3/0/2/3025EAE6-2E15-4972-972A-F5B1ED248E85/VS2008ExpressWithSP1CHSX1504735.iso
Perl       http://strawberry-perl.googlecode.com/files/strawberry-perl-5.16.3.1-32bit.msi
Mercurial  http://mercurial.selenic.com/downloads/
MinGW      http://sourceforge.net/projects/mingw/files/latest/download

OpenSSL    http://www.openssl.org/source/openssl-1.0.1e.tar.gz
Pcre       http://nchc.dl.sourceforge.net/project/pcre/pcre/8.32/pcre-8.32.zip
Zlib       http://zlib.net/zlib-1.2.8.tar.gz

subs_filter   https://codeload.github.com/yaoweibin/ngx_http_substitutions_filter_module/zip/master

二、编译nginx

1、安装 VS2008、Perl、Mercurial,分别对应C++编译环境、Perl脚本运行时、Hg源码仓库客户端

2、安装MinGW管理器,添加MSYS模块,其他模块可以不安装,用于生成Makefile文件

a、使用 C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\link.exe 替换 C:\MinGW\msys\1.0\bin\link.exe

b、编辑 C:\MinGW\msys\1.0\msys.bat 在@echo off下面加入:call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

3、将 OpenSSL、Pcre、Zlib 分别解压到目录 c:\nginx\objs\lib{openssl-1.0.1e,pcre-8.32,zlib-1.2.8} 中

4、检出nginx源码,命令:hg clone –verbose — http://hg.nginx.org/nginx c:\nginx

a.编辑 c:\nginx\src\core\nginx.h 修改服务器名称

b.替换 c:\nginx\src\os\win32\nginx.ico 自定义软件图标

c.将 subs_filter 解压到 c:\nginx\objs\module\http_subs_filter
编辑文件 ngx_http_subs_filter_module.c,将 ngx_regex_compile_t rc; 移动到当前函数顶部,否则编译出错

5、把下面命令写入到c:\nginx\mkngx,然后在msys中执行该文件

    auto/configure --with-cc=cl --builddir=objs --prefix= --sbin-path=nginx.exe --conf-path=conf/nginx.conf \
        --pid-path=logs/nginx.pid --http-log-path=logs/access.log --error-log-path=logs/error.log \
        --http-client-body-temp-path=temp/client_body_temp --http-proxy-temp-path=temp/proxy_temp \
        --http-fastcgi-temp-path=temp/fastcgi_temp --http-scgi-temp-path=temp/scgi_temp --http-uwsgi-temp-path=temp/uwsgi_temp \
        --with-cc-opt=-DFD_SETSIZE=1024 --with-select_module --with-ipv6 --with-mail \
        --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module \
        --with-http_stub_status_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-pcre=objs/lib/pcre-8.32 --with-zlib=objs/lib/zlib-1.2.8 --with-openssl=objs/lib/openssl-1.0.1e \
        --with-openssl-opt=enable-tlsext --with-http_ssl_module --with-mail_ssl_module \
        --add-module=objs/module/http_subs_filter

    mkdir objs/{conf,logs}
    nmake -f objs/Makefile

6、执行上述步骤时可能会提示找不到stdin.h文件

编辑 c:\nginx\objs\lib\pcre-8.32\config.h,删除如下内容

    #ifndef HAVE_INTTYPES_H
    #define HAVE_INTTYPES_H 1
    #endif

    #ifndef HAVE_STDINT_H
    #define HAVE_STDINT_H 1
    #endif

windows7用msg命令发送局域网消息

今天想给局域网的朋友发消息,竟然发现命令失败;谷歌之,原来XP时代的“net send”,在windows7中已用“msg”替代。

MSG {username | sessionname | sessionid | @filename | *}
    [/SERVER:servername] [/TIME:seconds] [/V] [/W] [message]

  username            标识指定的用户名。
  sessionname         会话名。
  sessionid           会话 ID。
  @filename           识别该文件,文件含有将所发消息发送到的用户名、会话名和会话标识号的列表。
  *                   给指定服务器上的所有会话发送信息。
  /SERVER:servername  要联系的服务器(默认值是当前值)。
  /TIME:seconds       等待接收器确认消息的时间延迟。
  /V                  显示有关执行的操作的信息。
  /W                  等待用户的响应,跟 /V 一起有用。
  message             要发送的消息。如果没有指定,发出提示,或者从 stdin 读取。

简单用法如下:
msg /server:局域网IP * 信息内容

延伸一个用用法,定时提示:
at 20:57 msg * 信息内容

Linux下SCSI磁盘热插拔

维护服务器时,有可能需要热插拔硬盘,但是Linux好像并不买单,不会自动检测磁盘的装卸,为此热插拔后,我们需要通知Linux服务磁盘状态。

#添加磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo "scsi add-single-device 2 0 1 0" > /proc/scsi/scsi
#删除磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo "scsi add-single-device 2 0 1 0" > /proc/scsi/scsi
#查看磁盘
cat /proc/scsi/scsi
#命令输出
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR00 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 01 Lun: 00
  Vendor: VMware   Model: Virtual disk     Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02

参数解析:
HOST 是硬盘所在SCSI控制器号(本例中,磁盘所在通道为2);
CHAN 是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
DEV 是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);
LUN 是硬盘的lun号(默认情况都是0)

各地真太阳时时差表

国庆节,去希拉穆仁草原和库布齐沙漠溜达了一圈,期间老妈问我日出是不是有时差,我说确定有的,且比家里晚半个小时左右,但是具体有多少分钟就不清楚了。 回来后,赶紧做功课,根据网上的数据制做如下表格(相对东八区标准时间,即北京时间),希望对有疑问的各位也有个帮助。若需计算两地太阳时时差,只需要将两地时差相减即可。

地区 经度 时差 地区 经度 时差 地区 经度 时差
台北 121°31′ +6’04” 呼和浩特 111°38′ -33’28” 包头 110°00′ -40’00”
海拉尔 119°43′ -1’08” 太原 112°33′ -29’48” 临汾 111°31′ -33’56”
大同 113°13′ -27’08” 长治 113°13′ -27’08” 石家庄 114°26′ -22’16”
唐山 118°09′ -7’24” 秦皇岛 119°37′ -1’32” 承德 117°52′ -8’32”
保定 115°28′ -18’08” 张家口 114°55′ -20’20” 北京 116°28′ -14’08”
沈阳 123°23′ +13’32” 鞍山 123°00′ +12’00” 锦州 123°09′ +12’36”
大连 121°38′ +6’32” 长春 125°18′ +21’12” 吉林 126°36′ +26’24”
哈尔滨 126°38′ +26’32” 牡丹江 129°36′ +38’24” 齐齐哈尔 123°55′ +15’40”
上海 121°26′ +5’44” 南京 118°46′ -4’56” 无锡 120°18′ +1’12”
苏州 120°39′ +2’36” 徐州 117°12′ -11’12” 合肥 117°16′ -10’56”
芜湖 118°20′ -6’40” 安庆 117°02′ -11’52” 济南 117°02′ -11’52”
烟台 121°22′ +5’28” 青岛 120°19′ +1’16” 天津 117°10′ -11’20”
杭州 120°10′ +0’40” 绍兴 120°40′ +2’40” 宁波 121°34′ +6’16”
金华 119°49′ +0’44” 温州 120°38′ +2’32” 南昌 115°53′ -16’28”
九江 115°59′ -16’04” 赣州 114°56′ -20’16” 福州 119°19′ -2’44”
厦门 118°04′ -7’44” 泉州 118°37′ -5’32” 长沙 112°55′ -28’20”
湘潭 112°51′ -28’36” 常德 111°39′ -33’24” 衡阳 112°34′ -29’44”
武汉 114°20′ -22’40” 监利 112°53′ -28’28” 沙市 112°17′ -30’52”
宜昌 111°15′ -35’00” 郑州 113°42′ -25’12” 新乡 113°54′ -24’24”
许昌 113°48′ -24’48” 洛阳 112°26′ -30’16” 开封 114°23′ -22’28”
广州 113°18′ -26’48” 珠海 113°18′ -26’48” 澳门 113°18′ -26’48”
韶关 113°33′ -25’48” 汕头 116°40′ -13’20” 深圳 113°33′ -25’48”
香港 113°33′ -25’48” 海口 110°19′ -38’44” 南宁 108°21′ -46’36”
桂林 110°10′ -39’20” 梧州 111°18′ -34’48” 柳州 109°19′ -42’44”
贵阳 106°43′ -53’08” 遵义 106°53′ -52’28” 成都 104°10′ -63’06”
重庆 106°33′ -53’48” 万县 108°22′ -46’32” 内江 105°03′ -59’48”
泸州 105°27′ -58’12” 昆明 102°42′ -69’12” 西安 108°55′ -44’20”
延安 109°26′ -42’16” 宝鸡 107°09′ -51’24” 兰州 103°50′ -64’40”
酒泉 98°30′ -86’00” 天水 105°33′ -57’48” 银川 106°13′ -55’08”
西宁 101°49′ -72’44” 乌鲁木齐 87°36′ -129’36” 克拉玛依 84°51′ -140’36”
哈密 93°29′ -106’04” 和田 79°55′ -160’20” 拉萨 91°02′ -115’52”
达孜 91°23′ -114’28” 林芝 94°28′ -102’08” 曲水 90°44′ -117’04”
贡嘎 90°58′ -116’08” 林周 91°17′ -114’52” 那曲 92°03′ -111’48”

PHP-FPM进程CPU占用100%之探索

服务器不时出现的CPU使用率超高、内存几乎被吃光的现象。top查看之,发现php-fpm进程高挂不下,于是根据Google总结如下方案:

一、检查PHP配置及代码

#找出CPU使用率高的进程PID
top
#查看进程的内存使用情况
pmap PID
#跟踪进程执行的系统操作
strace -p PID
#查看该进程在处理的文件
ll /proc/PID/fd

a.结合系统的内存大小,配置php-fpm的进程数(max_children)
b.将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间

二、启用php-fpm慢日志
本来不想加此方法,但是@phpsir提出了,我也放上来。
此日志是dump出脚本执行的过程到文本文件,相对比较直观,只是我感觉有时候找不到自己想要东西,可能还是不习惯这么用吧。大家可以尝试下。

三、强制结束高消耗进程

php-fpm 进程占用的内存超过 %5 就把它kill掉

#!/bin/sh
fpms=`ps aux | grep php-fpm | grep -v grep | awk '{if($3>=5)print $2}'`
for fpm in $fpms; do
  kill -9 $fpm
  echo `date +'%F %T'` $fpm >>/var/log/php5/kill.log
done

Table ‘xxx’is marked as crashed and last (automatic) repair failed

维护着一个大型门户网站,数据量相当大,最近搬到云服务器环境,突然发现帖子无法打开。第一反应是想着是不是数据被破坏了,丢了一些数据,检查后发现并不是。

然后通过adminer查看forum_post表的时候提示:
Table ‘forum_post’ is marked as crashed and last (automatic) repair failed

这意味着该表被标记为跌宕了。于是想着修复:repair table forum_post,修复却失败了。

只好通过mysql命令行来执行了。

#停止mysql服务;
service mysqld stop
#切换到该表目录下(注意:不切换过来会总提示myisamchk一些错误导致失败)
cd /var/lib/mysql/tbl
#如果还是提示错误,就多加一个参数-f强制进行
myisamchk -r forum_post.MYI

CloudFlare网页加速(CDN)相关技术信息

CloudFlare是一个非常优秀的的国外CDN加速服务商,对于将网站空间放在国外访问速度不理想的朋友,推荐大家使用。

节点分布及状态

https://www.cloudflare.com/network-map
https://www.cloudflare.com/system-status.html

查看输出节点

http://www.yourdomain.com/cdn-cgi/trace

IP地址列表

https://www.cloudflare.com/ips-v4
https://www.cloudflare.com/ips-v6

103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
104.16.0.0/12
108.162.192.0/18
131.0.72.0/22
141.101.64.0/18
162.158.0.0/15
172.64.0.0/13
173.245.48.0/20
188.114.96.0/20
190.93.240.0/20
197.234.240.0/22
198.41.128.0/17
199.27.128.0/21

正则表达式 – 模式修饰符(PHP)

i (PCRE_CASELESS)
如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。

m (PCRE_MULTILINE)
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行),"行首"元字符 ^ 仅匹配字符串的开始位置, 而"行末"元字符 $ 仅匹配字符串末尾,或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外,还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串中没有 \n 字符,或者模式中没有出现 ^$,设置这个修饰符不产生任何影响。

s (PCRE_DOTALL)
如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的 /s修饰符。 一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。

x (PCRE_EXTENDED)
如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。
Note: 这仅用于数据字符。空白字符还是不能在模式的特殊字符序列中出现。

e (PREG_REPLACE_EVAL)
如果这个修饰符设置了, preg_replace() 在进行了对替换字符串的后向引用替换之后, 将替换后的字符串作为 php 代码评估执行(eval 函数方式),并使用执行结果作为实际参与替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在后向引用替换时会被用反斜线转义。
Note:preg_replace() 使用此修饰符。PHP5.5之后使用 preg_replace_callback() 代替此修饰符。

A (PCRE_ANCHORED)
如果设置了这个修饰符,模式被强制为"锚定"模式,也就是说约束匹配使其仅从目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且这也是 perl 种实现这种模式的唯一途径。

D (PCRE_DOLLAR_ENDONLY)
如果这个修饰符被设置,模式中的元字符美元符号仅仅匹配目标字符串的末尾。如果这个修饰符没有设置,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符)。如果设置了修饰符m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符。

S
当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。

U (PCRE_UNGREEDY)
这个修饰符逆转了量词的"贪婪"模式。 使量词默认为非贪婪的,通过量词后紧跟? 的方式可以使其成为贪婪的。这和 perl 是不兼容的。 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?)。
Note: 在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。

X (PCRE_EXTRA)
这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后就 ingen 一个没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。 默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。当前没有其他特性由这个修饰符控制。

J (PCRE_INFO_JCHANGED)
内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名,(译注:只能通过内部选项设置,外部的 /J 设置会产生错误。)

u (PCRE_UTF8)
此修正符打开一个与 perl 不兼容的附加功能。 模式字符串被认为是utf-8的. 这个修饰符从 unix 版 php 4.1.0 或更高,win32版 php 4.2.3 开始可用。 php 4.3.5 开始检查模式的 utf-8 合法性。