読者です 読者をやめる 読者になる 読者になる

Murayama blog.

プログラミングと、その次の話

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

stackoverflow.com

<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>