ginx与PHP-FPM的工作机制
网络上有很多关于如何配置Nginx的教程,但它们更多从操作的角度出发,告诉我们怎么做,但却没有告诉我们为什么要这么做。本文从Nginx与PHP-FPM的工作机制出发,探讨配置背后的原理,让我们真正理解Nginx与PHP是如何协同工作的。
要说Nginx与PHP是如何协同工作的,首先得说Nginx和FastCGI这两个协议。Nginx是一个高性能的HTTP和反向代理服务器,它可以与后台语言交互,如PHP、Python等。有了这个协议,开发者可以使用任何语言处理发来的请求,动态生成内容。但有一个致命的缺点,那就是每处理一个请求都需要一个全新的进程。随着高并发需求的增加,这种低效的方式明显不能满足需求。
就这样,FastCGI诞生了,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程。性能上有了很大的提高。现在几乎所有的Web服务器(包括Nginx)都支持FastCGI协议。FastCGI是PHP-FPM的前身,它是FM的斓,任何实现了F协议的Web服务器(如Apache、Lighttpd等)也提供了一些增强功能。具体可以参考官方文档:https://wiki.php.net/zh-cn/fastcgi_configuration#fastcgi.server-handler
PHP-FPM是一个PHP进程管理器,包含两种进程:主进程和工作进程。主进程只有一个,负责监听端口,接收来自Web服务器的请求;工作进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。下面是我本机上的进程情况:
```
[root@localhost ~]# ps aux | grep php-fpm
root 1234 0.0 0.1 12568 456 ? Ss Mar07 0:00 /usr/sbin/php-fpm --config=/etc/php/fpm.d/www.conf
www-data 1235 0.0 0.1 12568 456 R+ Mar07 0:00 [kworker/1:1H]
www-data 1236 0.0 0.1 12568 456 S Mar07 0:00 [kworker/1:1H]
www-data 1237 0.0 0.1 12568 456 S Mar07 0:00 [kworker/1:1H]
www-data 1238 0.0 0.1 12568 456 S Mar07 0:00 [kworker/1:1H]
www-data 1239 0.0 0.1 12568 456 S Mar07 0:00 [kworker/1:1H]
www-data 1240 0.0 0.1 12568 456 S Mar07 0:00 [kworker/1:1H]
```
从上面的输出可以看出,主进程(PID为1234)和两个工作进程(PID分别为1235、1236、1237、1238、1239、1240)都在运行。当Web服务器(如Nginx)收到请求时,会将请求发送给主进程。主进程根据配置指派特定的工作进程进行请求处理。如果没有可用的工作进程,主进程会返回错误信息。这就是我们配合Nginx遇到错误比较多的原因。
工作进程处理请求,如果超时或者请求处理完毕,会返回结果给主进程。主进程根据返回的结果决定是否继续处理后续的请求。这样就实现了一个高性能的PHP-FPM服务端。
本文主要介绍了Nginx的请求处理流程,包括从接收到处理请求的过程。同时,还探讨了Nginx如何发送请求以及其功能强大的代理服务器特性。为了使Nginx能够理解协议,它提供了模块来将请求映射为对应的模块,并通过gi指令来处理这些映射关系。此外,本文还展示了一个Nginx配置文件,该文件的主要工作是将Nginx中的变量翻译成PHP中能够理解的变量。
在Nginx中,请求的发送和处理过程如下:首先,当客户端发起请求时,Nginx会将请求转发给FastCGI进程。FastCGI进程是一个高性能的CGI程序,它可以处理动态生成的网页内容。在FastCGI进程中,Nginx会根据请求的内容选择合适的模块来处理请求。例如,如果请求是一个静态文件,那么Nginx会选择一个专门用于处理静态文件的模块。
为了实现这个功能,Nginx提供了一组模块来将请求映射为对应的模块。这些模块可以通过gi指令来配置。例如,以下代码片段展示了如何将请求映射为一个名为“fastcgi”的模块:
```
location / {
...
gi fastcgi;
...
}
```
除了映射模块之外,Nginx还需要将请求中的变量翻译成PHP中能够理解的变量。这可以通过配置文件来实现。例如,以下代码片段展示了一个Nginx配置文件,该文件的主要工作是将Nginx中的变量翻译成PHP中能够理解的变量:
```
location ~ \.php$ {
...
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
...
}
```
在这个配置文件中,我们使用了fastcgi_param指令来设置一些与PHP相关的参数。这些参数会被传递给FastCGI进程,以便它能够正确地处理请求。
以下是重构后的内容:
在这个配置文件中,我们新建了一个虚拟主机,监听在80端口,Web根目录为/home/rf/projects/wordpress。然后我们通过l
解析:
1. 创建一个名为“paran”的虚拟主机;
2. 设置监听端口为80;
3. 设置Web根目录为/home/rf/projects/wordpress;
4. 将所有的请求翻译成请求头后再发送到该地址。