windows 下的 nginx + php 环境搭建
  • 分类:PHP
  • 发表:2012-03-20
  • 围观(2,579)
  • 评论(0)

这几天有一台 Web 服务器一直不定时出现无法访问的情况,远程一看,Apache 进程占用内存极高,而这台服务器偏偏内存不富裕,就像换成目前极度流行的 nginx 试试。

nginx 是一个轻量级的高性能 Http WebServer,以事件驱动方式编写,因此相比 Apache 而言,Nginx 更加稳定、性能更好,而且配置简单,资源占用较低。目前 Windows 下的稳定版本是 1.0.14,可以在官网免费下载。

nginx 在 windows 下的安装很简单,下载回来 zip 包后,解压就行了。需要注意的是,路径里面只能是纯英文字母和数字,并且不能有空格。比如我们解压到 "d:\wnmp\nginx"。

nginx 的配置文件是 conf 目录下的 nginx.conf 文件。我们可以用任意一个文本编辑器,比如 editplus 来编辑它。

nginx 的配置文件,很像 C语言,每个段落用大括号 {} 括起来,每句用分号 ; 结尾。不过注释符号是井号 #。

worker_processes  1;

这个是说打开1个进程。

error_log  logs/error.log;

把前面的注释符 # 去掉。这样将会在 logs 目录下的 error.log 文件记录错误日志。

events 段只有一句:

worker_connections  1024;

这是一个进程所处理的最大连接数上限,如果你的网站超大型,可以视你的服务器性能改大一些,我用的默认值。

http 段就是重点了。

把 log_format 前面的 # 去掉,这规定了日志的记录格式,可读性有所提高。

access_log  logs/access.log  main;

访问日志默认也是关闭的,建议打开。

server 段里面定义的就是虚拟主机了,直接改成这样

 server {
listen       80;
server_name  felixqu.com;
root   D:/wnmp/www/felixqu.com;
index  index.php;
access_log  logs/felixqu.com.access.log  main;

location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
}
error_page   500 502 503 504  /50x.html;
}

root 后面就是网站文件路径,我们统一放在 d:\wnmp\www\ 里面。

注意 location 子段(红字部分)里的定义,这是说明这个虚拟主机是通过 FastCGI 运行的,FastCGI 的端口是9000(这个后面配置 php 的时候会说到)。同时引用 fastcgi.conf 这个文件,这里面是 nginx 的 fastcgi 参数。其他的大家应该能看懂吧。可以定义多个 server 字段来搭建多个虚拟主机。如果你的虚拟主机比较多,建议把红字部分单独建立一个conf文件,再引用进来,这样可以简化配置。

启动 nginx

和 Apache 不同的是,nginx 目前不能做为服务(Service)运行,必须手动执行 nginx.exe 来启动它,这是一个不方便的地方。我们可以用批处理来解决这个问题。另外,官网上说,作为服务运行将可能在未来实现:)

建立一个批处理文件 "start_nginx.bat",内容是

ECHO Starting nginx...
d:/wnmp/nginx/nginx.exe -p d:/nginx

注意斜杠要反过来写。

可以将这个批处理文件加入启动组,就可以在服务器启动时启动 nginx 了。

安装 PHP5

看了半天,还没说 php 呢,现在 php 都出到 5.4 了,不过我还是用的 5.2.17 版本。由于 nginx 是 FastCGI 方式调用 php,因此需要下载 nts(非线程安全)版本的 php,也就是php-5.2.17-nts-Win32-VC6-x86.zip 这个文件。下载回来解开到 d:\php,php.ini 就不多说了,主要修改这几个地方

error_reporting = E_ALL
display_errors = On
extension_dir = "d:\wnmp\php5\ext"

; 动态扩展,可以根据需要去掉 extension 前面的注释 ;
; 如加载  MySQL
extension=php_mysql.dll
extension=php_mysqli.dll
; CGI 设置,非常重要!
cgi.fix_pathinfo = 1

PHP 加载扩展需要注意依赖性,比如 php_exif.dll 需要 php_mbstring.dll,你必须要把 php_mbstring.dll 放在 php_exif.dll 前面才能加载成功。

配置 PHP FastCGI

Nginx 需要和 FastCGI Server 配合才能处理请求,有两种方式运行 PHP FastCGI Server,相对比较方便的一种就是使用 PHP 内置的 FastCGI 管理器。在命令行输入:

d:/wnmp/php5/php-cgi.exe -b 127.0.0.1:9000 -c d:/wnmp/php5/php.ini

记得刚才定义的9000端口吗,这里就告诉 PHP 的 FastCGI 管理器去 9000 端口解释执行 php 文件(不用拷贝 php.ini 文件到 nginx 目录)。

好吧,我们把这句命令加到刚才的批处理里面。

@ECHO OFF

REM 每个进程处理的最大请求数,或设置为 Windows 环境变量
set PHP_FCGI_MAX_REQUESTS=1000

ECHO Starting PHP FastCGI...
RunHiddenConsole C:/php5/php-cgi.exe -b 127.0.0.1:9000 -c C:/php5/php.ini

ECHO Starting nginx...
C:/nginx/nginx.exe -p C:/nginx

这样就可以同时启动 nginx 和 PHP FastCGI。

这种方法有个小缺陷,就是那个命令行窗口会一直打开着,手工关闭的话,会同时把 Nginx 和 php-cgi.exe 一起关掉。

这里介绍一个小工具——RunHiddenConsole.exe,这是一个用来隐藏 DOS 窗口的小程序,可以在这里下载。 这样我们就可以把上面的批处理改成下面这样子:

@ECHO OFF
set PHP_FCGI_MAX_REQUESTS=1000
echo Starting nginx...
RunHiddenConsole d:/nginx/nginx.exe -p d:/wnmp/nginx
echo Starting PHP FastCGI...
RunHiddenConsole C:/php5/php-cgi.exe -b 127.0.0.1:9000 -c C:/php5/php.ini

同样的,创建 stop_nginx.bat,用来关闭(方便重启 nginx):

@ECHO OFF
echo Stopping nginx...
taskkill /F /IM nginx.exe > nul
echo Stopping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul
exit

这样就差不多了,在 D:/wnmp/www/felixqu.com 目录下放个 phpinfo 文件就可以看到 php 运行在 FastCGI 模式下。

共有 0 条评论

Top