記一次調試nginx vhost的低能兒操做

最近在學習Fast-CGI的協議具體內容,用到TCPDUMP來抓一下nginx發給php-fpm的tcp包。因而本身就要在MAC上搭一個簡單的環境,跑個小demo。nginx,php咱都有,回來配個nginx的vhost就成了,誰知道最後在vhost上折騰了半天。難頂。php

因爲以前的nginx配置都是在公司提供的虛擬機上操做,無非就是把以前項目的conf文件考一份,改一下root路徑、server_name,最後reload一下。可是我心血管裏的液體忽然衝向個人頭顱,我決定本身寫一份。html

其實我以前也是看過nginx的手冊的,明白http、server、location各模塊的做用以及一些配置,因而就上手寫了。首先,我如今/Users/zonghay/www/寫了一個test.php文件,而後再配置vhost想先看看效果。nginx

我寫的第一個server以下:segmentfault

server {
        listen       8848;
        server_name  localhost;
       
        location / {
            root  /Users/zonghay/www/;
            index  index.html index.htm;
        }
}

瀏覽器訪問 http://localhost:8848 ,發現報404錯誤。
404嘛,確定是找不到,那到底找不到啥呢?想一下子,我擦,本身寫的是test.php文件,nginx配置倒是去找index.html和index.htm。趕忙吧php的文件名改了,nginx的配置文件也改爲了下面這個瀏覽器

server {
        listen       8848;
        server_name  localhost;

        location / {
            root  /Users/zonghay/www/;
            index  index.html index.htm index.php;
        }
}

重啓nginx,發請求
此次不是404了,此次變成白板了,啥也沒輸出反而卻是把index.php這個文件下載下來了,誒,這是爲啥呢?
bing了一下問題,原來是nginx匹配到index.php這個文件後,發現它不是html資源啊,因而nginx就會以application/octet-stream的content-type返回。咱們F12看一下http的response便可。app

HTTP/1.1 200 OK
Server: nginx/1.17.3
Date: Wed, 13 Nov 2019 13:25:25 GMT
Last-Modified: Wed, 13 Nov 2019 13:23:34 GMT
Content-Type: application/octet-stream
Content-Length: 18
ETag: "5dcc03d6-12"
Accept-Ranges: bytes

可是要怎麼解決的,固然是告訴nginx你要把這個文件交由誰處理啦。那好,咱繼續補牆,添加匹配PHP文件的location塊,告訴nginx把文件交由監聽本機9000端口的php-fpm處理。tcp

server {
        listen       8848;
        server_name  localhost;

        location / {
            root  /Users/zonghay/www/;
            index  index.html index.htm index.php;
        }
       
        location ~ .*\.php$ {
            fastcgi_pass 127.0.0.1:9000;
        }
}

繼續重啓、刷新php-fpm

滿懷期待發現,此次既不是404,也不是下載了,變成了白板,我這個崩潰啊。但冷靜下來分析一下,爲何啥也沒返回呢?有多是php-fpm沒處理這個文件或者沒處理正確,返回空。通過仔細比對個人虛擬機vhost配置和本季的配置,發現我多是犯了一個低級的錯誤。衆所周知,php-fpm全稱叫啥呢,叫作PHP fast-cgi manager啊,他是一個實現了fast-cgi協議的應用。你nginx告訴人家處理這個文件,可是沒告訴人家用啥協議處理啊。這就比如你到了飯店,拎着肉讓人家給你炒個菜,可是你沒說炒什麼才呀,人家確定不理你呀。因而我邊bing,邊對比兩個配置文件的不一樣,寫了一個最終版學習

server {
        listen       8848;
        server_name  localhost;
        root  /Users/zonghay/www/;
        index  index.html index.htm index.php;

        location ~ .*\.php$ {
            include fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
        }
}

include的fastcgi_params這個文件裏面包含了fast-cgi協議必須的參數K-V鍵值對,至於這些鍵值對都有什麼做用,仍是等我後續研究完fast-cgi協議再來寫一篇吧。最後個人小demo是有驚無險的跑通了,看着屏幕上的Hello World的字樣,我真是倍感丟人啊,都工做一年了,還能在nginx配置上犯這麼低級的錯誤我也是服了本身了。url

相關文章
相關標籤/搜索