一直以来本地都在windows下使用apache进行开发。使用集成包wamp,装完即用,不亦乐乎。虽然测试环境和生产环境使用的都是nginx。但是基本上是运维在负责配置。自己装的虚拟机虽然有搭过一次,但是使用的是公司的一套集成包,install之后简单配个虚拟域名就完事了。所以这是第一次系统的自己安装nginx+php开发环境。
安装Nginx
nginx安装比较简单,我本机已经安装过brew。(mac的系统管理工具,用于安装各种服务,非常方便)
brew search nginx
brew install nginx
这样就安装好了。
启动nginx之后,浏览器访问localhost:8080,nginx默认8080端口。就可以看到nginx。
sudo nginx //启动nginx
安装php
这里我使用的是mac os 里自带的php。
因为nginx跟apache不一样,nginx只支持fastcgi协议。(详细区别,自行百度)。
所以,这里需要启动php-fpm(是一个PHPFastCGI管理器),因为这里不聊服务器与应用程序之间的交互,不做解释。有兴趣的自行百度。
sudo php-fpm //启动php-fpm
直接启动可能会报错。启动之前需要copy一份php-fpm的配置文件。
sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
同时修改配置文件中的错误日志 error_log存放日志。
正确路径应为
error_log = /usr/local/var/log/php-fpm.log
修改nginx以支持php
配置好php之后,需修改nginx.conf,来支持php。
这里我直接在nginx.conf里的http位置引入虚拟服务器。(nginx一般都以这种方式来配置,通过引入子配置文件来控制不同虚拟服务器)
server {
listen 80; // 监听端口
server_name localhost2; //虚拟域名
index index.html index.htm index.php; //index.php 识别phh 文件
root /Library/WebServer/gz_nissan/web; //次虚拟服务器的目录
location / { // 隐藏入口文件index.php
if (!-e $request_filename) {
rewrite ^/index.php(.*)$ /index.php?s=$1 last;
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
location ~ \.php$ { //配置与php通信,以支持访问php
# root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /usr/local/etc/nginx/fastcgi_params;
}
location ~ /\.
{
deny all;
}
}
以上注释是我后加的,没太注意,用了php的注释。服务器的注释方式应该是#。
以上代码,只需要创建一个文件。然后在nginx.conf里引用就可以了。其实最重要的是配置fastcgi,这样才能确保正常访问php。
简单介绍nginx和php的通信过程
这是我配置完nginx后对这个通信过程的一些理解。可能不准确,如果有想法,可以讨论。
当客户端访问一个url连接时。请求会被nginx获取。nginx识别出这是一个php的请求后,通过fastcgi协议约定的端口127.0.0.1:9000,将请求传给php处理。这时候请求就到了php-fpm这里。
而php-fpm遵循的fastcgi协议,与传统的php-cgi(apache传递的处理)不一样。fastcgi会在请求到来之前,会启动一个master,加载php.ini配置。然后启动多个worker。当请求过来时,master就可以直接分配给一个worker。这样节省了资源。(因为传统的php-cgi在每一次请求的时候都启动加载一次php配置,浪费资源)同时从另一个角度上讲,nginx支持多线程。