[文章作者:张宴 本文版本:v1.0 最后修改:2008.10.28 转载请注明原文链接:http://blog.zyan.cc/post/375/]

  VPS(全称Virtual Private Server)是利用最新虚拟化技术在一台物理服务器上创建多个相互隔离的虚拟私有主机。它们以最大化的效率共享硬件、软件许可证以及管理资源。对其用户和应用程序来讲,每一个VPS平台的运行和管理都与一台独立主机完全相同,因为每一个VPS均可独立进行重启并拥有自己的root访问权限、用户、IP地址、内存、过程、文件、应用程序、系统函数库以及配置文件。

  VPS服务器最重要的指标就是内存大小,多个VPS服务器可以共享一颗CPU,但不能共享同一块内存。内存越大,价格越贵。

  下面,以我的博客所在的VPS为例,介绍在128M内存下对 Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 的优化。

  至于 Nginx + PHP + MySQL 的安装配置,可参见:《Nginx 0.7.x + PHP 5.2.6(FastCGI)搭建胜过Apache十倍的Web服务器(第4版)



  优化后的效果:

  提供HTTP服务的1个Nginx进程占用11M物理内存,5个php-cgi进程每个占用8M左右物理内存,1个MySQL服务器占用7M物理内存,加上两个占用内存不大的Nginx和php-cgi父进程,Nginx + PHP + MySQL 系列总共只占用47.7%的物理内存,即62M物理内存(128M * 47.7% ≈ 62M)。

  点击在新窗口中浏览此图片

  另外,VPS服务器系统自身和其它程序也会使用一些内存,但128M内存的VPS已经够用。总体而言,经过优化后,128M内存的VPS跑 Nginx + PHP + MySQL 效果不错。当然,如果有Money购买更大内存的VPS,就更好了。



  优化项如下:

  一、增加256M的swap交换文件
  1、创建并激活swap交换文件
cd /var/
dd if=/dev/zero of=swapfile bs=1024 count=262144
/sbin/mkswap swapfile
/sbin/swapon swapfile


  2、加到fstab文件中让系统引导时自动启动
vi /etc/fstab

在末尾增加以下内容:
引用
/var/swapfile swap swap defaults 0 0

  详见:http://blog.zyan.cc/post/374.htm



  二、Nginx 0.7.19 的主配置文件(nginx.conf)优化
引用
user  www www;


#Nginx每个进程耗费10M~12M内存,这里只开启一个Nginx进程,节省内存。
worker_processes 1;

error_log  /data1/logs/nginx_error.log  crit;

pid        /usr/local/webserver/nginx/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;

events
{
use epoll;
worker_connections 51200;
}

http
{
include       mime.types;
default_type  application/octet-stream;

#charset  gb2312;
    
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
    
sendfile on;
tcp_nopush     on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#对网页文件、CSS、JS、XML等启动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;


#limit_zone  crawler  $binary_remote_addr  10m;

server
{
   listen       80;
   server_name  blog.zyan.cc www.zyan.cc zyan.cc *.zyan.cc;
   index index.html index.htm index.php;
   root  /data0/htdocs/blog;

   #limit_conn   crawler  20;    

   #针对Bo-Blog系统的Rewrite静态化
   rewrite ^/post/([0-9]+).htm$ /read.php?$1 last;
   rewrite ^/post/([0-9]+)_([0-9]+).htm$ /read.php?$1&page=$2 last;
   rewrite ^/post/([0-9]+)_([0-9]+)_([0-9]+).htm$ /read.php?$1&page=$2&part=$3 last;
   rewrite ^/index_([0-9]+)_([0-9]+).htm$ /index.php?mode=$1&page=$2 last;
   rewrite ^/star_([0-9]+)_([0-9]+).htm$ /star.php?mode=$1&page=$2 last;
   rewrite ^/category_([0-9]+).htm$ /index.php?go=category_$1 last;
   rewrite ^/category_([0-9]+)_([0-9]+)_([0-9]+).htm$ /index.php?go=category_$1&mode=$2&page=$3 last;
   rewrite ^/archive_([0-9]+)_([0-9]+).htm$ /index.php?go=archive&cm=$1&cy=$2 last;
   rewrite ^/archive_([0-9]+)_([0-9]+)_([0-9]+)_([0-9]+).htm$ /index.php?go=archive&cm=$1&cy=$2&mode=$3&page=$4 last;
   rewrite ^/showday_([0-9]+)_([0-9]+)_([0-9]+).htm$ /index.php?go=showday_$1-$2-$3 last;
   rewrite ^/showday_([0-9]+)_([0-9]+)_([0-9]+)_([0-9]+)_([0-9]+).htm$ /index.php?go=showday_$1-$2-$3&mode=$4&page=$5 last;

   location ~ .*\.(php|php5)?$
   {
     #将Nginx与FastCGI的通信方式由TCP改为Unix Socket。TCP在高并发访问下比Unix Socket稳定,但Unix Socket速度要比TCP快。
     fastcgi_pass  unix:/tmp/php-cgi.sock;
     #fastcgi_pass  127.0.0.1:9000;

     fastcgi_index index.php;
     include fcgi.conf;
   }

   location ~ /read.php
   {
     #将Nginx与FastCGI的通信方式由TCP改为Unix Socket。TCP在高并发访问下比Unix Socket稳定,但Unix Socket速度要比TCP快。
     fastcgi_pass  unix:/tmp/php-cgi.sock;
     #fastcgi_pass  127.0.0.1:9000;

     fastcgi_index index.php;
     include fcgi.conf;
   }
  
   #博客的图片较多,更改较少,将它们在浏览器本地缓存15天,可以提高下次打开我博客的页面加载速度。
   location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
   {
     expires      15d;
   }


   #博客会加载很多JavaScript、CSS,将它们在浏览器本地缓存1天,访问者在看完一篇文章或一页后,再看另一篇文件或另一页的内容,无需从服务器再次下载相同的JavaScript、CSS,提高了页面显示速度。
   location ~ .*\.(js|css)?$
   {
     expires      1d;
   }  


   log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
             '$status $body_bytes_sent "$http_referer" '
             '"$http_user_agent" $http_x_forwarded_for';
   access_log  /data1/logs/access.log  access;
   }
}




  三、PHP 5.2.6(FastCGI)的配置优化
  1、php.ini 配置文件中关于eAcelerator的优化。只使用1M共享内存,删除所有在最后3600秒内无法存取的脚本缓存,用磁盘辅助进行缓存。
引用
[eaccelerator]
zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="1"
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"
eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"


  2、php-fpm.conf 的配置优化
  修改两项,一是修改以下一行,将启动的php-cgi进程数由原来的128个改为5个:
引用
<value name="max_children">5</value>

  二是修改以下一行,将TCP模式改为Unix Socket模式:
引用
<value name="listen_address">/tmp/php-cgi.sock</value>




  四、MySQL 5.1.26 配置优化
  1、使用以下参数编译安装的 MySQL 5.1 默认支持4种存储引擎:CSV、MRG_MYISAM、MEMORY、MyISAM,不支持InnoDB存储引擎。由于内存有限,而InnoDB耗费的内存较大,这里推荐使用MyISAM存储引擎。
./configure --prefix=/usr/local/webserver/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile
make && make install


  2、MySQL 5.1 配置文件(my.cnf)优化
引用
[client]
port    = 3306
socket  = /tmp/mysql.sock

[mysql]
prompt="(\u:s135:)[\d]> "
no-auto-rehash

[mysqld]
user    = mysql
port    = 3306
socket  = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /usr/local/webserver/mysql/data
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
/usr/local/webserver/mysql/data/slow.log
/usr/local/webserver/mysql/data/error.log
long_query_time = 1
log_long_format
server-id = 1
#log-bin = /usr/local/mysql/data/binlog
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




Tags: , , , ,



技术大类 » Web服务器 | 评论(101) | 引用(0) | 阅读(186900)
无名 Email
2008-10-28 17:31
我想知道优化前的内存站用情况!!??
zeagles
2008-10-28 18:29
研究研究~~
爱月 Homepage
2008-10-29 07:58
哇~更新的真快~昨天刚做完服务器配置~今天刚好有优化设置~太棒了~
不过我在unixSNS的Nginx组群里提的问题木有人回答哦。。。张大大拜托看下回答下,谢谢啦~
jcold
2008-10-29 08:32
可不可以问下,你的VPS在哪个地方买的?
呵呵
2008-10-29 13:31
badzan  好使
sszxgwh Email
2008-10-29 15:54
老大动作真快grin
参考学习学习
iakuf Email Homepage
2008-10-30 00:07
什么地方的空间啊,我也想买一个介绍一下
jason
2008-10-30 10:11
好奇128M可以应负的访问量
KENN
2008-10-30 18:45
首先感谢APMServ5.2.6开发者张宴,这个软件真的很不多,特别适合我们新手,呵呵!谢谢了!

我有些问题需要请教,希望张宴能抽空回答一下,万分感谢!

我的是一台家用电脑装APMServ5.2.6的,操作系统是XP,在测试过程中,发现配置以下问题:

worker_processes 1;#一台独立的服务器,进程数最好设置是多少?

error_log  /APMServ5.2.6/APMServ5.2.6/nginx/logs/error.log  crit;

pid        /APMServ5.2.6/APMServ5.2.6/nginx/logs/nginx.pid;

events {
   worker_connections  64;#并发数只有64会不会太少呢,我尝试修改大于64,发现行不通,请问是什么问题,怎样才能修改加大呢.
}

如何增加在 Nginx 下虚拟主机呢.
还有如何限制每个IP并发数呢?
xi2008wang
2008-10-31 00:54
@KENN

1.进程数看CPU与内存, 一般两核2个, 4核4个
2.events事件处理方法默认是select最大支持64, 使用epoll可以支持更大的连接数
3.增加虚拟主机,只要复制一段server, 再修改一下就可以了
4.单IP并发数, 使用 limit_conn httplimit指令
LEO Homepage
2008-10-31 12:03
张大师厉害啊,折腾vps啦

谢谢分享,很有参考价值grin
kenn
2008-10-31 23:06
感谢xi2008wang的热心回答
温泉の泡泡
2008-11-1 02:48
stupid我测试去看看,谢谢张宴的文章
aixin
2008-11-1 13:21
128可以承受的并发是多少!
digitalpmp
2008-11-4 12:34
[root@server source]# swapon /var/swapfile
swapon: /var/swapfile: Operation not permitted

为什么我创建不了 swap?
shitou
2008-11-7 01:38
请问,如何设置URL静态化呢 ?
zhongweixiaoye Email
2008-11-12 16:20
张大哥 ,请问你熟悉GNU Hosting Helper吗,是否有相关的文档可以共享的,如果你有相关的资料共享一下可以吗?谢谢了,我在网上没有找到相关的资料!
dd
2008-11-12 19:47
如果我的系统是solaris 这个方面怎么优化,例如    worker_connections  和worker_processes 同时  client_header_timeout  10m;client_body_timeout 10m;  send_timeout  connection_pool_size  256;  client_header_buffer_size 1k;  
large_client_header_buffers 4 2k;  request_pool_size  这个东西需要设置吗?
王猛 Email Homepage
2008-12-23 20:18
博主,好厉害呢。
我想请教一个问题。在PHP程序中,很多东西都是动态的,而eaccelerator是一个Cache,那么对于阅读数等,都给Cache进去了,会不会造成计数不准或者显示不准呢?我想了解下,这个如何处理。谢谢!
allen
2009-1-11 12:06
如果是在256M内存且其他条件相同的VPS上,那该如何优化?
分页: 1/6 第一页 1 2 3 4 5 6 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]