首先来描述一下我们的场景:在这之前我的PHP应用一直发布在Apache上,但是现在我要将它直接发布到Nginx上,那么我的配置就需要做一些调整。Windows下,Nginx实际上会将接收到的请求交给运行php的CGI进程来执行,所以Nginx启动之前,需要通过php-cgi来运行PHP。也就是说Nginx以及PHP进程都需要启动运行,应用才可以正常发布。这个确实跟Apache下的发布不太一样,好了思路明确了看看具体配置。
PHP的配置
修改php.ini:
1. 修改 extension_dir = "D:\Web\php-7.1.4-Win32-VC14-x64\ext"
2. 修改 date.timezone = Asia/Shanghai
3. 修改 enable_dl = On
4. 修改 cgi.force_redirect = 0
5. 修改 fastcgi.impersonate = 1
6. 修改 cgi.rfc2616_headers = 1
7. 修改 extension=php_mysqli.dll
和 extension=php_pdo_mysql.dll
(我们早已配置了支持Mysql,所以省了)
这个就不多说了,修改的地方比较多,已经记不全修改了什么。
Nginx关于PHP的配置
其实主要修改的只有下面的地方,配置Web应用目录,修改默认页,以及配置PHP运行环境。
location / {
root D:/Web/app;
index index.html index.htm inde.php;
}
location ~ \.php$ {
root D:/Web/app;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
到这里,我们的配置就已经结束了,是不是很简单,这是我们需要在CMD窗口下运行命令,来通过CGI运行PHP。php-cgi.exe -b 127.0.0.1:9000-c D:\Web\php-7.1.4-Win32-VC14-x64\php.ini
重启我们的Nginx服务,就可以看到我们所发布的应用了。
但是!!这里有一个严重的问题。当CGI进程跑的时间长了,cgi进程会自动退出。原本以为他会默默的无私的,安静的执行,但是它竟然不work了。在网上了解到的是说进程有一个最大的连接数限制,当到达这个连接数上线后就会自动退出。大部分的解决方案是通过xxfpm进程管理器来管理php进程,并用RunHiddenConsole小工具来使php进程在后台执行。好吧对于PHP环境不了解的我们就按照这套方案来弄。文末参考资料中有提供两个小工具的下载地址。
通过批处理启动PHP的CGI进程以及Nginx
新建两个批处理文件,文件名以后缀.bat结尾,分别叫start.bat和stop.bat。
1. start.bat:启动5个FastCGI进程,并在后台运行,同时启动Nginx服务。
@echo off
CD D:\Web\RunHiddenConsole
REM set PHP_FCGI_CHILDREN=5
echo Starting PHP FastCGI...
REM RunHiddenConsole.exe php7\php-cgi.exe -b 127.0.0.1:9000 -c php7\php.ini
RunHiddenConsole D:\Web\xxfpm\bin\xxfpm.exe "D:/Web/php-7.1.4-Win32-VC14-x64/php-cgi.exe -c D:/Web/php-7.1.4-Win32-VC14-x64/php.ini" -n 5 -i 127.0.0.1 -p 9000
echo Starting nginx...
RunHiddenConsole D:/Web/nginx-1.13.0/nginx.exe -p D:/Web/nginx-1.13.0
exit
2. stop.bat:结束FastCGI进程,并关闭Nginx服务。
@echo off
echo Stopping nginx...
taskkill /F /IM nginx.exe > nul
echo Stopping PHP FastCGI...
taskkill /F /IM xxfpm.exe > nul
REM taskkill /F /IM php-cgi.exe > nul
exit
现在,在我们的任务管理器-进程中,可以看到有5个CGI/FastCGI,当其中一个挂掉之后会重新启动一个。这样可以保证进程CGI进程稳定运行。
现在我们的应用就已经发布完全了。通过两个批处理就可以启动发布用到的所有服务,是不是方便了很多呢?