ApacheでLaravel5アプリケーションを動かす
Laravel5を使ったWebアプリケーションを開発しています。
開発時はビルトインサーバで開発して、運用時はApacheでということがやりたかったのでまとめです。OSにはUbuntu14.04を使っています。Vagrantも使ってます。
開発時 - ビルトインサーバの起動
開発時はphp artisan serveでビルトインサーバを使ってます。手軽で便利です。
$ php artisan serve
IP指定で起動することもできます。
$ php artisan serv --host 192.168.33.10
運用時 - Apacheで動かすには
基本的にはApacheでLaravelアプリケーションのバーチャルホストを定義するだけ。Laravelアプリケーションのpublicフォルダをドキュメントルートに指定します。
バーチャルホストの定義
Apacheにバーチャルホストの定義を追加します。
Ubuntu14の場合、/etc/apache2/sites-available/ディレクトリにバーチャルホストの定義ファイルを新規作成します。
ここでは/etc/apache2/sites-available/myapp.confを次のように作成します。
<VirtualHost *:80> ServerName myapp.com ServerAdmin webmaster@localhost DocumentRoot /var/www/myapp/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/myapp/public"> AllowOverride All </Directory> </VirtualHost>
ここでは/var/www/myapp/にLaravelアプリケーションが存在するものとしています。
DocumentRootにはmyapp/publicを指定します。 またLaravelは.htaccessを利用するので、myapp/publicディレクトリにAllowOverride Allを定義します。
/etc/apache2/sites-available/に作成したmyapp.confはこのままではApacheにロードされません。そのため、/etc/apache2/sites-enabled/からシンボリックリンクを定義します。
$ cd /etc/apache2/sites-enabled/ $ sudo ln -s ../sites-available/myapp.conf
変更を反映するためにApacheを再起動します。
$ sudo service apache2 restart
Apacheの実行ユーザを変更する
Vagrant上で開発している場合は、Apacheの実行ユーザをvagrantに変更します。Ubuntu14のApacheにはenvvarsというファイルで実行ユーザを変更できます。envvarsは環境変数を管理するファイルのようです。
$ sudo vi /etc/apache2/envvars
envvarsを以下のとおり変更します。
export APACHE_RUN_USER=vagrant export APACHE_RUN_GROUP=vagrant
.htaccessが機能しない問題
Laravelアプリケーションにはpublicディレクトリ下に.htaccessファイルが用意されています。.htaccessファイルではmod_rewriteによるURLの書き換えが定義されています。
ちょっとはまったのは、デフォルトのApacheだとmod_rewriteが無効になっていた件です。そのため、URLの書き換えが機能せず、以下のような問題に遭遇しました。
laravel 4 all routes except home result in 404 error
Laravelアプリケーションのルートディレクトリ以外は404になってしまうという。。 このときの現象として、以下のURLでログイン画面にアクセスしたいのに404になってしまいます。
http://myapp.com/auth/login
その代わり、次のURLでアクセスできるという。。index.phpて。。
http://myapp.com/index.php/auth/login
この場合、mod_rewriteを有効にすると解決します。
$ sudo a2enmod rewrite
Apacheの再起動も忘れずに。
$ sudo service apache2 restart
Laravelアプリケーションの設定
Laravelアプリケーションに特に変更箇所はありませんが、Gitのようなバージョン管理システムからコードを取得して来た場合、composer isntallを叩いて、それから.envファイルを作成する必要があります。
$ composer install
このへんは必要に応じてsudoするかんじで。
$ cp .env.example .env
.envに定義するAPP_KEYはphp artisan key:generateで取得できます。
$ php artisan key:generate Application key [0wzwvICe8xa0vJ7RUpOM1z7F03NeZxxx] set successfully.
もう1つアプリケーションのログファイルを生成しておく必要がありました。
$ touch /var/www/myapp/storage/logs/laravel.log
これくらいでたぶん動くはず。
補足
Apacheのインストール
$ sudo apt-get install -y apache2
sudo apt-get updateもさきにしとくように。
PHPのインストール
sudo apt-get install php5-common libapache2-mod-php5 php5-cli php5-json php5-sqlite php-pear php5-dev
SQLiteならこんなかんじでいけます。
Composerのインストール
$ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer
ログファイル
Apacheのログは/var/logs/apache2/error.log
Laravelのログは/var/www/myapp/storage/logs/laravel.log
DigitalOceanでやるときのメモ
とりあえずDigitalOcean(rootユーザ)で環境構築するときは、Laravelアプリケーションの所有者をApacheユーザ(www-data)にしていおいた。
$ chown -R www-data:www-date /var/www/myapp
Apache 2.4の場合
パーミッションの設定でエラーが出る。
AH01630: client denied by server configuration
<VirtualHost *:80> ServerName myapp.com ServerAdmin webmaster@localhost DocumentRoot /var/www/myapp/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/myapp/public"> AllowOverride All Require all granted </Directory> </VirtualHost>