2010年12月13日 星期一

Nginx + PHP-FPM + APC=絕妙的組合

瀏覽數
來源:  http://developer.51cto.com/art/201005/198527.htm 本文將介紹目前讓PHP最快的方法:Nginx + PHP-FPM + APC,看似有些複雜,實際上我們只需要幾個步驟就可以完成,並且性能遠超Apache,有興趣的朋友不妨去試一試。 背景 過去兩年多來,我們的網站一直運行Apache+mod_php模塊,大多數時候這個組合應付得過來,但隨著流量的增加,我們注意到Apache已經顯得很吃力了,它開始瘋狂地吃內存,CPU也被全部搶佔去了,我們需要找到一個更快的方法來解決問題。 Nginx是一個不錯的選擇,很多指標都超過了Apache,如I/O、CPU、內存和請求數/秒等,如果需要,隨時可以從Google搜索相關信息。從我個人的測試結果來看,Nginx和Apache之間的差異是很明顯的,不好意思,因為是非正式測試,因此相關數字我就不公佈了,這也不是本文的重點。讓我更自信的是,我只需要幾個步驟就可以讓性能遠超Apache。 PHP-FPM? 很多人配置Nginx時可能都會選擇來自LightTPD項目的spawn-fcgi解析PHP,但使用spawn-fcgi有些問題,因此我打算放棄它另覓別的辦法。PHP-FPM是PHP FastCGI Process Manager的縮寫,即PHP FastCGI進程管理器,實際上它是PHP的一個補丁,旨在將FastCGI進程管理整合進PHP包中。 注意:即使你堅持使用Apache,也有很多原因跳過mod_php,直接通過FastCGI解析PHP。使用mod_php時,Apache處理載入PHP的每個請求會載入所有的庫,這是一個巨大的無畏開銷。如果使用FastCGI,PHP的行為更像應用程序服務器,PHP-FPM以及spawn-fcgi按需要載入和殺掉PHP實例,這樣做有很多好處,其中很重要的一點就是減少內存開銷。 讓我們開始吧 我們使用的是全新安裝的Ubuntu 8.10 Intrepid,第一件事情是安裝所有的依賴包。 sudo apt-get install make bison flex gcc patch autoconf subversion locate   sudo apt-get install libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev   準備好依賴包之後,我們就可以開始。 編譯PHP 我們下載的是PHP 5.2.8源代碼包,還有對應的PHP-FPM補丁,我們先打上補丁,然後再編譯。 cd /usr/local/src/   sudo wget http://us.php.net/get/php-5.2.8.tar.gz/from/this/mirror   sudo tar zvxf php-5.2.8.tar.gz   sudo wget http://php-fpm.anight.org/downloads/head/php-5.2.8-fpm-0.5.10.diff.gz   sudo gzip -cd php-5.2.8-fpm-0.5.10.diff.gz | sudo patch -d php-5.2.8 -p1   cd php-5.2.8   sudo ./configure --enable-fastcgi --enable-fpm --with-mcrypt --with-zlib --enable-mbstring --disable-pdo --with-pgsql --with-curl --disable-debug --enable-pic --disable-rpath --enable-inline-optimization --with-bz2 --with-xml --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-xslt --enable-memcache --enable-zip --with-pcre-regex   sudo  make all install   sudo  strip /usr/local/bin/php-cgi  如果在運行上面命令時遇到錯誤,很可能是因為缺少依賴包造成的。另外,確保你正確啟用和禁用了特定的PHP配置選項。緊接著我們通過PECL安裝一些將會用到的模塊: sudo pecl install memcache   sudo pecl install apc   sudo pecl install syck-beta  在安裝apc模塊時,請務必關閉Apache選項,如果你沒有關閉,它也會提醒你。接下來複製我們常用的php.ini: sudo cp /usr/local/src/php-5.2.8/php.ini-recommended /usr/local/lib/php.ini    最後,我們建立符號鏈接: sudo mkdir /etc/php/   sudo ln -s /usr/local/lib/php.ini /etc/php/php.ini   sudo ln -s /usr/local/etc/php-fpm.conf /etc/php/php-fpm.conf  PHP編譯到此結束,剩下要做的事情是修改php-fpm.conf設置,用文本編輯器打開/etc/php/php-fpm.conf,將進程屬主用戶修改為www-data,這個文件比較大,因此最好使用搜索功能,我想修改的值分別位於51、52、63和66行。 < value   name = "owner" > www-data value >   < value   name = "group" > www-data value >   < value   name = "user" > www-data value >   < value   name = "group" > www-data value >   Nginx 和編譯PHP一樣非常簡單: cd ..   sudo wget http://sysoev.ru/nginx/nginx-0.6.35.tar.gz   sudo tar zxvf nginx-0.6.35.tar.gz   sudo rm -f nginx-0.6.35.tar.gz   cd nginx-0.6.35   sudo ./configure  --sbin-path =/usr/local/sbin --with-http_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module   sudo make && sudo make install  再創建一個鏈接: sudo ln -s /usr/local/nginx/conf /etc/nginx    下一步是可有可無的,但我一直使用至今,說說也無妨。打開/etc/nginx/nginx.conf,最終修改結果如下: user  www-data;   worker_processes  6;     events {       worker_connections  1024;   }     http {       include       mime.types;       default_type  application/octet-stream;       sendfile        on;       keepalive_timeout  10 10;         gzip  on;       gzip_comp_level 1;       gzip_proxied any;       gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;             log_format main '$remote_addr - $remote_user   '                     '"$request" $status  $body_bytes_sent "$http_referer" '                     '"$http_user_agent" "$http_x_forwarded_for"';             access_log  /var/log/nginx_access.log  main;             error_log  /var/log/nginx_error.log debug;             include /usr/local/nginx/sites-enabled/*;   }  我們也設置了一些FastCGI參數,讓PHP不會噎著,也可以避免Nginx 503錯誤,打開/etc/nginx/fastcgi_params,添加以下參數: fastcgi_connect_timeout 60;   fastcgi_send_timeout 180;   fastcgi_read_timeout 180;   fastcgi_buffer_size 128k;   fastcgi_buffers 4 256k;   fastcgi_busy_buffers_size 256k;   fastcgi_temp_file_write_size 256k;   fastcgi_intercept_errors on;  最後,我們創建一個SystemV風格的啟動腳本,保存為/etc/init.d/nginx。 #! /bin/sh   ### BEGIN INIT INFO   # Provides:          nginx   # Required-Start:    $all   # Required-Stop:     $all   # Default-Start:     2 3 4 5   # Default-Stop:      0 1 6   # Short-Description: starts the nginx web server   # Description:       starts nginx using start-stop-daemon   ### END INIT INFO     PATH =/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin   DAEMON =/usr/local/sbin/nginx   NAME = nginx   DESC = nginx     test -x $DAEMON || exit 0     # Include nginx defaults if available   if   ; then           . /etc/default/nginx   fi     set -e     case "$1" in     start)           echo -n "Starting $DESC: "           start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \                   --exec $DAEMON -- $DAEMON_OPTS           echo "$NAME."           ;;     stop)           echo -n "Stopping $DESC: "           start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \                   --exec $DAEMON           echo "$NAME."           ;;     restart|force-reload)           echo -n "Restarting $DESC: "           start-stop-daemon --stop --quiet --pidfile \                   /usr/local/nginx/logs/$NAME.pid --exec $DAEMON           sleep 1           start-stop-daemon --start --quiet --pidfile \                   /usr/local/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS           echo "$NAME."           ;;     reload)         echo -n "Reloading $DESC configuration: "         start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/$NAME.pid \             --exec $DAEMON         echo "$NAME."         ;;     *)            N =/etc/init.d/$NAME           echo "Usage: $N {start|stop|restart|force-reload}"  > &2           exit 1           ;;   esac     exit 0  不要忘了設置可執行權限。 設置你的網站 這一階段的工作主要按你自己的習慣完成,這裡僅做一個粗略的介紹。首先我們創建一個目錄來存放我們的網站配置文件: sudo mkdir /usr/local/nginx/sites-enabled   sudo ln -s /usr/local/nginx/sites-enabled /etc/sites    接下來為我們的網站增加一個conf文件/etc/sites/default.conf,內容如下: server {           listen *:80;             location / {                   root   /var/www/default/pub;                   index index.php;                     # if file exists return it right away                   if (-f $request_filename) {                           break;                   }                     # otherwise rewrite the fucker                   if (!-e $request_filename) {                           rewrite ^(.+)$ /index.php$1 last;                           break;                   }             }             # if the request starts with our frontcontroller, pass it on to fastcgi           location ~ ^/index.php           {                   fastcgi_pass 127.0.0.1:9000;                   fastcgi_param SCRIPT_FILENAME /var/www/default/pub$fastcgi_script_name;                   fastcgi_param PATH_INFO $fastcgi_script_name;                   include /usr/local/nginx/conf/fastcgi_params;           }   }  上面這個conf文件控制網站的前端風格,其中包括Wordpress,cake等,注意靜態內容不是通過FastCGI解析的。另外,你可能需要修改/var/www/default文件,設置網站文件的默認放置位置。 啟動 我們的工作結束了,啟動看一下效果。 sudo php-fm start   sudo /etc/init.d/nginx start  現在可以測試一下你的網站,看看它工作得如何,如有任何疑問,請隨時提出。 原文名:NGINX + PHP-FPM + APC = Awesome          原文出處: interfacelab.com/nginx-php-fpm-apc-awesome/

沒有留言: