FastCGI模式下运行php7
众所周知,常用的跟php搭配的web server 有两个,apache 和nginx,编译完server之后需要配置下才可以正常解析php文件。下面我们来看下两种服务器是如何解析php文件。
Nginx
一、主流的nginx+php的运行原理如下:
nginx的worker进程直接管理每一个请求到nginx的网络请求。
对于php而言,由于在整个网络请求的过程中php是一个cgi程序的角色,所以采用名为php-fpm的进程管理程序来对这些被请求的php程序进行管理。php-fpm程序也如同nginx一样,需要监听端口,并且有master和worker进程。worker进程直接管理每一个php进程。
关于fastcgi:fastcgi是一种进程管理器,管理cgi进程。市面上有多种实现了fastcgi功能的进程管理器,php-fpm就是其中的一种。再提一点,php-fpm作为一种fast-cgi进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机,也就是只接收来自本机的端口请求,所以我们通常输入命令
netstat -nlpt|grep php-fpm
会得到:tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1078/php-fpm
关于fastcgi的配置文件,目前fastcgi的配置文件一般放在nginx.conf同级目录下,配置文件形式,一般有两种:
fastcgi.conf
和fastcgi_params
。不同的nginx版本会有不同的配置文件,这两个配置文件有一个非常重要的区别:fastcgi_parames文件中缺少下列配置:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
我们可以打开fastcgi_parames文件加上上述行,也可以在要使用配置的地方动态添加。使得该配置生效。当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php。
二、nginx 配置
来看一个host的简单配置:
server {
listen 80;
server_name example.com;
location ~ \.php?.*$ {
root /home/mark/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 第一个大括号
server{ }
不必多说,代表一个独立的serverlisten 80
代表该server监听8011端口location ~ \.php?.*${ }
代表一个能匹配对应uri的location,用于匹配一类uri,并对所匹配的uri请求做自定义的逻辑、配置。这里的location,匹配了所有带.php的uri请求root /home/mark/www
请求资源根目录,告诉匹配到该location下的uri到/home/mark/www文件夹下去寻找同名资源。fastcgi_pass 127.0.0.1:9000
将进入到该location内的uri请求看做是cgi程序,并将请求发送到9000端口,交由php-fpm处理。
6.fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
动态添加了一行fastcgi配置,配置内容为SCRIPT_FILENAME
,告知管理进程,cgi脚本名称。由于我的nginx中只有fastcgi_params文件,没有fastcgi.conf文件,所以要使php-fpm知道SCRIPT_FILENAME的具体值,就必须要动态的添加这行配置。
7、include fastcgi_params
引入fastcgi配置文件
以上就是最简洁版的nginx启动php脚本的最简配置,当重启nginx之后,在/home/mark/www目录下创建一个hello.php文件,输入<?php echo "hello world"; ?>
保存,然后在浏览器中访问localhost/hello.php
就可以在网页上显示hello world了。
Apache
相比nginx ,apache 配置fastcgi稍微麻烦些,SetHandler/ProxyPassMatch/ProxyPass/Mod_Rewrite 都可以做到,这里我们只说官方推荐的ProxyPassMatch方法。
- 加载代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
- 配置虚拟主机支持
<VirtualHost *:80>
DocumentRoot "/home/mark/www"
ServerName test.com
DirectoryIndex /index.php index.php
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/home/mark/www/$1
<Directory "/home/mark/www">
Options none
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
重启apache,测试下,ok~
推荐阅读
-
FastCGI模式下运行php7
-
Django以fastcgi模式下的Nginx配置文件
-
Windows下PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
-
Windows下IIS以FastCGI模式运行PHP,iisfastcgi
-
如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出
-
Windows下Apache以FastCGI模式运行PHP_PHP
-
Windows下IIS以FastCGI模式运行PHP
-
php Cli 模式下 msg_get_queue 运行报错,怎么解?
-
Windows 下 Apache 1.3 以 FastCGI 模式运行 PHP_PHP教程
-
尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。