2013年10月

在制作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

今天想给局域网的朋友发消息,竟然发现命令失败;谷歌之,原来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好像并不买单,不会自动检测磁盘的装卸,为此热插拔后,我们需要通知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''

服务器不时出现的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