如何選擇運行平臺須要從多方面考量,不想參與任何關於 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 與 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
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 網站 ,能夠查看相關的官方資料與技術支持文檔。
Windows Server 系統須要經過服務器管理添加 Web 服務器角色。須要注意的是必定要勾選應用程序開發下的 CGI 支持。
Windows 10 須要在 控制面板
中打開 程序和功能
模塊,經過左側的 啓用或關閉 Windows 功能
添加。可是要注意,非 Server 系統有一些限制,會影響 RPS 性能。
IIS 內置用戶組 IIS_IUSER
,與 Linux 同樣,對應目錄須要有相應的權限才能進行讀寫,對於安全要求很是高的狀況下,須要每一個站點進行用戶隔離,通常狀況下使用 IIS_IUSER
足夠。
另外,Windows 系統分區權限有一些特殊限制(與 SElinux 相似),通常用戶即便設置了 NTFS 寫入權限,也仍然會有寫入問題存在。因此在非系統分區下存放項目能夠避免不少沒必要要的麻煩。
關於配置 NTFS 文件系統權限的具體操做,請自行百度。
默認配置日誌保存在系統盤路徑下,通常是 C:\inetpub\logs\LogFiles
。能夠在 IIS 管理器的根配置進行統一修改,也能夠單獨針對站點配置。
推薦將日誌根目錄配置到非系統盤,按站點分日誌文件,並配置爲天天滾動更新。
www.microsoft.com/web/downloa…
通常狀況下 IIS 已經安裝了該模塊,若是沒有能夠手動安裝。
部署 PHP 項目必須安裝的模塊。
注:若是英語實在不行,能夠在網頁上下載中文(Chinese Simplified)版本,確保安裝後的模塊界面語言爲中文。
對於通常 PHP 項目不是必須的,能夠用於實現反向代理、代理緩存、負載均衡等功能,該模塊界面語言爲英語。
Recommended Configuration on Windows systems
PHP 與微軟都推薦安裝的擴展 WinCache,能夠與 OpCache 一同開啓,對提升性能有顯著效果。 不過開啓 OpCache 與 WinCache 擴展能夠有效提升性能,可是建議驗證部署成功後再開啓,以避免由於緩存存在排查問題陷入困難。
通常能夠經過 Web Platform Installer 安裝,若是沒有須要的版本則須要手動下載。
打開 windows.php.net/download/,下載須要的 PHP Non Thread Safe 版本便可。
須要注意版本名稱 VC15 x64 Non Thread Safe
表示依賴的 VC Runtime 版本,若是系統沒有安裝對應的 VC Runtime 將沒法運行,頁面左側有對應的下載鏈接。
雖然能夠手動註冊 PHP FastCGI,可是強烈建議使用 PHP Manager For IIS, 能夠用於管理 PHP 配置、擴展也很方便。若是使用手動註冊 PHP FastCGI,須要在 IIS 管理界面中的默認文檔手動添加 index.php
。
WinCache 配置官方文檔 php.net/manual/en/w…。
OpCache 配置官方文檔 php.net/manual/en/o…。
在 PHP Manager For IIS 中能夠很方便的管理 PHP 的相關配置選項,也能夠手動修改 php.ini 來進行配置。
PHP FastCGI 錯誤日誌默認路徑在 C:\WINDOWS\Temp
目錄下,生產環境須要在 PHP Manager For IIS 中配置服務器類型爲生產環境。
在 PHP 設置中 upload_tmp_dir
、session.save_path
的路徑也都是 C:\WINDOWS\Temp
。若是須要修改路徑,還須要注意目錄權限問題。
上傳文件限制受如下因素影響:
除了文件大小限制以外,超時限制也會影響可上傳文件大小。若是超時時間過短,帶寬不足以在超時以前上傳文件,也會上傳失敗。另外還有文件系統也可能形成上傳失敗,可是可能性比較小。
微軟爲 PHP On IIS 提供了詳細的安全實踐 Plan PHP Application Security | Microsoft Docs
在 IIS 管理器根頁面,進入配置編輯器,找到 system.webServer/security/requestFiltering
下的 removeServerHeader
項,修改值爲 True
。
能夠在 HTTP 響應標頭
中添加一個自定義的 Server
頭,好比 Nginx
。
X-Powered-By
PHP 版本信息在 PHP Manager For IIS 中配置 PHP 設置,修改 expose_php
爲 Off
。
一樣,能夠在 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 操做。
再次提醒,本文中關於目錄權限的作法並非最安全的實踐,爲了便利而有所妥協。