對其使用者和應用程式來講,每一個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
詳見:
--------------------------------------------------------------------------------
二、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.s135.com 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&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;
}
}