16
Jun

WordPress mu on Linux Nginx/fastcgi php

缘起 []

爱写字原本的服务器软件配置是 Apache 2.2.11 + 5.2.9,但是随着服务器流量的增大,特别是 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

准备 []

首先下载 fastcgi的fpm补丁,安装的rewrite模块需要 pcre-7.9 的支持。

pcre-7.9
nginx-0.8.2
php 5.2.9
php-529-fpm-0510 补丁

pcre是Perl Compatible Regular Expressions的简称,需要pcre以支持url rewrite。

fpm的一个补丁,用于提高生产环境下,FastCGI SAPI的可用性。一个用处就是在无需重新启动fast cgi进程的情况下,调整.ini的设置。

安装 []

安装pcre []

tar xzf pcre-7.9.tar.gz
cd pcre-7.9
./configure
make
make install

安装 []

安装之前,需要安装zlib和openssl以支持压缩和ssl支持,爱写字使用的 box是debian,所以可以使用 apt-get 命令来安装,如果您使用的是非debian的发行版,请按照相应发行版的方式进行安装。

#安装nginx需要的库函数openssl和zlib
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

安装完成后,使用下面的语句启动并在浏览器中输入 http://localhost  访问,如果访问能够出现的页面显示 “It Works” 那就说明您的安装成功。

#启动nginx
/usr/local/nginx/sbin/nginx

安装 []

首先安装咱们需要安装的模块的依赖包的库函数

# libjpeg, libpng, libfreetype是为了增加gd库支持
# gettext是为了增加gettext支持
# libxml2-dev和libcurl4-dev是为了增加xml解析支持和curl支持
apt-get install
libjpeg-dev
libpng-dev
libxml2-dev
gettext
libcurl4-dev
libfreetype6-dev

首先用下面的命令解压缩安装文件与的fpm补丁,然后将fpm补丁打到的源代码中去,如果在打补丁时提示找不到patch命令请使用 apt-get install patch 先安装patch命令

#解压缩php 5.2.9的php源代码
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

安装完成后,使用下面的命令安装 的memcache、zip和apc扩展,关于如何在中启用memcache的详情,可以看这篇文章 linux下启用WordPress的memcached支持

#安装memcache扩展,用于启用wordpress的memcached支持。
pecl install memcache
#安装zip扩展,用于在线压缩和解压缩zip文件
pecl install zip
#安装apc扩展,用于进行php脚本的缓存,提升系统效率
pecl install apc

安装完上述三个扩展后,编辑/usr/local/lib/.ini文件。

  1. 首先修改配置 extension_dir 为 /usr/local/lib//extensions/no-debug-non-zts-20060613/ (注意:根据所安装的版本和编译选项的不同,本设置可能不完全相同)
  2. 在Dynamic Extensions 设置部分,加入下面的设置,载入zip, memcached和apc扩展
extension = zip.so
extension = memcache.so
extension = apc.so

配置完成后,使用命令 pecl list-all 查看所有已经安装的pecl模块,确认apc, memcache和zip在其中。

配置 []

配置 []

打开 /usr/local//conf/.conf.default文件,将其复制为 .conf,这将是的主配置文件。

以下是爱写字所使用的.conf文件

#以用户和用户组www来运行nginx
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  GATEWAY_INTERFACE  CGI/1.1;
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/.ini 文件,按照需求,修改并添加下面的配置,关于的apc扩展的详细信息,请看这里(英文)。

apc.shm_size = 64
apc.shm_segments = 4

测试配置 []

在网站根目录下创建一个文件, 调用 phpinfo() 函数,通过浏览器访问该文件,确认能够正常工作并查看的相关参数设置,确认apc、memcached、zip模块已经正确载入。

配置和fastcgi开启自启动 []

编辑 /etc/rc.local文件,在该文件最后加入以下两句话,让的fast-cgi进程能够在系统启动时自动启动

# Start php fast cgi.
/usr/local/sbin/php-fpm start

# Start nginx.
/usr/local/nginx/sbin/nginx

重新载入配置 []

使用下面的语句在不重新启动的情况下重新载入.conf文件

kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

使用下面的语句在不重启-fpm的情况下重新载入.ini

/usr/local/sbin/php-fpm reload

配置日志轮循 []

web日志文件如果不进行定期的轮循备份处理,会越来越大,这对以后的系统维护、日志分析都不好,所以爱写字的访问日志是每天23:58分进行定时切换的。以下是进行日志轮循的脚本

#!/bin/bash
# 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//sbin/cut_nginx_log.sh 下的,使用 chmod +x cut_nginx_log.sh将其设置为可执行,使用 crontab -e 命令编辑系统定时任务,将下面这一句加入其中。其中的设置 58 23 * * * 表示本程序每天23点58分定时运行。

58 23 * * * /bin/bash  /usr/local/nginx/sbin/cut_nginx_log.sh

完成了上述配置,系统即可每日自动进行日志轮循。爱写字的服务器配置中,每日日志自动轮循过后,会调用日志分析程序对这一天的访问日志进行分析,日志访问分析使用了著名的日志访问程序awstats

配置 mu的url rewrite []

打开/usr/local//conf/.conf文件,在的Server定义中加入下面的rewrite配置,启用 mu的url rewrite

# rewrite配置 这一段对WordPress来说非常重要,必不可少
# 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;
}

编辑完成后,重新载入.conf文件中的配置,然后登陆进入后台,修改永久链接格式,应该能够正常工作。至此,我们完成了将迁移到服务器上的工作。

随机日志

载入中…

© 2009, 爱写字开发博客. 版权所有. 转载请注明来自爱写字开发博客

标签:, , ,

相关日志

4 条评论了已经

发表评论

名字(必须)
邮箱(必须),(永不被公布)
网址(建议)

Powered by WP Hashcash

字体为 粗体 是必填项目,邮箱地址 永远不会 公布。

允许部分 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 内容相关的,灌水、攻击性或不恰当的评论 可能 会被编辑或删除。

 
本WordPress博客由爱写字提供技术支持
Switch to our mobile site