当前位置: 首页 > 后端技术 > PHP

记得调试nginxvhost的低能运行

时间:2023-03-29 15:20:30 PHP

最近在学习Fast-CGI协议的具体内容,使用TCPDUMP抓取nginx发给php-fpm的tcp包。所以只好在MAC上搭建一个简单的环境,跑一个小demo。我们nginx和php都有,回来的时候可以给nginx配置一个vhost。谁知道,最后在vhost上折腾了半天。难的。由于之前的nginx配置都是在公司提供的虚拟机上操作的,无非就是测试一份之前项目的conf文件,改根路径,server_name,最后重新加载。但突然间,我血管里的液体涌上心头,我决定自己写一份。其实之前也看过nginx的手册,了解了http、server、location模块的作用和一些配置,所以手写了下。首先我在/Users/zonghay/www/写了一个test.php文件,然后配置了vhost,先看看效果。我写的第一个服务器如下:server{listen8848;服务器名称本地主机;位置/{root/Users/zonghay/www/;indexindex.htmlindex.htm;}}浏览器访问http://localhost:8848,发现404错误。404,肯定是找不到,那什么找不到呢?想了想,自己写了test.php文件,但是nginx的配置去了index.html和index.htm。赶紧把php的文件名改一下,把nginx的配置文件改成如下server{listen8848;服务器名称本地主机;位置/{root/Users/zonghay/www/;indexindex.htmlindex.htmindex.php;}}重启nginx,这次请求不是404了,这次变成白板了,什么也没有输出,反而下载了index.php这个文件,咦,这是为什么呢?Bing看着这个问题。原来nginx匹配index.php文件后发现不是html资源,所以nginx会返回content-type为application/octet-stream。我们F12看一下http的响应。HTTP/1.1200OKServer:nginx/1.17.3日期:2019年11月13日星期三13:25:25GMTLast-Modified:2019年11月13日星期三13:23:34GMTContent-Type:application/octet-streamContent-Length:18ETag:"5dcc03d6-12"Accept-Ranges:bytes但是怎么解决,当然是告诉nginx你要把这个文件交给谁。好吧,我们继续修墙,添加匹配PHP文件的location块,告诉nginx将文件交给监听本机9000端口的php-fpm处理。服务器{听8848;服务器名称本地主机;位置/{root/Users/zonghay/www/;indexindex.htmlindex.htmindex.php;}location~.*\.php${fastcgi_pass127.0.0.1:9000;}}满怀期待的继续重启刷新,发现这次既不是404也不是下载,而是变成了一块白板,我崩溃了。但是静下心来分析一下,为什么什么都没有返回呢?有可能是php-fpm没有处理这个文件或者没有正确处理,返回空。仔细对比了一下自己的虚拟机vhost配置和本赛季的配置,发现自己可能犯了一个低级的错误。众所周知,php-fpm的全称是什么?它被称为PHPfast-cgi管理器。它是一个实现了fast-cgi协议的应用程序。你nginx告诉人家处理这个文件,但是没告诉人家用什么协议来处理。就像你去饭店叫人给你做一道有肉的菜,你不说要做什么,人家肯定不理你。于是边bing边比较了两个配置文件的区别,写了一个最终版的server{listen8848;服务器名称本地主机;根/Users/zonghay/www/;indexindex.htmlindex.htmindex.php;地点~。*\.php${包括fastcgi_params;fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;}}includefastcgi_params这个文件包含了fast-cgi协议必须的参数K-V键值对,至于这些键值对有什么作用,等我研究完fast-cgi协议再写一篇吧。最终,我的小demo顺利通过了。看着屏幕上的HelloWorld几个字,真是汗颜。入职一年了,nginx配置还能犯这么低级的错误。我也说服了自己。