下载安装Nginx 与 PHP

  1. Nginx: download
  2. PHP: download

找到Windows 版本下载即可;

配置 Nginx 与 php-cgi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
listen 80;
server_name 自己的域名;
access_log logs/access.log main;

# 默认网站根目录
root D:/site/php/cms;
index index.html index.htm index.php;

location / {
try_files $uri $uri/ /index.php$uri?$query_string;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

# PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI协议默认配置.
# Fastcgi服务器和程序(PHP,Python)沟通的协议.
location ~ \.php {
# 设置监听端口
fastcgi_pass 127.0.0.1:9000;
# 设置nginx的默认首页文件(上面已经设置过了,可以删除)
fastcgi_index index.php;
# 设置脚本文件请求的路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 引入fastcgi的配置文件
include fastcgi_params;
}
}

其中 “fastcgi_pass” 为 Nginx 匹配到 有php 处理传递的地址及端口,这样, Nginx 就与 php-cgi 程序做了对接;注意字段:root、index、try_files 等;

Nginx、php-cgi 及 Laravel 组合出现的问题

使用 Nginx、php-cgi 及 Laravel 组合,当使用Guzzlehttp请求自己的时候出错了,表现为:504 timeout,再无跟多信息。

问题解析:

php-cgi 只启动了一个进程,nginx又不维护进程池,单个请求还好,一旦出现自己请求自己,就麻瓜了。因为自己请求自己,不就是递归吗,但是提供递归的服务是单线程,发请求占用了唯一的线程,一直hang到超时。

解决方案

  1. 更换 Nginx 为 Apache;
  2. 使用第三方 进程管理工具 启用多个 php-cgi 进程;
  3. 手动启动多个 php-cgi 进程;

手动启动多个 php-cgi 进程

  1. 启动多个 php-cgi 进程

    1
    2
    3
    4
    php-cgi.exe -b 127.0.0.1:9000 -c "%batDir%php/php.ini"
    php-cgi.exe -b 127.0.0.1:9001 -c "%batDir%php/php.ini"
    php-cgi.exe -b 127.0.0.1:9002 -c "%batDir%php/php.ini"
    php-cgi.exe -b 127.0.0.1:9003 -c "%batDir%php/php.ini"
  2. Nginx 配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    http {
    upstream fastcgi_backend {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
    server 127.0.0.1:9003;
    }
    }
  3. 修改 php 脚本处理接口:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    location ~ \.php {
    # 设置监听端口
    #fastcgi_pass 127.0.0.1:9000;
    fastcgi_pass fastcgi_backend;
    # 设置nginx的默认首页文件(上面已经设置过了,可以删除)
    fastcgi_index index.php;
    # 设置脚本文件请求的路径
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    # 引入fastcgi的配置文件
    include fastcgi_params;
    }

    注意 字段 fastcgi_pass 的修改

参考

  1. php curl timeout Guzzlehttp请求超时
  2. window+nginx+php-cgi的php-cgi线程/子进程问题