Nginx有什么作用呢?
Ngnix作為一款高性能的HTTP服務(wù)器、反向代理服務(wù)器、電子郵件代理服務(wù)器,主要有三方面的應(yīng)用:
- HTTP服務(wù)器
Nginx作為HTTP服務(wù)器可獨(dú)立提供HTTP服務(wù),也可做為靜態(tài)資源服務(wù)器。
- 虛擬主機(jī)
Nginx可以實(shí)現(xiàn)一臺(tái)服務(wù)器虛擬出多個(gè)站點(diǎn)
- 反向代理負(fù)載均衡
當(dāng)訪問量達(dá)到一定量級(jí)后單臺(tái)服務(wù)器無法支撐用戶的請(qǐng)求時(shí),可使用多臺(tái)服務(wù)器做集群。此時(shí)可使用Nginx做反向代理,并可以為多臺(tái)服務(wù)器做負(fù)載均衡以分擔(dān)負(fù)載,因而不會(huì)因?yàn)槟硞€(gè)節(jié)點(diǎn)負(fù)載過高宕機(jī)或某個(gè)節(jié)點(diǎn)閑置的情況。
什么是虛擬主機(jī)呢?
虛擬主機(jī)使用的是特殊的軟硬件技術(shù),將單臺(tái)物理機(jī)(服務(wù)器)切分為多臺(tái)虛擬的主機(jī),每臺(tái)虛擬主機(jī)都可以具有獨(dú)立的域名,并具有完整的Internet服務(wù)器功能,如WWW、FTP、Email等。同時(shí),同一臺(tái)物理服務(wù)器上的虛擬主機(jī)之間是完全獨(dú)立的。從站點(diǎn)訪問者的角度來看,每臺(tái)虛擬主機(jī)和一個(gè)獨(dú)立主機(jī)完全是一樣的。

利用虛擬主機(jī)不必為每個(gè)要運(yùn)行的站點(diǎn)提供一臺(tái)單獨(dú)的Nginx服務(wù)器,或是單獨(dú)運(yùn)行一組Nginx進(jìn)程。虛擬主機(jī)提供了在同一臺(tái)物理機(jī)、同一組Nginx進(jìn)程上運(yùn)行多個(gè)站點(diǎn)的功能。
Nginx的配置文件的組成結(jié)構(gòu)是什么樣的呢?

Nginx配置文件文件可以分為六部分
-
main全局配置 -
eventsNginx工作模式 -
httpHTTP配置 -
serverServer模塊作為HTTP的模塊主要用來配置虛擬主機(jī) -
upstream上游服務(wù)器設(shè)置,主要為反向代理、負(fù)載均衡等相關(guān)設(shè)置。 -
locationURL匹配特定位置后的設(shè)置,每部分包含若干指令。
Nginx將配置文件拆分為若干部分,主要分為
-
nginx.conf主配置文件 -
vhost.conf虛擬主機(jī)配置文件 -
fastcgi_params與PHP相關(guān)的配置 -
uwsgi_params與Python相關(guān)的配置
...
Nginx可以配置哪幾種類型的虛擬主機(jī)呢?
- 基于域名的虛擬主機(jī)
使用不同的域名對(duì)應(yīng)相同的IP以區(qū)分站點(diǎn)
- 基于IP的虛擬主機(jī)
使用不同的域名不同的IP區(qū)分站點(diǎn)
- 基于端口的虛擬主機(jī)
不使用域名、IP來區(qū)分不同站點(diǎn),而是使用不同的TCP端口區(qū)分
Nginx虛擬主機(jī)的配置文件是什么樣的呢?
server {
listen 80;
server_name yxkwx.cn yxkwx.cn;
root "D:/phpStudy/PHPTutorial/WWW/myproj/public";
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
配置解讀
用戶對(duì)PHP動(dòng)態(tài)網(wǎng)頁訪問過程
當(dāng)Nginx只是作為一個(gè)Web服務(wù)器時(shí),本身是并沒有Apache那么強(qiáng)大的功能的,不過通過支持各種模塊讓Nginx實(shí)現(xiàn)對(duì)多種功能的支持。另外,Nginx本身只能處理靜態(tài)頁面的解析,如果要解析動(dòng)態(tài)頁面的話,就需要使用到反向代理。也就是說,Nginx會(huì)將PHP等動(dòng)態(tài)頁面請(qǐng)求轉(zhuǎn)發(fā)給后端其它Web服務(wù)器進(jìn)行處理,如Tomat、IIS、Apache等。如果訪問量過大的話就是要使用到Nginx的負(fù)載均衡架構(gòu)。
對(duì)于PHP頁面而言,通過Nginx轉(zhuǎn)發(fā)給后端會(huì)有兩種情況:反向代理、FastCGI,需要注意的是這里反向代理的后端指的是Web服務(wù)器,而FastCGI是實(shí)現(xiàn)PHP的解析程序。當(dāng)Nginx將PHP頁面請(qǐng)求轉(zhuǎn)發(fā)給FastCGI程序時(shí),也就時(shí)通過FastCGI方式對(duì)PHP進(jìn)行了支持,PHP頁面會(huì)交由FastCGI代理處理,這也是反向代理的一個(gè)應(yīng)用。

當(dāng)用戶瀏覽器發(fā)起對(duì)yxkwx.cn/index.php地址的訪問時(shí),用戶和Nginx服務(wù)器會(huì)進(jìn)行三次握手建立TCP鏈接,這里我們忽略掉Nginx訪問控制策略和防火墻訪問控制策略等,結(jié)合vhost.conf虛擬主機(jī)配置文件來分析下Nginx與PHP、FastCGI、PHP-FPM的運(yùn)行過程。
第1步
用戶將HTTP請(qǐng)求發(fā)送給Nginx服務(wù)器
第2步
Nginx根據(jù)用戶訪問的URI和后綴對(duì)請(qǐng)求進(jìn)行判斷
用戶訪問yxkwx.cn/index.php地址時(shí),Nginx會(huì)根據(jù)配置文件中的location進(jìn)行匹配。由于訪問的是index.php所以會(huì)被匹配到location ~ \.php(.*)$,正則所表示的含義是對(duì)用戶通過URI訪問的資源進(jìn)行區(qū)分大小寫的匹配且訪問的資源中包含.php。
Nginx根據(jù)用戶請(qǐng)求的資源匹配到具體的location后,會(huì)執(zhí)行location對(duì)應(yīng)的動(dòng)作,location中動(dòng)作是
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
根據(jù)Nginx服務(wù)器的配置,可看出用戶訪問的是動(dòng)態(tài)的PHP資源,Nginx會(huì)調(diào)用PHP腳本解析器對(duì)用戶訪問的資源進(jìn)行解析。
具體每行指令的含義分析如下:
include fastcgi_params;
表示Nginx會(huì)調(diào)用FastCGI這個(gè)接口
fastcgi_intercept_errors on;
表示開啟FastCGI的中斷和錯(cuò)誤信息記錄
fastcgi_pass 127.0.0.1:9000;
表示Nginx通過fastcgi_pass將用戶請(qǐng)求的資源發(fā)送給127.0.0.1:9000進(jìn)行解析,這里的Nginx和PHP腳本解析服務(wù)器是在同一臺(tái)機(jī)器上的,所以127.0.0.1:9000表示的是本地的PHP腳本解析服務(wù)器。
Nginx通過location指令將所有包含.php的文件都交給127.0.0.1:9000來處理,這里的IP地址和端口就是FastCGI進(jìn)程監(jiān)聽的IP地址和端口,其整個(gè)工作流程如下:
FastCGI進(jìn)程管理器PHP-FPM自身初始化,啟動(dòng)主進(jìn)程PHP-FPM并啟動(dòng)
start_servers這個(gè)CGI子進(jìn)程。主進(jìn)程PHP-FPM主要是管理FastCGI子進(jìn)程并監(jiān)聽9000端口,F(xiàn)astCGI子進(jìn)程等待來自Nginx的連接。當(dāng)客戶端請(qǐng)求到達(dá)Nginx時(shí),Nginx通過
location指令將所有包含.php的文件交由127.0.0.1:9000來處理。FastCGI進(jìn)程管理器PHP-FPM選擇并連接到一個(gè)子進(jìn)程CGI解釋器,Nginx將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程。
FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回給Nginx,當(dāng)FastCGI子進(jìn)程關(guān)閉連接時(shí)請(qǐng)求便告處理完成。
FastCGI子進(jìn)程接著等待并處理來自FastCGI進(jìn)程管理器的下一個(gè)連接
第3步
通過第2步可以看出用戶請(qǐng)求的是動(dòng)態(tài)內(nèi)容,Nginx會(huì)將請(qǐng)求交給FastCGI客戶端,通過fastcgi_pass將用戶的請(qǐng)求發(fā)送給PHP-FPM。如果用戶訪問的是靜態(tài)資源,Nginx會(huì)直接將用戶請(qǐng)求的靜態(tài)資源返回給用戶。

這里出現(xiàn)的FastCGI是什么呢?
了解FastCGI之前首先要明白CGI是什么,CGI全程Common Gateway Interface,意為通用網(wǎng)關(guān)接口,是用于HTTP服務(wù)上的程序服務(wù)通信交流的一種工具,是一個(gè)可伸縮地、高速地在HTTP服務(wù)器和動(dòng)態(tài)腳本語言之間進(jìn)行通信的接口,這個(gè)接口在Linux下也就是Socket,只是這個(gè)Socket可以是文件Socket也可以是IP Socket。
對(duì)比傳統(tǒng)的CGI接口方式,由于傳統(tǒng)的CGI接口方式性能與安全性較差,由于每次HTTP服務(wù)器遇到動(dòng)態(tài)程序需要重啟解析器來執(zhí)行解析,然后結(jié)果被返回給HTTP服務(wù)器。這在處理高并發(fā)時(shí)幾乎是不可能的,因此誕生了FastCGI。

PHP-FPM又是什么呢?
PHP-FPM是管理FastCGI的一個(gè)管理器,它作為PHP的插件存在。PHP-FPM提供了更好的PHP進(jìn)程管理方式,可以有效地控制內(nèi)存和進(jìn)程,可以平滑重載PHP配置。
第4步
fastcgi_pass將動(dòng)態(tài)資源交給PHP-FPM后,PHP-FPM會(huì)將資源轉(zhuǎn)給PHP腳本解析服務(wù)器的wrapper

Nginx不支持對(duì)外部程序的直接調(diào)用或解析,所有的外部程序如PHP必須通過FastCGI接口來調(diào)用。為了調(diào)用CGI程序,還需要一個(gè)FastCGI的wrapper,wrapper可以理解為用于啟動(dòng)另一個(gè)程序的程序,這個(gè)wrapper綁定在某個(gè)固定socket上,如端口或文件socket。當(dāng)Nginx將CGI請(qǐng)求發(fā)送給這個(gè)socket時(shí),通過FastCGI接口wrapper接收到請(qǐng)求,然后Fork派生出一個(gè)新的線程,這個(gè)線程調(diào)用解釋器或外部程序處理腳本并讀取返回?cái)?shù)據(jù)。接著,wrapper再將返回的數(shù)據(jù)通過FastCGI接口,沿著固定的socket傳遞給Nginx。最后,Nginx將返回的數(shù)據(jù)(如HTML頁面或圖片等)發(fā)送給客戶端。
簡(jiǎn)單來說,首先需要一個(gè)wrapper完成以下工作:
- 調(diào)用FastCGI庫函數(shù)使用
socket與Nginx通信
其讀寫socket是FastCGI內(nèi)部實(shí)現(xiàn)的功能,對(duì)wrapper是非透明的。 - 調(diào)度線程進(jìn)行Fork和Kill
- 和應(yīng)用(PHP)進(jìn)行通信
第5步
wrapper收到PHP-FPM轉(zhuǎn)交過來的請(qǐng)求后,wrapper會(huì)生成一個(gè)新的線程調(diào)用PHP動(dòng)態(tài)程序解析服務(wù)器。
如果用戶請(qǐng)求的是需要讀取,如MySQL數(shù)據(jù)庫等將會(huì)觸發(fā)讀庫操作。
如果用戶請(qǐng)求的是圖片或附件等資源,PHP會(huì)觸發(fā)依次查詢后端存儲(chǔ)服務(wù)器,例如通過NFS進(jìn)行存儲(chǔ)的存儲(chǔ)集群。
第6步
PHP會(huì)將查詢到的結(jié)果返回給Nginx
第7步
Nginx構(gòu)造一個(gè)響應(yīng)報(bào)文將結(jié)果返回給用戶
綜上所述
這只是Nginx中其中一種實(shí)現(xiàn),用戶請(qǐng)求的和返回給用戶的結(jié)果都是異步進(jìn)行的,也就是說用戶請(qǐng)求的資源在Nginx中做了一次中轉(zhuǎn)。Nginx也支持同步,即解析出來資源后服務(wù)器直接返回給用戶,不用再中轉(zhuǎn)。
是不是每次用戶對(duì)動(dòng)態(tài)資源的請(qǐng)求都需要觸發(fā)一次完整的動(dòng)態(tài)資源解析過程呢?
不是的,其實(shí)有兩種方法可以解決這個(gè)問題:
第1種:?jiǎn)⒂肗ginx本身所具有的緩存功能,將動(dòng)態(tài)資源解析結(jié)果緩存起來,下次用戶進(jìn)行對(duì)應(yīng)資源訪問時(shí),Nginx進(jìn)行本次緩存查詢,如果查詢命中則直接將動(dòng)態(tài)資源解析后的靜態(tài)資源返回給用戶。
第2種:在Nginx后端部署緩存機(jī)器,例如部署Varnish緩存集群,對(duì)資源進(jìn)行緩存,用戶請(qǐng)求的資源可以先在緩存集群上進(jìn)行查找。
使用Nginx做緩存是否可行呢?
這個(gè)要看實(shí)際情況,如果在整個(gè)Web架構(gòu)中Nginx不是瓶頸的前提下,Nginx是可以用來做緩存的,但并不建議這樣來做,因?yàn)镹ginx是用戶請(qǐng)求和應(yīng)答的必經(jīng)之路。如果Nginx出現(xiàn)了瓶頸則后端的其它如存儲(chǔ)集群等性能再好也沒用。所以,在實(shí)際部署中并不建議啟用Nginx的緩存功能(在將Nginx作為HTTP服務(wù)器的情況下)。因?yàn)閱⒂昧薔ginx緩存功能后會(huì)降低Nginx的性能,另外會(huì)消耗部署Nginx對(duì)應(yīng)服務(wù)器的硬件資源。
配置語法
正則表達(dá)式匹配
-
=表示請(qǐng)求字符串與URI嚴(yán)格匹配,一旦匹配成功則停止,用于標(biāo)準(zhǔn)URI前。 -
~表示匹配時(shí)區(qū)分大小寫,用于正則URI前。 -
~*表示匹配時(shí)不區(qū)分大小寫,用于正則URI前。 -
!~表示區(qū)分大小寫則不匹配 -
!~*表示不區(qū)分大小寫則不匹配 -
^~表示匹配以什么開頭的
用于標(biāo)準(zhǔn)URI前,要求Nginx找到標(biāo)識(shí)URI和請(qǐng)求字符串匹配度最高的location后立即使用此location處理請(qǐng)求,而不再使用location塊中的正則URI和請(qǐng)求字符串做匹配。 -
$表示匹配以什么結(jié)尾的 -
\轉(zhuǎn)義字符,用于字符的轉(zhuǎn)義。 -
*表示任意字符
文件與目錄的匹配
-
-f表示存在某文件 -
!-f表示不存在某文件 -
-d表示存在某目錄 -
!-d表示不存在某目錄 -
-e表示存在文件或目錄 -
!-e表示不存在文件或目錄 -
-x表示文件可執(zhí)行 -
!-x表示文件無法執(zhí)行
例如:
-
location / {}表示匹配任何查詢,因?yàn)樗姓?qǐng)求都是以/開頭,但正則規(guī)則和長(zhǎng)的塊規(guī)則將被優(yōu)先和查詢匹配。 -
location ^~ /images/ {}表示匹配任意以/images/開頭的查詢請(qǐng)求并停止搜索 -
location ~* \.(gif|jpg|jpeg)$ {}表示匹配任何以.gif、.jpg、.jpeg結(jié)尾的請(qǐng)求
配置指令
server
server {}
### listen
Nginx的虛擬主機(jī)通過server節(jié)點(diǎn)指定,若要設(shè)置多個(gè)虛擬主機(jī)則可配置多個(gè)server節(jié)點(diǎn)即可。
listen 80;
listen用于指定虛擬主機(jī)監(jiān)聽的TCP端口號(hào),也就是虛擬主機(jī)的服務(wù)端口,默認(rèn)80為WWW服務(wù)對(duì)應(yīng)的端口號(hào)。
server_name
server_name yxkwx.cn yxkwx.cn;
server_name用于指定虛擬主機(jī)名,當(dāng)用戶使用鏈接訪問虛擬主機(jī)名時(shí)就會(huì)由所對(duì)應(yīng)的虛擬主機(jī)進(jìn)行處理。
虛擬主機(jī)名可以有四種格式
- 準(zhǔn)確的名字,例如
yxkwx.cn - 以
*開頭的名字,例如*.yxkwx.cn - 以
*結(jié)尾的名字,例如yxkwx.* - 正則表達(dá)式形式,例如
~^www\d+\.yxkwx\.com$,注意必須以~開頭。
虛擬主機(jī)名可以同時(shí)設(shè)置多個(gè),設(shè)置多個(gè)時(shí)以空格隔開。
例如: server_name yxkwx.cn www.yxkwx.cn *.yxkwx.cn
當(dāng)設(shè)置多個(gè)虛擬主機(jī)名時(shí),其優(yōu)先級(jí)先后順序?yàn)?/p>
- 準(zhǔn)確的名字
- 最長(zhǎng)的以
*開頭的通配符的名字 - 最長(zhǎng)的以
*結(jié)尾的同配置的名字 - 第一個(gè)匹配的正則表達(dá)式名字
root
root "D:/phpStudy/PHPTutorial/WWW/myproj/public";
root指定當(dāng)前虛擬主機(jī)實(shí)際物理根目錄的絕對(duì)路徑
location
location模塊是Nginx中最常使用也是最重要的模塊,用來定位并解析URL。
location提供了強(qiáng)大的正則匹配功能,也支持條件判斷匹配。
用戶可使用location指令實(shí)現(xiàn)Nginx對(duì)動(dòng)態(tài)與靜態(tài)網(wǎng)頁進(jìn)行過濾處理。
location指令的格式為location [modifier] uri {...},當(dāng)一個(gè)請(qǐng)求進(jìn)入時(shí)URI會(huì)被檢測(cè)并匹配一個(gè)最佳的location,首先會(huì)進(jìn)行精確匹配若匹配失敗則會(huì)進(jìn)行字符串的前綴匹配,依次進(jìn)行正則匹配、匹配常規(guī)字符串模糊匹配,若以上匹配都不成功,將會(huì)執(zhí)行默認(rèn)匹配。
location = /
表示精確匹配
location /documents/
表示匹配常規(guī)字符串,模糊匹配。如果有正則檢查則正則優(yōu)先。
location /
由于所有的請(qǐng)求都是以/開頭,所以location /表示匹配所有請(qǐng)求,另外也表示匹配訪問站點(diǎn)根目錄。當(dāng)所有location都不能匹配后的默認(rèn)匹配原則。
location ~
location指令可以使用正則匹配,開啟正則匹配是使用location ~。
location ^~ /images/
表示先進(jìn)行字符串的前綴匹配,如果匹配到了就不做正則匹配檢查。
location ~* .(gif|jpg|jpeg|png)$
表示正則匹配,*表示不區(qū)分大小寫。
例如:
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
\.php(.*)$是使用正則匹配以.php結(jié)尾的URL,進(jìn)而用來解析PHP文件。
例如:Nginx設(shè)置禁止訪問某類文件
location ~* \.(txt|doc)$
{
if (-f $request_filename)
{
root /usr/local/nginx/html/test;
break;
}
}
location ~* \.(txt|doc)$
{
root /usr/local/nginx/html/test;
deny all;
}
例如:Nginx設(shè)置靜態(tài)文件處理
location ~* \.(css|js|jpg|jpeg|gif|png|swf)$
{
if (-f $request_filename)
{
root /usr/local/nginx/html;
expires 1d;
}
break;
}
index
index index.html index.htm index.php;
index指定當(dāng)前虛擬主機(jī)默認(rèn)訪問首頁的文件名,index中是有先后順序的,如果沒有開啟目錄瀏覽權(quán)限同時(shí)又找不找這些默認(rèn)首頁的話,就會(huì)出現(xiàn)403錯(cuò)誤。
autoindex
autoindex on;
autoindex表示是否開啟網(wǎng)站根目錄文件列表功能,開啟后訪問目錄時(shí)會(huì)列出根目錄中的文件列表,默認(rèn)關(guān)閉off。
autoindex_exact_size on;
autoindex_exact_size表示是否顯示文件列表中每個(gè)文件的確切大小,注意單位是字節(jié)bytes,默認(rèn)為開啟狀態(tài)on。
autoindex_localtime off;
autoindex_localtime表示是否顯示文件列表中每個(gè)文件的服務(wù)器本地時(shí)間,時(shí)間格式為GMT格林威治時(shí)間,默認(rèn)為關(guān)閉狀態(tài)off。
### allow
allow all;
允許所有訪問
charset
charset
charset 用于配置網(wǎng)頁的默認(rèn)編碼格式
access_log
access_log
access_log用來指定當(dāng)前虛擬主機(jī)的訪問日志存放路徑,最后的main用于指定訪問日志的輸出格式。
rewrite
rewrite指令主要用于實(shí)現(xiàn)URL地址重寫,Nginx的重寫規(guī)則需要PCRE的支持,即通過Perl兼容正則表達(dá)式語法進(jìn)行規(guī)則匹配。默認(rèn)參數(shù)編譯時(shí)Nginx就會(huì)安裝支持rewrite的模塊,但也必須要有PCRE軟件的支持。
rewrite指令語法:rewrite regex replacement [flag]
例如:URL重寫跳轉(zhuǎn)為rewrite ^/(.*) http://www.baidu.com/$1 permanent;
rewrite為重寫參數(shù),正則部分為^/(.*) http://www.baidu.com/$1,其中$1表示獲取正則()括號(hào)部分的值。
flag標(biāo)記符號(hào)的取值范圍
-
last表示本條規(guī)則匹配完成后,繼續(xù)向下匹配新的location URI規(guī)則。 -
break表示本條規(guī)則匹配完成即終止,不再匹配后面的任何規(guī)則。 -
redirect返回302臨時(shí)重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址。 -
permanent返回302永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址。
錯(cuò)誤處理
錯(cuò)誤1:瀏覽器訪問http://192.168.50.25:81/admin/login出現(xiàn)404錯(cuò)誤
Nginx多域名配置中支持PATHINFO路由模式
server {
listen 81;
server_name yxkwx.cn yxkwx.cn;
root "D:/phpStudy/PHPTutorial/WWW/myproj/public";
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
錯(cuò)誤2:瀏覽器訪問http://192.168.50.25:82,頁面出現(xiàn)錯(cuò)誤No input file specified.。
查看Nginx錯(cuò)誤日志文件error.log文件發(fā)現(xiàn)錯(cuò)誤信息
2019/05/15 11:03:18 [crit] 13928#9540:
*5 GetFileAttributesEx() "D:\phpStudy\PHPTutorial\WWW
myproj\public/api.html" failed
(123: The filename, directory name, or volume label syntax is incorrect),
client: 192.168.50.25,
server: nbb.cn,
request: "GET /api.html HTTP/1.1",
host: "192.168.50.25:82"
以上錯(cuò)誤信息重點(diǎn)關(guān)注The filename, directory name, or volume label syntax is incorrect說明文件路徑有問題
查看多域名配置文件vhost.conf中root配置項(xiàng)目root "D:\phpStudy\PHPTutorial\WWW\myproj\public";,將正斜杠\修改為反斜杠/重啟Nginx服務(wù)器即可。
server {
listen 82;
server_name nbb.cn nbb.cn;
root "D:/phpStudy/PHPTutorial/WWW/myproj/public";
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
未完待續(xù)...