在 Windows 上使用 IIS 部署 PHP 项目

前言

如何选择运行平台须要从多方面考量,不想参与任何关于 Linux 与 Windows 的争论,只是但愿能更理性的看待问题,而不是毫无原因的就否认一方。已经 9102 年了,不要把认知停留在 10 多年前的 Windows Server 2003 + IIS 6 时代,不管出于何种考量否认 Windows Server + IIS ,性能真的不能做为理由。php

从 IIS 7 开始,使用 IOCP 模型与内核态运行的 http.sys 使 IIS 的性能提高很是大。一样默认配置,纯静态文件输出性能甚至高于 Nginx。不过,虽然 Web Server 性能足够,但 Windows Server 网络层性能确实比 Linux 差,考虑到 Linux 内核能够进一步调优,高负载下仍是有可观的性能差距存在。若是应用瓶颈不在网络层,那么这个差距能够忽略。linux

功能方面,经过 IIS 集成的 Web Platform Installer (Web 平台安装程序) 安装 URL Rewrite、Application Request Routing 组件以后,也能够实现 URL 重写、反向代理、负载均衡、缓存服务等功能。git

平台差别分析

PHP 部署方式分为三种:github

  • Nginx + PHP-FPM
  • Apache + mod_php / mod_proxy_fcgi
  • IIS + PHP FastCGI

Nginx + PHP-FPM 与 IIS + PHP FastCGI 均可以看做 Web Server + FastCGI 的模式,差异在于 Nginx 与 FastCGI 之间多了一个 PHP-FPM(FastCGI 进程管理器)。Apache 也能够经过 mod_proxy_fcgi 搭配 PHP FastCGI,或者使用 mod_proxy_fcgi 搭配 PHP-FPM(High-performance PHP on apache httpd 2.4.x using mod_proxy_fcgi and php-fpm)。web

另外还有一个关于线程安全的差别,即 NTS (Not Thread Safe) 与 TS (Thread Safe),能够在官方文档问答章节看到说明:apache

What does thread safety mean when downloading PHP?windows

Thread Safety means that binary can work in a multithreaded webserver context, such as Apache 2 on Windows. Thread Safety works by creating a local storage copy in each thread, so that the data won't collide with another thread.缓存

So what do I choose? If you choose to run PHP as a CGI binary, then you won't need thread safety, because the binary is invoked at each request. For multithreaded webservers, such as IIS5 and IIS6, you should use the threaded version of PHP.安全

总结一下,对比 Windows 与 Linux 部署方式,除了 Web Server,最大的区别在因而否有 PHP-FPM ,而 PHP-FPM 暂时尚未原生 Windows 版本,只能经过 Cygwin 的方式运行。服务器

另外还须要考量的是 PHP 扩展,若是使用的扩展不支持 Windows 平台,那么能够直接放弃 Windows Server。

PHP On Windows

微软专门开设了 PHP on Windows 网站 ,能够查看相关的官方资料与技术支持文档。

安装 IIS

Windows Server 系统须要经过服务器管理添加 Web 服务器角色。须要注意的是必定要勾选应用程序开发下的 CGI 支持

Windows 10 须要在 控制面板 中打开 程序和功能 模块,经过左侧的 启用或关闭 Windows 功能 添加。可是要注意,非 Server 系统有一些限制,会影响 RPS 性能。

IIS 内置用户组 IIS_IUSER,与 Linux 同样,对应目录须要有相应的权限才能进行读写,对于安全要求很是高的状况下,须要每一个站点进行用户隔离,通常状况下使用 IIS_IUSER 足够。

另外,Windows 系统分区权限有一些特殊限制(与 SElinux 相似),通常用户即便设置了 NTFS 写入权限,也仍然会有写入问题存在。因此在非系统分区下存放项目能够避免不少没必要要的麻烦。

关于配置 NTFS 文件系统权限的具体操做,请自行百度。

  • IIS 日志

默认配置日志保存在系统盘路径下,通常是 C:\inetpub\logs\LogFiles。能够在 IIS 管理器的根配置进行统一修改,也能够单独针对站点配置。

推荐将日志根目录配置到非系统盘,按站点分日志文件,并配置为天天滚动更新。

  • 安装 Web Platform Installer

www.microsoft.com/web/downloa…

通常状况下 IIS 已经安装了该模块,若是没有能够手动安装。

  • 安装 URL Rewrite 模块

www.iis.net/downloads/m…

部署 PHP 项目必须安装的模块。

注:若是英语实在不行,能够在网页上下载中文(Chinese Simplified)版本,确保安装后的模块界面语言为中文。

  • 安装 Application Request Routing 模块

www.iis.net/downloads/m…

对于通常 PHP 项目不是必须的,能够用于实现反向代理、代理缓存、负载均衡等功能,该模块界面语言为英语。

安装 PHP

Recommended Configuration on Windows systems

PHP 与微软都推荐安装的扩展 WinCache,能够与 OpCache 一同开启,对提升性能有显著效果。 不过开启 OpCache 与 WinCache 扩展能够有效提升性能,可是建议验证部署成功后再开启,以避免由于缓存存在排查问题陷入困难。

  • 下载 PHP For Windows

通常能够经过 Web Platform Installer 安装,若是没有须要的版本则须要手动下载。

打开 windows.php.net/download/,下载须要的 PHP Non Thread Safe 版本便可。

须要注意版本名称 VC15 x64 Non Thread Safe 表示依赖的 VC Runtime 版本,若是系统没有安装对应的 VC Runtime 将没法运行,页面左侧有对应的下载链接。

  • 安装 PHP Manager For IIS

github.com/phpmanager/…

虽然能够手动注册 PHP FastCGI,可是强烈建议使用 PHP Manager For IIS, 能够用于管理 PHP 配置、扩展也很方便。若是使用手动注册 PHP FastCGI,须要在 IIS 管理界面中的默认文档手动添加 index.php

  • WinCache Extension for PHP

sourceforge.net/projects/wi…

WinCache 配置官方文档 php.net/manual/en/w…

OpCache 配置官方文档 php.net/manual/en/o…

PHP 配置

在 PHP Manager For IIS 中能够很方便的管理 PHP 的相关配置选项,也能够手动修改 php.ini 来进行配置。

临时文件
  • PHP FastCGI 错误日志
  • 临时文件
  • session cache

PHP FastCGI 错误日志默认路径在 C:\WINDOWS\Temp 目录下,生产环境须要在 PHP Manager For IIS 中配置服务器类型为生产环境。

在 PHP 设置中 upload_tmp_dirsession.save_path 的路径也都是 C:\WINDOWS\Temp。若是须要修改路径,还须要注意目录权限问题。

上传文件限制

上传文件限制受如下因素影响:

  • Web Server
  • FastCGI

除了文件大小限制以外,超时限制也会影响可上传文件大小。若是超时时间过短,带宽不足以在超时以前上传文件,也会上传失败。另外还有文件系统也可能形成上传失败,可是可能性比较小。

安全配置

微软为 PHP On IIS 提供了详细的安全实践 Plan PHP Application Security | Microsoft Docs

  • 移除 Web Server 版本信息

在 IIS 管理器根页面,进入配置编辑器,找到 system.webServer/security/requestFiltering 下的 removeServerHeader 项,修改值为 True

能够在 HTTP 响应标头 中添加一个自定义的 Server 头,好比 Nginx

  • 移除 X-Powered-By PHP 版本信息

在 PHP Manager For IIS 中配置 PHP 设置,修改 expose_phpOff

一样,能够在 HTTP 响应标头 中添加一个自定义的 X-Powered-By 头,好比 Java

  • 请求筛选

请求筛选中能够设置Web Server 端容许的 URL 长度,Query String 长度。可是应用是否能接收到完整的信息,还依赖与 PHP-FastCGI 的实现,以及 PHP 代码的实现。

经过请求筛选功能,能够阻止客户端访问特定路径。若是使用了 Git 直接获取代码用于部署,那么最好把 .git 路径屏蔽掉。若是有放代码压缩包在目录下的习惯,须要将特定路径的 .rar.zip 文件阻止访问。

注意:必定不要开启目录浏览功能。

其余

若是须要同时运行不一样版本的站点,或者每一个站点拥有单独的 php.ini 配置文件,能够参考微软文档 Configure PHP Application Security | Microsoft Docs 操做。

再次提醒,本文中关于目录权限的作法并非最安全的实践,为了便利而有所妥协。

相关文章
相关标签/搜索