如何在 windows 下安装和删除 nginx 服务,请看我的另外一篇文章:把 nginx 安装为 Windows 的一个服务
关于 nginx 与 Apache
笔者所在的公司,开发环境用过 Apache 来支持 php(配置很容易),而线上用的是 nginx,为了与线上环境保持一致,笔者花了些时间把开发环境改成 nginx。
在配置的过程中,遇到好多坑,特此记录下来,除了备忘、给新员工当教程,同时也希望能帮到需要的朋友。
在安装为系统服务之前,下面的命令,对于开发阶段,已经足够。
1 | nginx -t # 检查 nginx 的配置是否有效 |
注意,安装成服务之后,上面的命令不起作用了,如果修改了配置想要生效,只能 net stop nginx 然后 net start nginx。
当然也可以 net stop nginx 之后(在 windows 服务管理窗口也可以操作),进入安装目录,重新用上面的命令。
另外,如果上面的命令也没能使配置生效,那么,这时一般会有多于一个 nginx 进程,全部结束掉,然后再开启 nginx 就能解决。
配置 nginx 支持 php
php 版本,我们需要下载 NTS 版本。
nginx 下 php 是以 FastCGI 的方式运行,所以我们下载非线程安全也就是 nts 的 php 包。
官方提供了两种版本,即线程安全和非线程安全。
- TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。
- NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查。
- php 所有版本下载地址,目前官网 www.php.net只提供 7.X 和 8.x 的版本。
PHP 的两种执行方式:ISAPI 和 FastCGI
- CGI(通用网关接口/Common Gateway Interface)一般是可执行程序,例如 EXE 文件,和 WEB 服务器各自占据着不同的进程,而且一般一个 CGI 程序只能处理一个用户请求。这样,当用户请求数量非常多时,会大量占用系统的资源,如内存、CPU 时间等,造成性能低下。
- FastCGI 是可伸缩架构的 CGI 开放扩展,其主要行为是将 CGI 解释器进程保持在内存中并因此获得较高的性能。传统的 CGI 解释器的反复加载是 CGI 性能低下的主要原因,如果 CGI 解释器保持在内存中并接受 FastCGI 进程管理器调度,则可以提供良好的性能、伸缩性等。nginx 下 php 是以 FastCGI 的方式运行,所以我们需要下载 Non Thread Safe 版本。
- ISAPI(Internet Server Application Program Interface)是微软提供的一套面向 WEB 服务的 API 接口,它能实现 CGI 提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接口。ISAPI 应用大多数以 DLL 动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理别的用户输入。此外,ISAPI 的 DLL应用程序和 WEB 服务器处于同一个进程中,效率要显著高于 CGI。所以如果是以 ISAPI 来执行 PHP,建议选择 Thread Safe版本。
修改 php.ini 文件
在 php 目录下,将 php.ini-production 改为 php.ini,按如下步骤修改。
- 搜索“extension_dir”,找到:;extension_dir = “ext” 先去前面的分号再改为 extension_dir = “C:\dev\dev.services\php-5.4.45\ext”
- 搜索“date.timezone”,找到:;date.timezone = 先去前面的分号再改为 date.timezone = Asia/Shanghai
- 搜索“enable_dl”,找到:enable_dl = Off 改为 enable_dl = On
- 搜索“cgi.force_redirect” ;cgi.force_redirect = 1 先去前面的分号再改为 cgi.force_redirect = 0
- 搜索“fastcgi.impersonate”,找到: ;fastcgi.impersonate = 1 去掉前面的分号
- 搜索“cgi.rfc2616_headers”,找到:;cgi.rfc2616_headers = 0 先去前面的分号再改为 cgi.rfc2616_headers = 1
- 搜索“php_mysql”,找到:”extension=php_mysql.dll和extension=php_mysqli.dll 去掉前面的“;”(支持MYSQL数据库)
配置 nginx 站点
1 | server { |
注意这里面的 $document_root 变量,它对应的内容就是 root 参数值,如果我们没有定义 root 参数,在访问 php 页面的时候,会报错:“No input file specified.”。
配置完成后,需要重启 nginx1
2
3
4
5
6# 如果安装成 windows 服务,用下面的命令
net stop nginx
net start nginx
# 否则,进入 nginx 目录,输入:
nginx -s stop
start nginx
运行 php-cgi
1 | # 请注意需要将路径替换成你自己的。 |
如果需要停止 php-cgi 按 ctrl + c 或者关闭窗口即可。
注意,只有在开启 php-cgi 的情况下,nginx 才能正常解析 php 程序。
当然,我们通常是需要一直保持 php-cgi 运行的,甚至是开机自动运行。那么,如果用这种方式运行,dos 窗口不能关,不太方便,怎么破?我们可以借助一个小工具 RunHiddenConsole(感谢开发者),让 php-cgi 在后台运行。
RunHiddenConsole
- CSDN 下载地址:RunHiddenConsole,或自行百度,挺多的。
- RunHiddenConsole.exe 的作用是在执行完命令行脚本后可以自动关闭 cmd 窗口,而从脚本中开启的进程不被关闭。
下载后解压,我电脑上的目录是: C:\dev\dev.services\RunHiddenConsole,在这个文件夹中添加一个批处理文件:startPhpCgi.bat
1
2
3@echo off
set phpHome=C:\dev\dev.services\php-5.4.45-nts-Win32-VC9-x86
RunHiddenConsole.exe %phpHome%\php-cgi.exe -b 127.0.0.1:9000 -c %phpHome%\php.ini创建 startPhpCgi.bat 的快捷方式,将快捷方式复制到启动目录(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp),这样,电脑打开后会自动运行。
可以放 startPhpCgi.bat 快捷方式的启动目录还有一个:用户目录:C:\Users\userName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, 其中 userName 为用户名。
如果要停止 php-cgi ,以管理员身份运行如下命令
1
taskkill /F /IM php-cgi.exe > nul
建议将 nginx 安装成 windows 服务并设置为自动启动,这样一来,开机之后就可以撸代码了,而不用担心 php-cgi 和 nginx 服务是否还没有启动。
- 把 nginx 安装为 Windows 的一个服务,照此操作,nginx 服务默认就是随操作系统自启动的。