记一次nginx+php出现的问题

背景:

准备使用laravel搞点小东西,手动搭建了一个nginx+mysql+php环境,在浏览器输入www.book.com(自己本地配的域名),出现了502。

寻找问题的过程:

直接输入localhost不会出现502。这个是不是因为nginx无法访问php文件?在根目录写个html文件,再访问时正确显示文件,不会报错。好了,那肯定是php-fpm的问题了。

首先说一下nginx和php-fpm 的关系。

所谓的上网说到底也就是两个进行之间的通信,当然进程之间的通信分为好几种,比如管道、信号、信号量、消息队列、共享内存、套接字。除了套接字其他都可以在同一块磁盘上进行。两块磁盘要进行资源交换的话,通常使用套接字。

套接字又分为三种,流式套接字、数据报套接字、原始套接字

流式套接字使用tcp,数据报套接字用的是udp。原始套接字更接近底层。

http 底层用的就是tcp协议。

那么我们在浏览器输入一个url,到底经历了什么呢?

首先,对域名进行解析,寻找对应的ip。

寻找过程:去host文件寻找,找不到话去dns服务器去查(方式有两种,递归和迭代)。

然后,拿到ip后就可以访问对应的服务器了,然后在通过端口号找到对应的进程。

nginx干嘛用的?

客户端--》nginx--》资源。

即用来处理http请求,然后将结果返回给客户端。

问题来了,像html这种简单的静态资源,nginx还能应付,像php这种动态页面,nginx 就无能为力。

所以有了cgi。

现在很多语言都可以用来写cgi,c、c++,php都可以。

cgi可以通过环境变量来获取输入,

下面列一些环境变量(来源:https://blog.csdn.net/qq_28081081/article/details/80631812

变量名描述
CONTENT_TYPE这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。
CONTENT_LENGTH如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。
HTTP_COOKIE客户机内的 COOKIE 内容。
HTTP_USER_AGENT提供包含了版本数或其他专有数据的客户浏览器信息。
PATH_INFO这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。
QUERY_STRING如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号'?'分隔。
REMOTE_ADDR这个环境变量的值是发送请求的客户机的IP地址,例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。
REMOTE_HOST这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。
REQUEST_METHOD提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。
SCRIPT_FILENAMECGI脚本的完整路径
SCRIPT_NAMECGI脚本的的名称
SERVER_NAME这是你的 WEB 服务器的主机名、别名或IP地址。
SERVER_SOFTWARE

这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号。例如,上面的值为Apache/2.2.14(Unix)

通过上面的变量,cgi便可以获取到http请求带的一些参数。

 

一开始的cgi程序,是来一个请求,创建一个进程去进行处理,请求处理结束就把进程gg。然后再来一个请求,再次创建一个进程处理。这样的操作结果是非常浪费资源的。

后来有了改良品,fastcgi。改进的地方就是内存常驻,一个master指挥其他worker工作。

那php-cgi,又是什么呢?针对自身的理解打个比喻。fastcgi是个抽象类,php-cgi就是继承这个抽象类实现的具体类。

后来php-cgi又化名php-fpm。

 

好了,nginx和php-fpm是怎么进行通信的呢?

两种方法,UNIX Domain Socket和TCP。

本次出现502的原因就是因为,nginx和php-fpm设置的不一致导致无法通信,nginx无法使用php-fpm解析php文件。

改一下就好啦。

nginx配置:

www.conf配置:


 

最终解决问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值