缘起 [↩]
爱写字原本的服务器软件配置是 Apache 2.2.11 + php 5.2.9,但是随着服务器流量的增大,特别是WordPress mu在apache下存在一个url rewrite的bug,会导致在用户访问以wp-开头的不存在的目录时,发生一个无限循环的url重写,详细信息可以看下面几个帖子
http://mu.wordpress.org/forums/topic/9811?replies=16
http://mu.wordpress.org/forums/topic/12676?replies=4
http://mu.wordpress.org/forums/topic/12551?replies=2
上面的问题至今还没有人找到解决方案,google的机器人每天下午3点多开始批量的访问爱写字时候,会产生很多404错误,基本这些404错误每天都会导致服务器资源被耗尽,这让爱写字下决心一定要将apache替换成更轻量级,效率更高的nginx。
准备 [↩]
首先下载 nginx、php、php fastcgi的fpm补丁,安装nginx的rewrite模块需要 pcre-7.9 的支持。
pcre-7.9
nginx-0.8.2
php 5.2.9
php-529-fpm-0510 补丁
pcre是Perl Compatible Regular Expressions的简称,nginx需要pcre以支持url rewrite。
fpm是php的一个补丁,用于提高生产环境下,FastCGI SAPI的可用性。一个用处就是在无需重新启动fast cgi进程的情况下,调整php.ini的设置。
安装 [↩]
安装pcre [↩]
cd pcre-7.9
./configure
make
make install
安装nginx [↩]
安装nginx之前,需要安装zlib和openssl以支持压缩和ssl支持,爱写字使用的linux box是debian,所以可以使用 apt-get 命令来安装,如果您使用的是非debian的linux发行版,请按照相应发行版的方式进行安装。
apt-get install
zlib1g-dev
libcurl4-openssl-dev
#增加用户组www和用户www
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
#解压缩nginx安装文件
tar xzf nginx-0.8.2.tar.gz
#编译nginx,增加 http_stub_status模块,安装到目录/usr/local/nginx
cd nginx-0.8.2
./configure --user=www --group=www
--prefix=/usr/local/nginx --with-http_stub_status_module
#编译并安装
make
make install
安装完成后,使用下面的语句启动nginx并在浏览器中输入 http://localhost 访问,如果访问能够出现的页面显示 “It Works” 那就说明您的nginx安装成功。
/usr/local/nginx/sbin/nginx
安装php [↩]
首先安装咱们需要安装的php模块的依赖包的库函数
# gettext是为了增加gettext支持
# libxml2-dev和libcurl4-dev是为了增加xml解析支持和curl支持
apt-get install
libjpeg-dev
libpng-dev
libxml2-dev
gettext
libcurl4-dev
libfreetype6-dev
首先用下面的命令解压缩php安装文件与php的fpm补丁,然后将fpm补丁打到php的源代码中去,如果在打补丁时提示找不到patch命令请使用 apt-get install patch 先安装patch命令
tar xzf php-5.2.9.tar.gz
#打fpm patch
gzip -cd php-5.2.9-fpm-0.5.10.diff.gz | patch -d php-5.2.9 -p1
cd php-5.2.9
# 编译php,根据爱写字的需要
# gd库(jpeg, png, freetype)、mysql、gettext, curl, zlib, mbstring, sockets支持
# 安装后php被安装在 /usr/local/ 下
# php fastcgi的可执行文件 php-fpm被安装在 /usr/local/sbin下
# 其他文件和扩展文件被安装在/usr/local/lib/php下,
# 扩展文件在 /usr/local/lib/php/extensions/no-debug-non-zts-20060613 下
./configure
--enable-fastcgi
--enable-fpm
--enable-force-cgi-redirect
--with-gd
--with-mysql=/usr/local/mysql
--with-jpeg-dir=/usr/lib
--with-png-dir=/usr/lib
--with-gettext=/usr/lib
--with-curl=/usr/lib
--with-freetype-dir=/usr/lib
--with-zlib-dir=/usr/include
--enable-mbstring
--enable-sockets
#编译并安装
make
make install
#将php-5.2.9目录下的php.ini-dist文件复制为/usr/local/lib/php.ini
cp php.ini-dist /usr/local/lib/php.ini
安装完成后,使用下面的命令安装 php的memcache、zip和apc扩展,关于如何在WordPress中启用memcache的详情,可以看这篇文章 linux下启用WordPress的memcached支持
pecl install memcache
#安装zip扩展,用于在线压缩和解压缩zip文件
pecl install zip
#安装apc扩展,用于进行php脚本的缓存,提升系统效率
pecl install apc
安装完上述三个php扩展后,编辑/usr/local/lib/php.ini文件。
- 首先修改配置 extension_dir 为 /usr/local/lib/php/extensions/no-debug-non-zts-20060613/ (注意:根据所安装php的版本和编译选项的不同,本设置可能不完全相同)
- 在Dynamic Extensions 设置部分,加入下面的设置,载入zip, memcached和apc扩展
extension = memcache.so
extension = apc.so
配置完成后,使用命令 pecl list-all 查看所有已经安装的pecl模块,确认apc, memcache和zip在其中。
配置Nginx和PHP [↩]
配置Nginx [↩]
打开 /usr/local/nginx/conf/nginx.conf.default文件,将其复制为 nginx.conf,这将是nginx的主配置文件。
以下是爱写字所使用的nginx.conf文件
user www www;
#工作进程
worker_processes 8;
#错误日志级别为info, 生产环境建议修改为error或者notice
error_log logs/error.log info;
#nginx运行时的pid文件地址
pid logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
#events配置
events {
use epoll;
worker_connections 51200;
}
#http配置
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name ixiezi.com *.ixiezi.com;
index index.html index.htm index.php;
root /var/www/html;
location ~ .*.(php)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
#log 日志格式设置,对后期的日志分析很有作用。
log_format wwwlogs '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log logs/ixiezi-access.log wwwlogs;
error_log logs/ixiezi-error.log info;
}
}
其中包含到的fcgi.conf文件内容如下
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
配置apc缓存 [↩]
打开 /usr/local/lib/php.ini 文件,按照需求,修改并添加下面的配置,关于php的apc扩展的详细信息,请看这里(英文)。
apc.shm_segments = 4
测试php配置 [↩]
在网站根目录下创建一个php文件, 调用 phpinfo() 函数,通过浏览器访问该文件,确认php能够正常工作并查看php的相关参数设置,确认apc、memcached、zip模块已经正确载入。
配置nginx和fastcgi开启自启动 [↩]
编辑 /etc/rc.local文件,在该文件最后加入以下两句话,让nginx和php的fast-cgi进程能够在系统启动时自动启动
/usr/local/sbin/php-fpm start
# Start nginx.
/usr/local/nginx/sbin/nginx
重新载入nginx和php配置 [↩]
使用下面的语句在不重新启动nginx的情况下重新载入nginx.conf文件
使用下面的语句在不重启php-fpm的情况下重新载入php.ini
配置日志轮循 [↩]
web日志文件如果不进行定期的轮循备份处理,会越来越大,这对以后的系统维护、日志分析都不好,所以爱写字的nginx访问日志是每天23:58分进行定时切换的。以下是进行日志轮循的脚本
# This script run at 23:58
# The Nginx logs path
logs_path="/usr/local/nginx/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
将本脚本放到合适的地方,爱写字是放在/usr/local/nginx/sbin/cut_nginx_log.sh 下的,使用 chmod +x cut_nginx_log.sh将其设置为可执行,使用 crontab -e 命令编辑系统定时任务,将下面这一句加入其中。其中的设置 58 23 * * * 表示本程序每天23点58分定时运行。
完成了上述配置,系统即可每日自动进行日志轮循。爱写字的服务器配置中,每日日志自动轮循过后,会调用日志分析程序对这一天的访问日志进行分析,日志访问分析使用了著名的日志访问程序awstats。
配置WordPress mu的url rewrite [↩]
打开/usr/local/nginx/conf/nginx.conf文件,在WordPress的Server定义中加入下面的rewrite配置,启用WordPress mu的url rewrite
# rewrite rule for files
location ~* ^.+.(xml|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf)$ {
rewrite ^/files(/.*)$ /wp-content/blogs.php?file=$1 last;
expires 10d;
break;
}
location / {
error_page 404 = /index.php?q=$uri;
}
编辑完成后,重新载入nginx.conf文件中的配置,然后登陆进入WordPress后台,修改永久链接格式,应该能够正常工作。至此,我们完成了将WordPress迁移到nginx服务器上的工作。
随机日志
载入中…
© 2009, 爱写字开发博客. 版权所有. 转载请注明来自爱写字开发博客
标签:linux, nginx, php, wordpress相关日志
4 条评论了已经
Trackbacks/Pingbacks.
发表评论
字体为 粗体 是必填项目,邮箱地址 永远不会 公布。
允许部分 HTML 代码:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
URLs(网站链接)必须完整有效 (比如: http://dev.ixiezi.com),所有标签都必须完整的关闭。
超出部分系统将会自动分段及换行。
请保证评论内容是与日志或 Blog 内容相关的,灌水、攻击性或不恰当的评论 可能 会被编辑或删除。
换成nginx,明智的选择啊.
呵呵,wordpress mu 文件不存在时rewrite的bug 经常地址服务器当机,这是换服务器的一个重要原因