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