背景:
准备使用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_FILENAME | CGI脚本的完整路径 |
SCRIPT_NAME | CGI脚本的的名称 |
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配置:
最终解决问题。