最近在学习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