如题

如何在 windows 下安装和删除 nginx 服务,请看我的另外一篇文章:把 nginx 安装为 Windows 的一个服务

关于 nginx 与 Apache

笔者所在的公司,开发环境用过 Apache 来支持 php(配置很容易),而线上用的是 nginx,为了与线上环境保持一致,笔者花了些时间把开发环境改成 nginx。
在配置的过程中,遇到好多坑,特此记录下来,除了备忘、给新员工当教程,同时也希望能帮到需要的朋友。

在安装为系统服务之前,下面的命令,对于开发阶段,已经足够。

1
2
3
4
5
6
nginx -t        # 检查 nginx 的配置是否有效
start nginx # 启动 nginx
nginx -s stop # 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。(快速退出)
nginx -s reload # 因改变了Nginx相关配置,需要重新加载配置而重载。(重新加载配置)
nginx -s quit # 平稳关闭Nginx,保存相关信息,有安排的结束web服务。(平滑退出)
nginx -s reopen # 重新打开日志文件。(重新加载日志)

注意,安装成服务之后,上面的命令不起作用了,如果修改了配置想要生效,只能 net stop nginx 然后 net start nginx。
当然也可以 net stop nginx 之后(在 windows 服务管理窗口也可以操作),进入安装目录,重新用上面的命令。
另外,如果上面的命令也没能使配置生效,那么,这时一般会有多于一个 nginx 进程,全部结束掉,然后再开启 nginx 就能解决。

配置 nginx 支持 php

php 版本,我们需要下载 NTS 版本。

nginx 下 php 是以 FastCGI 的方式运行,所以我们下载非线程安全也就是 nts 的 php 包。
官方提供了两种版本,即线程安全和非线程安全。

  1. TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。
  2. NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查。
  3. php 所有版本下载地址,目前官网 www.php.net只提供 7.X 和 8.x 的版本。
PHP 的两种执行方式:ISAPI 和 FastCGI
  1. CGI(通用网关接口/Common Gateway Interface)一般是可执行程序,例如 EXE 文件,和 WEB 服务器各自占据着不同的进程,而且一般一个 CGI 程序只能处理一个用户请求。这样,当用户请求数量非常多时,会大量占用系统的资源,如内存、CPU 时间等,造成性能低下。
  2. FastCGI 是可伸缩架构的 CGI 开放扩展,其主要行为是将 CGI 解释器进程保持在内存中并因此获得较高的性能。传统的 CGI 解释器的反复加载是 CGI 性能低下的主要原因,如果 CGI 解释器保持在内存中并接受 FastCGI 进程管理器调度,则可以提供良好的性能、伸缩性等。nginx 下 php 是以 FastCGI 的方式运行,所以我们需要下载 Non Thread Safe 版本。
  3. 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,按如下步骤修改。

  1. 搜索“extension_dir”,找到:;extension_dir = “ext” 先去前面的分号再改为 extension_dir = “C:\dev\dev.services\php-5.4.45\ext”
  2. 搜索“date.timezone”,找到:;date.timezone = 先去前面的分号再改为 date.timezone = Asia/Shanghai
  3. 搜索“enable_dl”,找到:enable_dl = Off 改为 enable_dl = On
  4. 搜索“cgi.force_redirect” ;cgi.force_redirect = 1 先去前面的分号再改为 cgi.force_redirect = 0
  5. 搜索“fastcgi.impersonate”,找到: ;fastcgi.impersonate = 1 去掉前面的分号
  6. 搜索“cgi.rfc2616_headers”,找到:;cgi.rfc2616_headers = 0 先去前面的分号再改为 cgi.rfc2616_headers = 1
  7. 搜索“php_mysql”,找到:”extension=php_mysql.dll和extension=php_mysqli.dll 去掉前面的“;”(支持MYSQL数据库)

配置 nginx 站点

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
server {
listen 80;
server_name my.site.com;
charset utf-8;
access_log logs/my.site.com.access.log;
error_log logs/my.site.com.error.log;
root D:/dev.workspace/php/mysite/web/;
index index.php;

# 下面的配置需要根据你用的 php 框架灵活变更
# 我们的框架只有 index.php 一个 php 为后缀的文件,其它都是 html 为后缀的文件
# 我们的项目采用了 mvc 框架,配置路由来访问相关页面,url 没有文件后缀。
# 所以,必须这样配置,否则除了访问 index.php 之外,会报 404 错误。
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php last;
break;
}
}

location ~ \.php$ {
#root D:/dev.workspace/php/mysite/web/; #上面已经设置过,这里不用再设置,应该是二选一
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 1d; #新增,xdebug调试时长
}
}

注意这里面的 $document_root 变量,它对应的内容就是 root 参数值,如果我们没有定义 root 参数,在访问 php 页面的时候,会报错:“No input file specified.”。

配置完成后,需要重启 nginx

1
2
3
4
5
6
# 如果安装成 windows 服务,用下面的命令
net stop nginx
net start nginx
# 否则,进入 nginx 目录,输入:
nginx -s stop
start nginx

运行 php-cgi

1
2
3
# 请注意需要将路径替换成你自己的。
cd C:\dev\dev.services\php-5.4.45-nts-Win32-VC9-x86
php-cgi.exe -b 127.0.0.1:9000 -c C:\dev\dev.services\php-5.4.45-nts-Win32-VC9-x86\php.ini

如果需要停止 php-cgi 按 ctrl + c 或者关闭窗口即可。
注意,只有在开启 php-cgi 的情况下,nginx 才能正常解析 php 程序。
当然,我们通常是需要一直保持 php-cgi 运行的,甚至是开机自动运行。那么,如果用这种方式运行,dos 窗口不能关,不太方便,怎么破?我们可以借助一个小工具 RunHiddenConsole(感谢开发者),让 php-cgi 在后台运行。

RunHiddenConsole

  1. CSDN 下载地址:RunHiddenConsole,或自行百度,挺多的。
  2. RunHiddenConsole.exe 的作用是在执行完命令行脚本后可以自动关闭 cmd 窗口,而从脚本中开启的进程不被关闭。
  3. 下载后解压,我电脑上的目录是: 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
  4. 创建 startPhpCgi.bat 的快捷方式,将快捷方式复制到启动目录(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp),这样,电脑打开后会自动运行。

    可以放 startPhpCgi.bat 快捷方式的启动目录还有一个:用户目录:C:\Users\userName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, 其中 userName 为用户名。

  5. 如果要停止 php-cgi ,以管理员身份运行如下命令

    1
    taskkill /F /IM php-cgi.exe > nul
  6. 建议将 nginx 安装成 windows 服务并设置为自动启动,这样一来,开机之后就可以撸代码了,而不用担心 php-cgi 和 nginx 服务是否还没有启动。

  7. 把 nginx 安装为 Windows 的一个服务,照此操作,nginx 服务默认就是随操作系统自启动的。