Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小內存VPS服務器上的配置優化

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.s135.com/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.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秒內無法存取的腳本緩存,用磁盤輔助進行緩存。
引用
[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章