一直以来本地都在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支持多线程。