這本按部就班的教程描述了如何在 Heroku 云平臺上部署一個 Symfony 網頁應用程序。其內容基于在 Heroku 上出版的原創(chuàng)文章。
創(chuàng)建一個新的 Heroku 網站,首先用 Heroku 注冊或者用您自己的證書注冊。然后在您的本地計算機上下載并安裝 Heroku Toolbelt。
您也可以查看在 Heroku 上開始使用 PHP 的指導來獲取更多的對于在 Heroku 上使用 PHP 應用程序的細節(jié)的熟悉度。
在 Heroku 上部署一個 Symfony 應用程序不需要其代碼的任何變化,但是需要對其配置的一些輕微調整。
默認情況下,Symfony 應用程序會登錄進入您應用程序的 app/log/ 目錄。這不是很理想的因為 Heroku 使用的是短暫的文件系統(tǒng)。在 Heroku 中,處理登錄的最好方法是使用 Logplex。并且發(fā)送登錄數據到 Logplex 最好的方式是通過編寫 STDERR 或者 STDOUT。幸運的是,Symfony 使用的是非常好的 Monolog 庫來登錄。因此,一個新的日志目的就是僅僅改變一個配置文件。
打開 app/config/config_prod.yml 文件,把 monolog/handlers/nested 片段(若還未存在就創(chuàng)建一個)并改變 path 的值,從 "%kernel.logs_dir%/%kernel.environment%.log" 到 "php://stderr":
# app/config/config_prod.yml
monolog:
# ...
handlers:
# ...
nested:
# ...
path: "php://stderr"
一旦應用程序被部署,運行 heroku logs –tail 使 Heroku 中的日志流在您的終端保持開啟狀態(tài)。
創(chuàng)建一個您可以啟動的新的 Heroku 應用程序,使用 CLI create 命令:
$ heroku create
Creating mighty-hamlet-1981 in organization heroku... done, stack is cedar
http://mighty-hamlet-1981.herokuapp.com/ | git@heroku.com:mighty-hamlet-1981.git
Git remote heroku added
現(xiàn)在您已經準備好部署應用程序,如同在下一個部分解釋的那樣。
在您的首次部署前,您僅需要再做三件事,解釋如下:
默認情況下,Heroku 會開啟一個 Apache 網頁服務器和 PHP 一并來服務應用程序。然而,有兩個特殊情況適用于 Symfony 應用程序:
1.文件根是在 web/ 目錄中,而不是在用應用程序的根目錄中。
2.Composer bin-dir,即供應商的二進制文件(Heroku 自身的引導腳本)放置的地方,是 bin/,不是默認的 vendor/bin。
供應商的二進制文件一般由 Composer 安裝在 vendor/bin,但是有些時候(例如:當運行一個 Symfony 標準版本項目?。?,定位是不同的。如果有疑問的話,您可以運行 composer config bin-dir 來找出正確的位置。
在應用程序的根目錄創(chuàng)建一個新的文件叫做 Procfile(沒有任何擴展),并且僅添加以下內容:
b: bin/heroku-php-apache2 web/
如果您更喜歡使用 Nginx,在 Heroku 同樣是可以使用的,您可以創(chuàng)建一個配置文件或者按照在 Heroku documentation 描述的那樣從 Procfile 指向它:
web: bin/heroku-php-nginx -C nginx_app.conf web/
如果您更喜歡使用命令控制臺工作,執(zhí)行以下命令來創(chuàng)建 Procfile 文件,并且將其添加到存儲庫中:
$ echo "web: bin/heroku-php-apache2 web/" > Procfile
$ git add .
$ git commit -m "Procfile for Apache and PHP"
[master 35075db] Procfile for Apache and PHP
1 file changed, 1 insertion(+)
在部署中,Heroku 運行 composer install --no-dev 來安裝應用程序所需要的所有依賴。然而,一般在 composer.json 安裝后命令,例如:安裝資產或者清除(或預熱)緩存,在默認情況下運行使用 Symfony 的 dev 環(huán)境。
這明顯不是您想要的—應用程序在“生成”中運行(盡管您只是用它來做個試驗,或者作為一個過渡環(huán)境),所以任何構建的步驟也應該使用同樣的 prod 環(huán)境。
幸好這個問題的解決方案是很簡單的:Symfony 將會選擇一個環(huán)境變量稱 SYMFONY_ENV 并且如果沒有其他特別的設置就會使用此環(huán)境。當 Heroku 公開所有配置變量作為環(huán)境變量,您可以發(fā)出一個單獨命令來為您的應用程序做部署的準備:
$ heroku config:set SYMFONY_ENV=prod
注意在 require-dev 區(qū)段 composer.json 列出的依賴在 Heroku 中部署的過程中從不被安裝。如果您的 Symfony 環(huán)境依賴這些包的話可能會引發(fā)問題。解決方案就是從 require-dev 移除這些包到 require 區(qū)段。
下一步,終于到了在 Heroku 部署您的應用程序的時間。如果您是第一次做這個的話,您將會看到像如下的信息:
The authenticity of host 'heroku.com (50.19.85.132)' can't be established.
RSA key fingerprint is 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.
Are you sure you want to continue connecting (yes/no)?
這個情況下,您需要通過輸入 yes 并點擊
然后,執(zhí)行這個命令部署您的應用程序:
$ git push heroku master
Initializing repository, done.
Counting objects: 130, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (107/107), done.
Writing objects: 100% (130/130), 70.88 KiB | 0 bytes/s, done.
Total 130 (delta 17), reused 0 (delta 0)
-----> PHP app detected
-----> Setting up runtime environment...
- PHP 5.5.12
- Apache 2.4.9
- Nginx 1.4.6
-----> Installing PHP extensions:
- opcache (automatic; bundled, using 'ext-opcache.ini')
-----> Installing dependencies...
Composer version 64ac32fca9e64eb38e50abfadc6eb6f2d0470039 2014-05-24 20:57:50
Loading composer repositories with package information
Installing dependencies from lock file
- ...
Generating optimized autoload files
Creating the "app/config/parameters.yml" file
Clearing the cache for the dev environment with debug true
Installing assets using the hard copy option
Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework
Installing assets for Acme\DemoBundle into web/bundles/acmedemo
Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
-----> Building runtime environment...
-----> Discovering process types
Procfile declares types -> web
-----> Compressing... done, 61.5MB
-----> Launching... done, v3
http://mighty-hamlet-1981.herokuapp.com/ deployed to Heroku
To git@heroku.com:mighty-hamlet-1981.git
* [new branch] master -> master
就是這樣!如果您現(xiàn)在打開您的瀏覽器,要不就手動指向 heroku create 給您的 URL,或者也可以使用 Heroku Toolbelt,應用程序將會響應:
$ heroku open
Opening mighty-hamlet-1981... done
您應該在您的瀏覽器中看到 Symfony 應用程序。
如果您第一步在 Heroku 上安裝全新的 Symfony 標準版本,您或許會遇到一個 404 頁面沒有找到錯誤。這是因為 / 的路徑是由 AcmeDemoBundle 定義的,但是 AcmeDemoBundle 只在 dev 環(huán)境中加載(查看您的 AppKernel 類)。嘗試從 AppBundle 打開 /app/example。
如果您想在創(chuàng)建過程中執(zhí)行另外的自定義命令,您可以利用 Heroku 的自定義編譯步驟。想象您為了避免潛在的易損性想從 Heroku 中的產出環(huán)境移除 dev 前端控件。添加一個命令來移除 web/app_dev.php,Composer 的安裝后命令就會工作,但是它也會分別地移除本地 composer install 或 composer update 開發(fā)環(huán)境中的控件。相反,您可以在您的 composer.json 的 scripts 區(qū)段里添加一個自定義 Composer 命令叫做 compile (這個關鍵的名字是 Heroku 慣例)。列出的命令鉤掛到 Heroku 的部署過程:
{
"scripts": {
"compile": [
"rm web/app_dev.php"
]
}
}
對于在產出系統(tǒng)中創(chuàng)建資產也是很有用的,例如:用 Assetic:
{
"scripts": {
"compile": [
"app/console assetic:dump"
]
}
}
Node.js 依賴
構建資產可能取決于節(jié)點包,例如 uglifyjs 或 uglifycss 資產縮小。在部署過程中安裝節(jié)點包需要節(jié)點的安裝。但是現(xiàn)在,Heroku 使用 PHP 構建包編譯您的應用程序,是由 composer.json 文件的存在而自動偵測,不包括節(jié)點安裝。因為 Node.js 構建包比 PHP 構建包(參見 Heroku 構建包)更優(yōu)先,添加 package.json 列出您的節(jié)點依賴從而使 Heroku 選擇 Node.js 構建包:
{
"name": "myApp",
"engines": {
"node": "0.12.x"
},
"dependencies": {
"uglifycss": "*",
"uglify-js": "*"
}
}
根據下一次部署,Heroku 使用 Node.js 構建包來編譯應用程序并且安裝您的 npm 包。另一方面,composer.json 現(xiàn)在被忽略。用兩個構建包,Node.js 和 PHP 編譯您的應用程序的話,您可以使用一個特殊的多樣構建。為了覆蓋構建包自動偵測,您需要明確地設置構建包 URL:
$ heroku buildpacks:set https://github.com/ddollar/heroku-buildpack-multi.git
接下來,添加 .buildpacks 文件到您的項目中,列出您所需要的構建包:
ttps://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-php.git
有了下一次部署,您可以從兩個構建包獲益。此設置也啟動您的 Heroku 環(huán)境,充分使用像 Grunt 或者 gulp 這些基于自動構建工具的結點。