聞說Nginx向來有性能高、併發性強、佔用內存少的優點,更有「反向代理」和「負載均衡」的特色。而使用Nginx+PHP做開發環境,性能更是比Apache+PHP高數倍。本文以各程序當前最新的版本爲例,介紹在Windows(x64)下搭建Nginx+PHP+MySQL+phpMyAdmin經典開發環境的方法。php
1. 應用軟件包以初始路徑設置html
Nginx(當前最新1.7.9):http://nginx.org/download/;mysql
PHP(當前最新5.6.6RC1):http://windows.php.net/qa/,選擇VC11 x86 Thread Safe版本;nginx
MySQL(當前最新5.6.23):http://dev.mysql.com/downloads/mysql,建議選擇Windows (x86, 64-bit) ZIP Archive,也可以使用Windows (x86, 64-bit) MySQL Installer MSI安裝版;sql
phpMyAdmin(當前最新4.3.9):http://www.phpmyadmin.net/home_page/index.php;數據庫
RunHiddenConsole:本程序下載地址略;windows
假設全部應用的安裝目錄爲C:\Server\,目錄內文件夾結構以下圖:(下面的教程將按照本目錄中的文件夾名稱做例)瀏覽器
2. 配置MySQL安全
本教程以Zip版的MySQL包爲例,習慣使管理用界面MySQL的能夠安裝MSI版本,具體方法略。服務器
解壓Zip包,把MySQL全部文件複製到C:\Server\MySQL中(此時C:\Server\MySQL中應包含bin、data等文件夾);
運行cmd,進入MySQL目錄:cd C:\Server\MySQL\bin (保證當前目錄在C盤下,不然使用cd ../命令返回C盤目錄);
安裝MySQL:MySQLd --install MySQL56
運行SQL:net start MySQL56
修改MySQL密碼:MySQL -u root -p ;
正常狀況下會出現Enter password:的內容,直接回車便可(密碼爲空),這時會出現mysql>的字樣;
輸入use mysql;後回車,顯示Database changed;
輸入UPDATE user SET password=PASSWORD('$pwd'), user='$user' WHERE user='root';後回車,其中$pwd和$user分別爲本身定義的密碼和用戶名,輸入後顯示Query OK, 3 rows affected (0.00 sec),這時用戶名及密碼已修改;
輸入flush privileges;後回車,刷新數據庫。
此時數據庫已配置完成,只要運行MySQL.exe就能夠打開數據庫了,爲了方便,寫幾個.bat批處理做MySQL的安裝、卸載、啓動、中止操做:
install.bat:
cd C:\Server\MySQL\bin
MySQLd --install MySQL56
uninstall.bat:sc delete MySQL56
start.bat:net start MySQL56
stop.bat:net stop MySQL56
將4個bat文件寫好後,之後要執行相應的操做,直接執行bat程序就能夠了。爲了查看執行結果,能夠在全部bat文件最後加一句pause。
3. 配置PHP
這裏選擇的php版本php-5.6.6RC1-Win32-VC11-x86。雖然PHP在Nginx下是FastCgi方式運行的,理論上配搭非線程安全(nts)版,但因爲是在Windows環境下,仍是選擇線程安全版來保證其穩定性,並且通過測試,nts在鏈接數據庫失敗時(好比故意關閉MySQL服務而鏈接數據庫),會出現php-cgi強退的現象,而線程安全版則能正常顯示鏈接錯誤,所以仍是用nts來保證穩定性比較好。
解壓壓縮包,把php5的文件複製到C:\Server\php下;
複製php.ini-development並命名新文件爲php.ini(也可複製php.ini-produceion,前者用於開發然後者用於正式生產,看狀況,初學者建議用development),打開php.ini;
在#736行,找到extension_dir = ,將前面的分號去掉並改成extension_dir = "C:\Server\php\ext",表示定義了extension的路徑並生效;
在#704行,找到always_populate_raw_post_data = -1,將前面的分號去掉,表示此句生效(這個設置主要用於PHP中使用"php://input"獲取post源數據);
在#927行,找到data.timezone = ,將前面的分號去掉並改成data.timezone=PRC,表示定義了時區並生效(用於PHP中date()、time()函數);
從#878行開始,選擇本身須要的dll擴展模塊並使其生效,經常使用的模塊有如下:
php_curl.dll:用於curl模擬Http請求;
php_mysql和php_mysqli:用於mysql鏈接,mysql必選;
php_mbstring:用於支持各類編碼,mysql必選;
php_openssl:用於https請求;
php_gd2:用於GD2圖庫相關函數;
在#773行,找到cgi.fix_pathinfo=1,將前面的分號去掉,表示此句生效;
針對5.5以上版本,還要將php目錄下的"libeay32.dll", "ssleay32.dll", "libssh2.dll"三個dll文件複製到C:\Windows\System32,x64系統還要複製到C:\Windows\sysWOW64,不然curl等一些函數庫將無效。
PHP隨Nginx運行,不須要單獨啓動,至此已配置完成。
4. 配置Nginx
Nginx配置與Apache原理同樣,可是相對簡單一些。
在#44行,改成root C:\Server\localhost,表示網站的根目錄位置;
在#45行,改成index index.html index.htm index.php,表示支持更多類型的默認首頁;
在#65-#71行,把前面的井號去掉,表示配置生效,改成:
root C:\Server\localhost;
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
其中,root爲網站根目錄,與#44行配置相同,fastcgi_pass爲php綁定的端口,後面會介紹;
在#32行,加入fastcgi_intercept_errors on; ,表示將fastcgi(PHP)的錯誤交回Nginx處理;
在#48行,將error_page前的井號去掉,表示該配置生效,將404錯誤定向到/404.html頁面上(或默認),不然訪問不存在的php時只會顯示no input file specified的文字,不會顯示404。
此時Nginx也配置好了,能夠試運行一下。
打開cmd,進入Nginx目錄:cd C:\Server\Nginx;
啓動Nginx:nginx
打開另外一個cmd,進入php目錄:cd C:\Server\php;
啓動php:php-cgi -b 127.0.0.1:9000,此處127.0.0.1:9000則爲fastcgi_pass綁定的地址和端口。
打開瀏覽器,進入127.0.0.1,發現網頁出現403 Forbidden,由於C:\Server\localhost下沒有index首頁,但能夠證實Nginx+php已經運行起來了。
爲了方便,依然能夠寫幾個bat控制Nginx的開始和結束:(須要用到RunHiddenConsole)
start.bat:
cd C:\Server\Nginx
start Nginx
cd C:\Server\
RunHiddenConsole php\php-cgi -b 127.0.0.1:9000
stop.bat:
taskkill /f /im Nginx.exe
taskkill /f /im php-cgi.exe
taskkill /f /im conhost.exe
5. 配置phpMyAdmin
解壓phpMyAdmin壓縮包後將文件複製到C:\Server\localhost\phpMyAdmin,注意如今暫時放在localhost中方便調試,打開libraries\config.default.php:
在#252行,將$cfg['Servers'][$i]['user'] = 'root';中的root改成MySQL的用戶名;
在#259行,在$cfg['Servers'][$i]['password'] = '';中輸入MySQL的密碼;
在#39行,在$cfg['PmaAbsoluteUri'] = '';中輸入服務器的地址(本地服務器則http://127.0.0.1)
打開瀏覽器,進入http://127.0.0.1/phpMyAdmin/index.php,按照提示登陸便可。
另外,若是在本地測試狀態時,爲了方便不用每次都輸密碼進入,能夠這樣:
在#230行,將$cfg['Servers'][$i]['auth_type'] = 'cookie';中的cookie改成config,這樣下次訪問index.php就直接登陸了。
6. 創建虛擬目錄
一樣的,Nginx跟Apache同樣也有虛擬目錄的功能,如第1點中的目錄結構,phpMyAdmin不在默認目錄localhost中,但仍然能夠用http://127.0.0.1/phpMyAdmin訪問,虛擬目錄提供了一個目錄映射的功能。打開Nginx\nginx.conf:
在location /{}後 (#47行位置)加入:
location /phpMyAdmin/ {
alias C:/Server/phpMyAdmin;
index index.php
}
location ~ ^/phpMyAdmin/(.*\.php)$ {
alias C:/Server/phpMyAdmin/$1;
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
}
Nginx用alias表示目錄映射關係,第一句location表示用/phpMyAdmin/表示Server/phpMyAdmin的實際路徑,並用index.php表示默認路徑;第二句表示匹配/phpMyAdmin/下以php爲擴展名的文件,與php設置同樣綁定127.0.0.1:9000端口。
打開瀏覽器進入127.0.0.1/phpMyAdmin/index.php,正常狀況下能夠登陸到數據庫(固然MySQL要啓動)。
簡單地解釋一下Nginx+FastCGI的工做模式。Nginx不像Apache那樣提供標準模塊,全部外部程序的調用必須經過FastCFI接口(socket)來實現。因此PHP必須綁定在socket上,經過FastCGI與Nginx通訊。當Nginx接收到請求後,經過FastCGI把請求轉發到wrapper(綁定在該socket上,用於啓動PHP程序),wrapper接收後產生一個新PHP線程,等待PHP處理後接收由腳本產生的數據,再經過FastCGI將數據傳給Nginx。本例中,wrapper綁定在127.0.0.1:9000上,經過這個socket,Nginx能夠和PHP交換數據。
如今作一個實例:打開localhost文件夾,在裏面新建兩個文件index.php,test.php。
在test.php中寫:
<?php echo 'test'; ?>
在index.php中寫:
<?php echo file_get_contents("http://127.0.0.1/test.php"); ?>
而後在瀏覽器中進入:http://127.0.0.1/index.php。
這個程序很簡單,就是經過index.php請求本地的test.php,將test.php的輸出結果在瀏覽器中輸出。可是能夠發現,程序每次都要讀取40秒左右,並且會出現500的結果。在Apache中測試這個程序,發現不需1秒程序就會執行完,但在Nginx中卻一直出現500的結果。
這個緣由跟Nginx的FastCGI特性有關。引用這個實例,主要是引出Nginx的特色之一,負載均衡。這個實例的現象能夠用負載均衡解決。至於負載均衡的意義,以及其具體實現方法,下一節將詳細介紹。