linux:centos5.5 nginx:1.7.8.tar.gz php:5.6.3.tar.gz
lnmp(linux+nginx+mysql+php)的提法相對於lamp(linux+apche+mysql+php)來提的。php
爲何用nginx而拋棄apache了呢?html
nginx網絡io的方式爲epoll,apache的網絡io的方式爲select。二者詳細區別請移步:http://www.cnblogs.com/simpman/p/4150005.htmljava
我的理解epoll的方式:創建一個文件描述符隊列,在文件描述隊列準備好之後,通知web容器。至關於維護一個隊列,隊列中的成員就緒就通知線程。mysql
select方式:須要web容器開一個線程去掃描哪一個文件描述符準備就緒。至關於維護一個數組。linux
在apache2.4.1上已經引入了epoll代替select。老版的apache由於採用select方式,在處理高併發靜態文件請求的時候就會能力不足。ios
nginx是經過使用php-fastcgi來實現的。apache通常是經過mod_php模塊來實現的。本人之前在使用apache的時候也是用這種方式。nginx
下面說一下nginx與php-fastcgi的工做原理:c++
1. 定義:CGI(Common Gateway Interface)是HTTP服務器與機器上的其餘程序進行「交談」的一種工具,該程序須運行在網絡服務器上。
2. 功能:絕大多數的CGI程序被用來解釋處理來自表單的輸入信息,並在服務器產生相應的處理,或將相應的信息反饋給瀏覽器。CGI程序使網頁具備交互功能。
3. 運行環境:CGI程序在UNIX操做系統上CERN或NCSA格式的服務器上運行。 在其它操做系統(如:windows NT及windows95等)的服務器上也普遍地使用CGI程序,同時它也適用於各類類型機器。
4. CGI處理步驟:
⑴經過Internet把用戶請求送到服務器。
⑵服務器接收用戶請求並交給CGI程序處理。
⑶CGI程序把處理結果傳送給服務器。
⑷服務器把結果送回到用戶。
詳細請移步:http://www.cnblogs.com/simpman/p/4151639.html
其實上面就至關於說:cgi用來解析動態腳本,fast-cgi是用來管理cgi的程序。
在具體實現上php-cgi用來解析php腳本,php-fpm(全程php:FastCGI Process Manager)用來管理php-cgi。
概念的詳細解釋請看:http://www.nowamagic.net/librarys/veda/detail/1319
在php5.3.3+已經將php-fpm整合到內核中了。5.3.3之前,php-fpm須要做爲php的補丁安裝。
php-fpm在老版php中使用xml配置,在新版使用和php.ini相似的配置格式。
安裝:只須要在configure的時候添加 --enable-fpm。
須要gcc(GUN Compiler Collection)編譯器,能夠編譯c,c++,object-c,fortran,java。web
gcc爲GNU Compiler Collection的縮寫,能夠編譯C和C++源代碼等,它是GNU開發的C和C++以及其餘不少種語言 的編譯器(最先的時候只能編譯C,後來很快進化成一個編譯多種語言的集合,如Fortran、Pascal、Objective-C、Java、Ada、 Go等。)sql
gcc 在編譯C++源代碼的階段,只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接(編譯過程分爲編譯、連接兩個階段,注意不要和可執行文件這個概念搞混,相對可執行文件來講有三個重要的概念:編譯(compile)、連接(link)、加載(load)。
源程序文件被編譯成目標文件,多個目標文件連同庫被連接成一個最終的可執行文件,可執行文件被加載到內存中運行)。
所以,一般使用 g++ 命令來完成 C++ 程序的編譯和鏈接,該程序會自動調用 gcc 實現編譯。g++也能編譯C源代碼,只不過把會把它當成C++源代碼,後綴爲.c的,gcc把它看成是C程序,而g++看成是c++程序;後綴爲.cpp的,二者都會認爲是c++程序,注意,雖然c++是c的超集,可是二者對語法的要求是有區別的。
此外還須要安裝Autoconf和Automake工具,他們用於自動建立功能完善的Makefile,大多數軟件包都是用這個工具生成Makefile。nginx也是。
yum install gcc gcc-c++ autoconf automake
模塊依賴性:nginx須要其餘第三方庫的支持,gzip須要zlib庫,rewrite須要pcre(Perl Compatible Regular Expression)庫,ssl功能須要openssl。
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel
Nginx的安裝很是簡單。在默認狀況下,通過編譯安裝的Nginx包含了大部分可用模塊。能夠經過「./configure --help」選項設置各個模塊的使用狀況,例如對不須要的http_ssi模塊,可經過「--without-http_ssi_module」方式關閉此模塊;同理,若是須要「http_perl」模塊,那麼能夠經過「--with-http_perl_module」方式安裝此模塊。「http_perl」模塊能夠用來啓用 Nginx 的 NginxStatus 功能,以監控 Nginx 的當前狀態。一下是安裝過程:
wget http://nginx.org/download/nginx-1.7.8.tar.gz tar zxvf nginx-1.7.8.tar.gz cd nginx-1.7.8 yum install gcc gcc-c++ autoconf automake yum install -y zlib zlib-devel pcre pcre-devel openssl openssl-devel ./configure --with-http_stub_status_module --prefix=/usr/local/nginx -–with-http_ssl_module make make install
安裝完成。
查看管理nginx的幫助。
/usr/local/nginx/sbin/nginx -h
後期能夠寫shell腳本將nginx加入到service中。
前面已經講過,在php5.3.3之後php-fpm已經加入到php內核中。老版本中php-fpm是以patch的方式安裝。咱們安裝php-5.6.3最新版。
wget http://cn2.php.net/get/php-5.6.3.tar.gz/from/this/mirror tar zxvf php-5.6.3.tar.gz cd php-5.6.3 ./configure --enable-fpm --with-mysql make make install /usr/local/sbin/php-fpm -h cp php.ini-development /usr/local/php/php.ini cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf cp sapi/fpm/php-fpm /usr/local/bin
至此,已經安裝上了php,php-fpm。
若是文件不存在,則阻止 Nginx 將請求發送到後端的 PHP-FPM 模塊, 以免遭受惡意腳本注入的攻擊。 將 php.ini 文件中的配置項 cgi.fix_pathinfo 設置爲 0 vim /usr/local/php/php.ini cgi.fix_pathinfo=0
啓動php-fpm:
/usr/local/bin/php-fpm 查看php-fpm支持的啓動選項 /usr/local/bin/php-fpm -h
讓nginx支持php:
修改nginx.conf, vim /usr/local/nginx/conf/nginx.conf
location / { root html; index index.php index.html index.htm; } location ~* \.php$ { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; }
若是修改的不對,會報404錯誤。
重啓nginx:
sudo /usr/local/nginx/sbin/nginx -s stop
sudo /usr/local/nginx/sbin/nginx
可能遇到的問題
可能缺乏支持的庫,ncurse,libxml2或者其餘的什麼,使用yum安裝一下。
nginx傳遞給php-fpm的參數不對。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
將這兩個參數配置好,注意下root html;就ok了。
有參考:
http://q.cnblogs.com/q/62016/
http://ixdba.blog.51cto.com/2895551/806622
http://ixdba.blog.51cto.com/all/2895551/page/2
http://www.phpfensi.com/php/20131204/731.html
http://www.cnblogs.com/iosdev/p/3439834.html
http://php.net/manual/zh/install.unix.nginx.php
lnmp環境的操做部分:
安裝php+nginx:http://www.cnblogs.com/simpman/p/4151662.html
安裝mysql:http://www.cnblogs.com/simpman/p/4192942.html
安裝php:http://www.cnblogs.com/simpman/p/4196051.html
lnmp環境的理論部分:
FastCgi與PHP-fpm關係[轉] 讀完本文瞬間明朗了不少 : http://www.cnblogs.com/simpman/p/4151639.html 二、http://segmentfault.com/q/1010000000256516
epoll和select區別:http://www.cnblogs.com/simpman/p/4150005.html