1. 程式人生 > >在 Windows 上部署 Laravel 專案

在 Windows 上部署 Laravel 專案

Laravel 框架中需要部署 PHP Web、佇列、任務排程三部分功能,官方文件中只有 Linux 下的部署說明。雖然 Linux 純 CLI 看起來更高大上,不過 Windows 也是一種解決方案。

PHP Web

參考 在 Windows 上使用 IIS 部署 PHP 專案 完成執行環境配置。

在 Laravel 專案 public 目錄下已經存在一個用於 IIS 部署的 web.config 檔案,內容是 Url Rewrite 規則:

<configuration>
  <system.webServer>
    <rewrite>
      <rules
>
<rule name="Imported Rule 1" stopProcessing="true"> <match url="^(.*)/$" ignoreCase="false" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> </conditions> <action
type="Redirect" redirectType="Permanent" url="/{R:1}" />
</rule> <rule name="Imported Rule 2" stopProcessing="true"> <match url="^" ignoreCase="false" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase
="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> </conditions> <action type="Rewrite" url="index.php" /> </rule> </rules> </rewrite> </system.webServer> </configuration> 複製程式碼

新增 IIS 站點時,站點物理路徑需要指向到 public 目錄下。一般情況下,站點其他相關配置會從根配置檔案繼承,比如 FastCGI 相關配置。同時執行多個站點需要為站點繫結域名,否則只能有一個站點使用 80 埠。

跨域控制

關於 Web 跨域可以閱讀 MDN 的文件進一步瞭解——HTTP訪問控制(CORS) 。t通過新增特定的響應頭來控制 Web 瀏覽器的跨域限制,IIS 可以在 HTTP 響應標頭 來設定相應的響應頭。

HTTP 響應標頭 可以在 IIS 管理器中作為全域性設定,也可以針對站點設定。如果針對站點配置,那麼會修改站點物理路徑下的 web.config 檔案。

設定完後,可以看到 web.configrewrite 節點後面增加了 httpProtocol 節點。

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="example.com" />
    </customHeaders>
</httpProtocol>
複製程式碼

其他配置項也是類似,推薦的做法是將變更後的 web.config 檔案簽入版本控制系統進行管理。

需要注意,這裡配置是全部 URL 都會生效,如果需要針對特定 URL 路徑需要手動新增以下內容到<configuration> 節點:

<location path="api">
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Origin" value="example.com" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</location>
複製程式碼

如果需要更詳細的 CORS 控制需要安裝 IIS CORS Module,參考 IIS CORS module Configuration Reference | Microsoft Docs 進行配置。

當然,在 PHP 程式碼中控制會更加靈活。

客戶端快取

Web 客戶端快取主要通過 Cache-ControlETagLast-Modified 響應頭控制,關於 HTTP 快取可以檢視 MDN 文件瞭解更多 developer.mozilla.org/zh-CN/docs/…

這裡的客戶端快取控制主要是針對靜態資源,動態資源可以在程式碼中進行控制。符合 HTTP 協議的客戶端,包括瀏覽器,還有 APP 開發中使用的 HTTP 請求庫,預設情況下都會按照 HTTP 協議約定進行快取。

預設情況下,IIS 對靜態資源請求的響應頭中就包含 EtagLast-Modified。可以在 HTTP 響應標頭 中通過 設定常用標頭 選項進行配置 Cache-Control,響應頭如下:

HTTP/1.1 200 OK
Cache-Control: max-age=86400
Content-Type: application/javascript
Content-Encoding: gzip
Last-Modified: Fri, 11 Jan 2019 15:06:10 GMT
Accept-Ranges: bytes
ETag: "05d6b2fbfa9d41:0"
Vary: Accept-Encoding
Date: Sat, 12 Jan 2019 17:26:08 GMT
Content-Length: 112411
複製程式碼

如果是在站點操作完成之後同樣會在專案 public 目錄下的 web.config 中新增相關節點:

<staticContent>
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="1.00:00:00" />
</staticContent>
複製程式碼

如果需要按目錄控制,手動新增以下內容到<configuration> 節點:

<location path="favicon.ico">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
      </staticContent>
    </system.webServer>
</location>
複製程式碼

更多關於 <staticContent> 引數可以檢視官方文件 Client Cache | Microsoft Docs

SQL Server

如果說有什麼原因一定要在 Windows 上部署 PHP Web 專案,那麼 SQL Server 一定是個很常見的原因。

PHP 訪問 SQL Server 資料庫需要安裝兩個資料庫驅動程式:

  • Microsoft Drivers for PHP for SQL Server
  • Microsoft ODBC Driver for SQL Server

影響因素包括以上兩個驅動的版本、SQL Server 版本、PHP 版本以及 Windows 版本。詳細的對應關係可以通過官方文件 System Requirements for the Microsoft Drivers for PHP for SQL Server - SQL Server | Microsoft Docs 檢視。

以 Laravel 5.7 版本的需求 PHP >= 7.1.3 為例:

  • Microsoft Drivers for PHP for SQL Server 5.3/5.2
  • Microsoft ODBC Driver for SQL Server 17+/13.1/11
  • SQL Server 2008 R2 ~ SQL Server 2017
  • Windows 10 、Windows Server 2012 ~ Windows Server 2016

總結:開發環境只能選擇 Windows 10,生產環境最低要選擇 Window Server 2012。

安裝 Microsoft Drivers for PHP for SQL Server 5.3 與 Microsoft ODBC Driver for SQL Server 17+,配置好 PHP 的擴充套件之後,可以訪問 SQL Server 2008 R2 ~ SQL Server 2017 版本的資料庫。

佇列

官方文件中部署佇列的方式是使用 Supervisor, Linux 上也可以使用 systemd 來部署。Windows 上採用同樣的思路,將佇列執行作為系統服務執行,需要用到 NSSM - the Non-Sucking Service Manager

將下載好的 nssm.exe 路徑新增到系統 Path 變數中之後,在命令列中使用 nssm install <servicename> 會開啟 GUI 介面配置。

Path 推薦填寫完整的 php.exe 路徑,Startup directory 是啟動目錄,填寫專案根目錄,Arguments 執行引數 artisan queue:work sqs --sleep=3 --tries=3

其他需要注意的是 Log on 服務以何使用者執行,涉及到許可權、環境變數、認證,一般情況保持 Local System account 即可。如果使用指定使用者,使用者密碼失效或改變時,會造成服務無法啟動。

任務排程

任務排程與佇列的區別在於執行週期不同,官方文件中任務排程的部署方式是使用 crontab 以分鐘為週期呼叫單一任務入口,Windows 上通過計劃任務可以實現相同的目的。

開啟計劃任務程式,建立任務。觸發器選擇 按預定計劃一次,但是時間要調整為已經過去的時間。重複任務間隔設定為 1 分鐘,持續期限 設定為 無期限

操作中配置程式填寫 PHP.exe 的完整路徑。起始於 配置為 Laravel 專案路徑,引數填寫 artisan schedule:run

在設定中勾選 如果過了計劃開始時間,立即啟動任務,去掉 如果請求後任務還在執行,強行將其停止,最後選擇 請勿啟動新例項