標籤:
聞說Nginx向來有效能高、並發性強、佔用記憶體少的優勢,更有“反向 Proxy”和“負載平衡”的特點。而使用Nginx+PHP作開發環境,效能更是比Apache+PHP高數倍。本文以各程式當前最新的版本為例,介紹在Windows(x64)下搭建Nginx+PHP+MySQL+phpMyAdmin經典開發環境的方法。
1. 應用軟體包以初始路徑設定
Nginx(當前最新1.7.9):http://nginx.org/download/;5
PHP(當前最新5.6.6RC1):http://windows.php.net/qa/,選擇VC11 x86 Thread Safe版本;
MySQL(當前最新5.6.23):http://dev.mysql.com/downloads/mysql,建議選擇Windows (x86, 64-bit) ZIP Archive,也可使用Windows (x86, 64-bit) MySQL Installer MSI安裝版;
phpMyAdmin(當前最新4.3.9):http://www.phpmyadmin.net/home_page/index.php;
RunHiddenConsole:本程式略;
假設所有應用的安裝目錄為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的特點之一,負載平衡。這個執行個體的現象可以用負載平衡解決。至於負載平衡的意義,以及其具體實現方法,下一節將詳細介紹。
Http伺服器基本配置[Windows + Nginx + MySQL + phpMyAdmin]