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 的优化.

优化后的效果: 提供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,就更好了.

优化项如下: 零、充分利用多核 Nginx 在 Linux 上有一个 worker_cpu_affinity 参数,可以为每个工作进程绑定到不同的 CPU ,所以如果你的 VPS 具有多核的话,那么可以充分利用各 CPU .比如如果有 4 个 CPU,那么可以进行如下配置:

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

一、增加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

二、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  www.s135.com s135.com *.s135.com;
        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?=$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)优化

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

3.重启MySQL

service mysqld restart
#让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; [重载权限]