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交換文件
dd if=/dev/zero of=swapfile bs=1024 count=262144
/sbin/mkswap swapfile
/sbin/swapon swapfile
2、加到fstab文件中讓系統引導時自動啓動
在末尾增加以下內容:
詳見:http://blog.s135.com/post/374.htm
二、Nginx 0.7.19 的主配置文件(nginx.conf)優化
#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;
}
}
三、PHP 5.2.6(FastCGI)的配置優化
1、php.ini 配置文件中關於eAcelerator的優化。只使用1M共享內存,刪除所有在最後3600秒內無法存取的腳本緩存,用磁盤輔助進行緩存。
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個:
二是修改以下一行,將TCP模式改爲Unix Socket模式:
四、MySQL 5.1.26 配置優化
1、使用以下參數編譯安裝的 MySQL 5.1 默認支持4種存儲引擎:CSV、MRG_MYISAM、MEMORY、MyISAM,不支持InnoDB存儲引擎。由於內存有限,而InnoDB耗費的內存較大,這裏推薦使用MyISAM存儲引擎。
make && make install
2、MySQL 5.1 配置文件(my.cnf)優化
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