Nginx + PHP-FPM + APC=絕妙的組合_Web服務(wù)器教程
相關(guān)文章推薦:nginx學(xué)習(xí)教程初級(jí)篇 nginx+apache+squid搭建集群web環(huán)境
背景
過去兩年多來,我們的網(wǎng)站一直運(yùn)行Apache+mod_php模塊,大多數(shù)時(shí)候這個(gè)組合應(yīng)付得過來,但隨著流量的增加,我們注意到Apache已經(jīng)顯得很吃力了,它開始瘋狂地吃內(nèi)存,CPU也被全部搶占去了,我們需要找到一個(gè)更快的方法來解決問題。
Nginx是一個(gè)不錯(cuò)的選擇,很多指標(biāo)都超過了Apache,如I/O、CPU、內(nèi)存和請(qǐng)求數(shù)/秒等,如果需要,隨時(shí)可以從Google搜索相關(guān)信息。從我個(gè)人的測(cè)試結(jié)果來看,Nginx和Apache之間的差異是很明顯的,不好意思,因?yàn)槭欠钦綔y(cè)試,因此相關(guān)數(shù)字我就不公布了,這也不是本文的重點(diǎn)。讓我更自信的是,我只需要幾個(gè)步驟就可以讓性能遠(yuǎn)超Apache。
PHP-FPM?
很多人配置Nginx時(shí)可能都會(huì)選擇來自LightTPD項(xiàng)目的spawn-fcgi解析PHP,但使用spawn-fcgi有些問題,因此我打算放棄它另覓別的辦法。PHP-FPM是PHP FastCGI Process Manager的縮寫,即PHP FastCGI進(jìn)程管理器,實(shí)際上它是PHP的一個(gè)補(bǔ)丁,旨在將FastCGI進(jìn)程管理整合進(jìn)PHP包中。
注意:即使你堅(jiān)持使用Apache,也有很多原因跳過mod_php,直接通過FastCGI解析PHP。使用mod_php時(shí),Apache處理載入PHP的每個(gè)請(qǐng)求會(huì)載入所有的庫,這是一個(gè)巨大的無畏開銷。如果使用FastCGI,PHP的行為更象應(yīng)用程序服務(wù)器,PHP-FPM以及spawn-fcgi按需要載入和殺掉PHP實(shí)例,這樣做有很多好處,其中很重要的一點(diǎn)就是減少內(nèi)存開銷。
讓我們開始吧
我們使用的是全新安裝的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
準(zhǔn)備好依賴包之后,我們就可以開始。
編譯PHP
我們下載的是PHP 5.2.8源代碼包,還有對(duì)應(yīng)的PHP-FPM補(bǔ)丁,我們先打上補(bǔ)丁,然后再編譯。
- 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
如果在運(yùn)行上面命令時(shí)遇到錯(cuò)誤,很可能是因?yàn)槿鄙僖蕾嚢斐傻摹A硗猓_保你正確啟用和禁用了特定的PHP配置選項(xiàng)。緊接著我們通過PECL安裝一些將會(huì)用到的模塊:
- sudo pecl install memcache
- sudo pecl install apc
- sudo pecl install syck-beta
在安裝apc模塊時(shí),請(qǐng)務(wù)必關(guān)閉Apache選項(xiàng),如果你沒有關(guān)閉,它也會(huì)提醒你。接下來復(fù)制我們常用的php.ini:
- sudo cp /usr/local/src/php-5.2.8/php.ini-recommended /usr/local/lib/php.ini
最后,我們建立符號(hào)鏈接:
- 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編譯到此結(jié)束,剩下要做的事情是修改php-fpm.conf設(shè)置,用文本編輯器打開/etc/php/php-fpm.conf,將進(jìn)程屬主用戶修改為www-data,這個(gè)文件比較大,因此最好使用搜索功能,我想修改的值分別位于51、52、63和66行。
Nginx
- <value name="owner">www-datavalue>
- <value name="group">www-datavalue>
- <value name="user">www-datavalue>
- <value name="group">www-datavalue>
和編譯PHP一樣非常簡(jiǎn)單:
- 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
再創(chuàng)建一個(gè)鏈接:
- sudo ln -s /usr/local/nginx/conf /etc/nginx
下一步是可有可無的,但我一直使用至今,說說也無妨。打開/etc/nginx/nginx.conf,最終修改結(jié)果如下:
- 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 [$time_local] '
- '"$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/*;
- }
我們也設(shè)置了一些FastCGI參數(shù),讓PHP不會(huì)噎著,也可以避免Nginx 503錯(cuò)誤,打開/etc/nginx/fastcgi_params,添加以下參數(shù):
- 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;
最后,我們創(chuàng)建一個(gè)SystemV風(fēng)格的啟動(dòng)腳本,保存為/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 [ -f /etc/default/nginx ] ; 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
不要忘了設(shè)置可執(zhí)行權(quán)限。
設(shè)置你的網(wǎng)站
這一階段的工作主要按你自己的習(xí)慣完成,這里僅做一個(gè)粗略的介紹。首先我們創(chuàng)建一個(gè)目錄來存放我們的網(wǎng)站配置文件:
- sudo mkdir /usr/local/nginx/sites-enabled
- sudo ln -s /usr/local/nginx/sites-enabled /etc/sites
接下來為我們的網(wǎng)站增加一個(gè)conf文件/etc/sites/default.conf,內(nèi)容如下:
- 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 ^(.+)___FCKpd___12nbsp;/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;
- }
- }
上面這個(gè)conf文件控制網(wǎng)站的前端風(fēng)格,其中包括Wordpress,cake等,注意靜態(tài)內(nèi)容不是通過FastCGI解析的。另外,你可能需要修改/var/www/default文件,設(shè)置網(wǎng)站文件的默認(rèn)放置位置。
啟動(dòng)
我們的工作結(jié)束了,啟動(dòng)看一下效果。
- sudo php-fm start
- sudo /etc/init.d/nginx start
現(xiàn)在可以測(cè)試一下你的網(wǎng)站,看看它工作得如何,如有任何疑問,請(qǐng)隨時(shí)提出。
原文名:NGINX + PHP-FPM + APC = Awesome
原文出處:interfacelab.com/nginx-php-fpm-apc-awesome/
- 推薦!各類建站程序偽靜態(tài)規(guī)則代碼
- 詳細(xì)的DedeCMS(織夢(mèng))目錄權(quán)限安全設(shè)置教程
- iis安全設(shè)置全方位教程
- 巧妙出招致勝服務(wù)器管理
- Win Server 2003個(gè)人網(wǎng)絡(luò)服務(wù)器安全攻略
- Windows 2003校園Web服務(wù)器常見問題
- 清除IIS配置文件后門隱患
- Web服務(wù)器和應(yīng)用程序服務(wù)器有什么區(qū)別
- 虛擬主機(jī)下asp.net 2.0的導(dǎo)航控件treeview,menu等出錯(cuò)
- IIS6.0服務(wù)器架站無法訪問解決方案總結(jié)
- 圖解支持多語言環(huán)境的IIS服務(wù)器配置
- IIS服務(wù)器排錯(cuò)指南及錯(cuò)誤代碼大全
- 相關(guān)鏈接:
- 教程說明:
Web服務(wù)器教程-Nginx + PHP-FPM + APC=絕妙的組合
。