坚信科学,分享技术

2018全新版本,未来在blog.54chen.com更新博客!

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创]

[ 文章作者:陈臻 本文版本:v1.0 最后修改:2009.8.2 转载请注明原文链接:http://www.54chen.com/688-wordpress-nginx-php-cgi-mysql-memory-in-the-128m-to-install-and-optimize-the-vps-notes/ ]

选取CentOS,因为它是号称最安全及性能都相对较好的Linux系统。系统内存128m,系统用掉30m,有100m左右可用(如图1所示),swap已经有256M,硬盘为5G,除去系统后大约有4G可供捣腾。


图1。

 

首先,在空白的系统上使用下面的命令,安装gcc等一堆工具和后面php会用到的一些包:

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

yum这一堆东西会有点慢,这里正好插播一下,mysql的编译在128的内存下非常慢,所以呆会儿我们会采取直接yum,php、nginx都下源码编译,经过以往的经验eAccelerator、Xcache和Zend Optimizer这三者,最好是用eAccelerator搭配Zend Optimizer能给php加速得到最佳效果,当然了,Zend Optimizer需要Zend Guard来搭配,而后者是收费的,伟大的中国人有伟大的破解。

我执行的时候耗时32分钟左右。

言归正传,继续:
wget http://sysoev.ru/nginx/nginx-0.7.61.tar.gz
wget http://www.php.net/get/php-5.2.10.tar.gz/from/this/mirror
wget http://blog.s135.com/soft/linux/nginx_php/phpfpm/php-5.2.10-fpm-0.5.11.diff.gz
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz [nginx rewrite使用]

【安装MySQL
yum install -y mysql-server
启动MySQL:
service mysqld start
设置mysql数据库root帐号密码:
mysqladmin -u root password 'newpassword' [引号内填密码]
让mysql更安全:
mysql -u root -p [此时会要求你输入刚刚设置的密码,输入后回车即可]

mysql> DROP DATABASE test; [删除test数据库]
mysql> DELETE FROM mysql.user WHERE user = ''; [删除匿名帐户]
mysql>DELETE FROM mysql.user WHERE password = '';[删除无密码帐户]
mysql> FLUSH PRIVILEGES; [重载权限]

【优化MySQL】
此时的mysql直接吃掉20m左右的内存,如图2所示。我们要对其进行优化,关掉innodb

图2。

 

 

 

 

vi /etc/my.cnf
在后面增加如下内容:

skip-innodb
[mysql]
no-auto-rehash

[mysqld]
user = mysql
port = 3306
open_files_limit = 600
back_log = 20
max_connections = 100
max_connect_errors = 200
table_cache = 60
external-locking = FALSE
max_allowed_packet = 16M
sort_buffer_size = 128K
join_buffer_size = 128K
thread_cache_size = 10
thread_concurrency = 8
query_cache_size = 0M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
default_table_type = MyISAM
thread_stack = 192K
transaction_isolation = READ-UNCOMMITTED
tmp_table_size = 512K
max_heap_table_size = 32M
long_query_time = 1
log_long_format
server-id = 1
binlog_cache_size = 2M
max_binlog_cache_size = 4M
max_binlog_size = 512M
expire_logs_days = 7
key_buffer_size = 4M
read_buffer_size = 1M
read_rnd_buffer_size = 2M
bulk_insert_buffer_size = 2M
myisam_sort_buffer_size = 4M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover

[mysqldump]
quick
max_allowed_packet = 16M

【重启MySQL】
service mysqld restart
再看mysql吃掉的内存,已经降低了四分之一,如图3所示:
图3。

 

 

 

 

【安装php】
首先使用yum安装上mysql的开发包,供php扩展mysql使用:
yum -y install mysql-devel
安装patch工具:
yum -y install patch
tar zxvf php-5.2.10.tar.gz
gzip -cd php-5.2.10-fpm-0.5.11.diff.gz | patch -d php-5.2.10 -p1
cd php-5.2.10
./configure --prefix=/opt/php --with-config-file-path=/opt/php/etc --with-mysql=/usr/share/mysql --with-mysqli=/usr/bin/mysql_config --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-gd --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --without-pear
make && make install

把pear手动装上(这个是5.2.10的一个bug,后面可能已经打补丁了):
curl http://pear.php.net/go-pear | /opt/php/bin/php
cp php.ini-dist /opt/php/etc/php.ini

【安装eaccelerator】
tar jxvf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3
/opt/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/opt/php/bin/php-config
make && make install

mkdir -p /opt/eaccelerator_cache
vi /opt/php/etc/php.ini

添加下面的内容:
[eaccelerator]
zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

 

【安装Zend Optimizer】
要去zend.com上注册用户名后进download页面下载,这里太弱智了,不知道zend是否有专门的产品人员,这种注册下载有什么意义,只是一堆死账号而已。
下载ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz
tar -zxvf ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz
cd ZendOptimizer-3.3.3-linux-glibc23-i386
./install

运行过程中会要求你写些安装路径啥的,照着写就是。
如果出现类似下面的错误:
./install-tty: line 139: ./php: cannot execute binary file
那说明你下错了包了,这种情况是因为你32位的系统下了64位的包或者是反过来。

【安装nginx】
tar -zxvf pcre-7.9.tar.gz
cd pcre-7.9
./configure
make && make install
cd ..

tar zxvf nginx-0.7.61.tar.gz
cd nginx-0.7.61
./configure --user=www --group=www --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

增加www用户:
groupadd www
useradd -g www www

【优化php\nginx】
1.优化php-fpm.conf
vi /opt/php/etc/php-fpm.conf
修改log level为error:
error
修改max_children:
5
修改listen_address为unix socket方式运行:
/tmp/php-cgi.sock

2.优化nginx.conf
vi /opt/nginx/conf/nginx.conf
在events中增加:
use epoll;
在http中增加下面的代码,打开gzip:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
在使用php的server中使用unix socket通信方式:
fastcgi_pass unix:/tmp/php-cgi.sock;

【设置开机启动】
/sbin/chkconfig --add mysqld [在服务清单中添加mysql服务]
/sbin/chkconfig mysqld on [设置mysql服务开机启动]

vi /etc/rc.locale
加入两行:
/opt/php/sbin/php-fpm start
/opt/nginx/sbin/nginx

【误区提示】
XEN更像物理服务器,会尽量把剩余的内存当成buffer和cache,所以看到下图的时候不要惊慌,其实内存都在cache里了。
图4

 

 

【wordpress专项优化】
使用wp-super-cache插件,将页面生成html,省去php的开销,性能有提升。
对照access log,刷新页面,看堵在什么地方

【几个建议】
合并css js个数 并且压缩 速度提升明显
wordpress没有任何插件的时候,效率是很不错的,但是有些不负责任的插件会导致整体看起来很慢,下面是一些常用的插件的问题:
1.twitter tools插件:用来从后端取twitter数据的,这个插件搞了一个js一个css在head里,并且都是通过php生成的,两个php请求,让首页很慢。建议去掉(可能会影响自动化?没来得及分析细节)。
2.wp-spamfree插件:用来做antispam的,这是一个动态生成的js,不知道为什么非常慢。建议换别的插件。

【结果展示】
在完成上述一系列的操作后,http://54chen.com 我是陈科学院的打开速度已经非常迅速了,基本上一秒钟就能全部显示。内存还有40m空闲,如图5所示:
图5


原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]
本文链接: http://www.54chen.com/architecture/wordpress-nginx-php-cgi-mysql-memory-in-the-128m-to-install-and-optimize-the-vps-notes.html

This entry was posted in 架构研究 and tagged , , , . Bookmark the permalink.

37 Responses to “wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创]”

  1. 江江 说:

    测试顶一个

  2. zhu 说:

    发现有验证码了,是不是树大招风了 ^-^

  3. cc0cc 说:

    一直就有国外的垃圾机器人来发广告呢,这次优化把原来看不倒的基于cookies的antispam插件换成现在这个了,原来的太慢了。冒似这个验证码非常难认

  4. cc0cc 说:

    老罗驾到 哈哈

  5. 我好几个WP的blog整天遭受国外垃圾评论骚扰,不错都被屏蔽,嘿嘿

  6. cc0cc 说:

    兄弟你再用这个名字我就要删除了哈

  7. 王猛 说:

    hi,朋友。
    我们是不是邻居呢?
    我和你是同一间公司的VPS,我在硅谷机房。
    我是一台256M的VPS,我用的是Ubuntu 9.04这个系统。
    我的整个配置都是自己编译而来的,使用了intel c++这个编译器。
    从CentOS 5.1全部yum来的apache mysql php,只能承受162个攻击。
    而在我自行编译配置后,已经可以达到600次攻击的水准。
    我想说的是,这个nginx的配置里有一个问题。目前,客户基本上都是XP系统,而这个系统是IE6作为默认浏览器。IE6支持HTTP 1.1标准。
    配置上,写的1.0.
    nginx的处理过程是当客户以1.1协议访问时,进行缓存。当客户以1.0访问时,丢弃原来的1.1缓存,重新生成;当1.1客户来访时,1.0缓存又一次丢失,再重新生成。 -_-
    考虑1.1用的人多余1.0,因此最好改为1.1。

  8. 王猛 说:

    -_-
    当我给你post完这篇日志的时候,0.8.9发布了。
    我回去升级我的nginx了。

  9. hnws 说:

    请问你开了多少个 php_cgi 的进程 ?

  10. cc0cc 说:

    5个 效果还行

  11. 惑者 说:

    我也在用 rashost 的128VPS,不过用的Ubuntu9.04
    同样也安装了Nginx WordPress,其中Nginx是编译的,其他都是aptitude的
    不过mysql 一起来内存就被吃光了,虚存都被吃了一半
    访问页面比蜗牛还慢,不知道是配置问题还是安装的包不对
    看到这个帖子,要仔细学习下,希望站长多指教

  12. cc0cc 说:

    mysql的innodb引擎比较吃内存 可以关掉 方法见正文
    默认的php-cgi模块比较多 也比较吃内存 建议自己编译

  13. 惑者 说:

    我遇到个比较奇怪的现象,通过aptitude 安装mysql-server-5.0之后
    启动正常,然后我开始按照本博文的介绍修改配置文件
    restart显示失败,然后我将原来的配置文件恢复,依旧显示失败
    请问看哪个log能够帮助判断出问题所在?

  14. cc0cc 说:

    你可以看看 /var/log/mysqld.log
    不确定这个路径是否一定在

  15. unixhater 说:

    你好,我根据你的配置一步步来安装,发现一些错误

    mysql删用户的命令有中文
    安装ea时,php.ini设置中的引号带中文,还有目录写错了(貌似这配置与张宴那篇神似^_^)
    nginx的configure时有中文会出错

    另外我在pear,ZendOptimizer安装,与nginx,php-fpm用户设置时碰到点小问题,不过都解决了。

  16. cc0cc 说:

    呵呵 兄弟真是细心
    这个blog系统比较原始 以至于半角的东西全被自动转成了全角 不知道有什么好的插件可以解决这个问题不

  17. [...] 第二部分wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创]千橡、校内网、人人网急聘 Flash AS3工程师、Social Game [...]

  18. [...] 此时再修改php-fpm.conf 将user group都修改成root(经过上面的修改php-fpm已经支持root了)。 [...]

  19. 比卡超 说:

    请问CentOS是什么版本呢???

  20. cc0cc 说:

    redhat.com发布redhat 9(简写为rh9)后,不再开发redhat 10,11...,全面转向redhat enterprise linux(简写为rhel)的开发,和以往不同的是,新的rhel 3要求用户先购买lisence,redhat.com承诺保证产品的稳定性,安全性。rhel 3二进制代码不再提供下载,而是作为redhat 服务的一部分,但源代码依然是open。所以有了centos ,whitebox,dao 等等一批open source的企业版本,其中centos最为活跃。
    --你可以多用用搜索引擎的

  21. 比卡超 说:

    可能你误会了。。我找到的Cent有1.0~5.x版本。请问你是安装哪个?

  22. cc0cc 说:

    哈哈,果真是误会了
    我的是4.x版本的

  23. hnws 说:

    我的256M的VPS上系统是Fedora 11,php和php-cgi和spwan-php是使用源里的包。
    已经将php-cgi的数量改为3个。
    但是一直两个左右php-cgi每个占用大概50M的内存。
    请问这大概是怎么回事?我是否需要提供进一步信息?
    我在google上找了许久都没有类似的情况。

  24. cc0cc 说:

    php-cgi应该不是很吃内存吧,你尝试通过源码编译,尽可能减少所支持的扩展可以得到改善

  25. shiny 说:

    我用的也是rashost的128M的VPS~
    在swap使用较多的时候速度明显变慢~~
    php-cgi进程大概占30MB左右,不得不改少进程数。
    3个还能稳定运行~
    考虑升级内存ing

  26. [...] 为人人设计的分布式key-value系统架构[原创]wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创][十一归来]ubuntu 9.10 [...]

  27. [...] wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创] (27) [...]

  28. [...] 半年最受欢迎的 [十一归来]ubuntu 9.10 硬盘安装手记为人人设计的分布式key-value系统架构[原创]wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创][科学院手记]人人网新鲜事分享现场转播[原创]使用postgreSQL+bamboo搭建比lucene方便N倍的全文搜索 第二部分[原创]mediawiki安装改进手记-使用mediawikit和postgresql搭建有强大搜索功能的wikiLinkIn基于Dynamo设计的系统:伏地魔(voldemort)设计中文文档[我是陈科学院译]-完稿千橡、校内网、人人网急聘 Flash AS3工程师、Social Game 游戏策划x200 ntfs硬盘安装ubuntu9.10正式版手记用java并发测试tokyo cabinet的性能[五四陈手记] [...]

  29. [...] 解读PHP开源项目中列表和hook方法:while(has_items()): thme_ite();和apply_filters 2010年02月08日 17:23五四陈科学院-php与java科学院我要评论(0) 字号:T|T 在wordpress,lilina等开源项目中,常常会看到一些莫名的代码,来无影去无踪,看上去很有意味,特地拿来分析分析,看看一般的作法。 [...]

  30. [...] wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创] [...]

  31. [...] 一个WEB服务器,跑nginx 0.6。前端一squid 2.6代理。用户访问先经过squid。 [...]

  32. [...] wordpress nginx php-cgi mysql在128m内存下的vps安装和优化手记[原创] [...]

  33. alswl 说:

    感谢您的教程,终于把vps内存降下来了

  34. alswl 说:

    大哥,您现在还是用的128M VPS么,我并发10个连接,击中1749次,100%命中,太牛逼了

Leave a Reply