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

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

Windows下php-sendmail配置实现

Windows下使用php sendmail配置方法是否不太可能,但也不是绝路,现在告诉大家如何在WINDOWS平台下解决php sendmail配置问题.

大家非常好奇为什么别人大型公司的论坛注册后会系统自动发送一封注册信息的电子邮件到注册人的信箱里,而同样用的是一种内核的论坛程序,为什么自己架设的却没有这个功能,今天我来为大家解密这个原因。我们拿PHPBB来举例,这个论坛内核早已经写好了论坛邮件发送功能,只需要你本地有个SMTP转发的服务在就可以,由于大公司服务器大多数用的是UNIX或者是LIUNX,因为这些服务器本身具有本地SMTP服务的作用,所以可以直接发注册信息到注册人的邮箱里,而我们个人架设网站大部分都是WINDOWS的平台,由于ASP论坛非常不安全,而ASPX论坛又不好进行开源。

虽然这两种论坛架构非常容易运用些IIS的相关的SMTP服务器来解决问题,但都先天不足,很多网友都非常喜欢用PHP内核的论坛来架设,比如PHPBB、PHPWIND、等这些都是具备论坛发信功能,但由于PHP先天就是LIUNX的宠爱,所以WINDOWS下支持SMTP的东西不是很多.Windows下使用php sendmail配置方法是否不太可能,但也不是绝路,现在告诉大家如何在WINDOWS平台下解决php sendmail配置问题.

1.修改 sendmail.ini 文件,修改以下信息:

smtp_server = mail.anrip.com
auth_username = user@anrip.com
auth_password = passwd

2.修改 php.ini 文件,修改以下信息:

[mail function]
;smtp_port = 25
;sendmail_from =
sendmail_path = "E:\sendmail\sendmail.exe -t"
  1. 重新启动php进程,测试mail()功能:
<?php
    $now = date("Y-m-d h:i:s");
    $from_name = '寄件人';
    $from_email =
    $headers = 'From: $from_name <$from_email>';
    $body = '嗨, \n 這是一封测试信件来自 $from_name <$from_email>.';
    $subject = '[$now] 测试邮件发送';
    if (mail($to, $subject, $body, $headers)) {
        echo "success!";
    } else {
        echo "fail…";
    }
?>

这样,Windows下使用php-sendmail配置就顺利完成了!

隐藏Nginx和PHP版本号

配置完一台服务器后,并不是就可以高枕无忧了,前不久刚刚爆发的PHP 5.3.9版本的漏洞也搞得人心惶惶,所以说经常关注安全公告并及时升级服务器也是必要的。

一般来说,黑客攻击服务器的首要步骤就是收集信息,比如说你的软件版本,这些将成为下一步有针对性攻击的依据。所以说一定程度的隐藏这些信息就显得非常有必要了,本文将简单介绍如何在网络上隐藏Nginx版本号以及PHP的版本号。

1.隐藏Nginx版本号,Nginx的版本号主要在两个地方会有,一个是HTTP header,有个Server:nginx/1.x.x类似会暴露Web服务器所用软件名称以及版本号,这个也是大多数Web服务器最容易暴露版本号的地方,第二个地方是Nginx出错页面,比如404页面没有找到等,这是如果用户没有指定页面的话,那么Nginx自己的页面会有版本戳记。通过在配置文件的http节配置server_tokens off来达到我们目的。

2.隐藏PHP的版本号,将expose_php = On改为expose_php = Off就搞定了,当然,对于Apache服务器还有另外一个方法可以直接尝试在.htaccess文件中Header unset X-Powered-By,删除X-Powered-By节,不过我还是建议改动php.ini的expose_php。

Nginx下WordPress伪静态规则设置

Nginx下WordPress固定链接的伪静态规则其实特别简单。

  1. 打开nginx配置文件:
vim /etc/nginx/nginx.conf
  1. 在server容器中添加下面代码
location / {
  try_files $uri $uri/ /index.php?q=$uri&$args;
}
  1. 重新加载nginx配置文件
/etc/init.d/nginx reload

完成设置。

MySQL找回root密码的方法

方法一(通用):

1.在my.cnf或my.ini中的[mysqld]字段加入skip-grant-tables,免认证登录

2.重启mysql服务,进入CLI模式

#使用root用户
mysql -uroot

3.在mysql命令行修改root密码

use mysql;
update user set authentication_string=password('newpassword') where user='root';
flush privileges;

# mysql old version
#update user set Password=password('newpassword') where user='root';

4.去掉my.cnf或my.ini中的skip-grant-tables,重启mysqld

方法二(Debian系统):

类Debian系统可直接使用/etc/mysql/debian.cnf中[client]节提供的密码登录

#查看系统保留密码
cat /etc/mysql/debian.cnf
#使用系统用户登录
mysql -udebian-sys-maint -p

MySQL复制不重复记录到新表

NSERT IGNOREINSERT INTO的区别就是前者会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

本条语句主要用于从DiscuzX备份表恢复一些缺失的数据。

INSERT IGNORE INTO `discuz`.`ar_forum_post`
    SELECT * FROM `discuz_bak`.`ar_forum_post`

修改MySQL记录物理顺序

出于某种特殊需要,可能必须把数据按照某字段重新进行物理位置排序。另外这样也可以达到压缩空闲空间的目的。

可使用如下SQL语句进行操作:

alter table `表名` order by `字段` asc;

实战,DiscuzX数据库中可使用如下语句整理记录顺序:

ALTER TABLE `xc_ucenter_members` ORDER BY `uid` ASC;
ALTER TABLE `xc_forum_post` ORDER BY `tid` ASC, `first` DESC, `pid` ASC;