概要
ローカルで開発したLaravelのプロジェクトを、さくらのレンタルサーバーにデプロイした時の記録。
- ローカルで
- CentOS7~Laravel~MySQLで開発
- 必要に応じてデータベースのダンプファイルも含める
- GitHubのリポジトリーに登録
- さくらサーバーにssh接続
- 秘密鍵と公開鍵をさくらサーバーにコピー
- GitHubのリポジトリーをclone
- 必要に応じてデータベースのダンプファイルから復帰
- Laravelのpublicディレクトリーのシンボリックリンクを公開ディレクトリーに作成
躓いたのは以下の点
- ssh鍵ファイルのパーミッション設定
- login/registerのパス設定
Laravelを直接さくらサーバー上でインストールする手順はこちら。
ローカルでの開発
プロジェクトの開発
通常の方法によって、ローカル環境でLaravelプロジェクトを開発。このとき、さくらのサーバー上で利用可能なPHP/Laravel/MySQLのバージョンを確認しておく。
データベースのダンプ
開発中にデータベースの実データを扱っている場合は、データベースの内容をダンプファイルに出力しておく。
今回はリポジトリーのディレクトリーにダンプファイルを保存して、GitHub経由で共有した。
GitHubへのpush
ローカルの開発結果をコミットしてGitHubへpush。以下の手順によった。
git add -f .でvenderディレクトリーなども含めてステージングgit commit -mでコミットgit pushでGitHubのリポジトリーに反映
ローカルでの状況は以下のとおり。
- プロジェクトの配置→
.../laravel/PROJECT/ - ローカルサーバー→
PROJECT/下でサーバーを起動 - ローカルでのアクセス→
localhost:3000/ - GitHubのリポジトリー→
laravelディレクトリー以下
さくらサーバーでのデプロイ
ssh接続の準備
GitHubとSSHでやり取りする準備。
- 秘密鍵(
id_rsa)と公開鍵(id_rsa.pub)をさくらサーバーにアップロード- アップロード先は
~/.ssh/ディレクトリー .ssh/ディレクトリは既に存在していて、パーミッションは700
- アップロード先は
- アップロードした2つの鍵ファイルのパーミッションを600に変更する必要がある
ssh鍵でのエラー
当初、鍵ファイルのパーミッションが他者から読み取り可能のままになっていて接続できなかった。
|
1 2 3 4 5 6 7 8 |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0604 for '/home/taustation/.ssh/id_rsa' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "/home/taustation/.ssh/id_rsa": bad permissions Permission denied (publickey). |
2つの鍵のパーミッションを600に変更して解決。
プロジェクトの配置計画
さくらサーバーでの配置計画は以下のようにした。
- プロジェクト本体は公開領域以外に置く
- 公開領域にプロジェクトの
publicディレクトリーのシンボリックリンクを置く - シンボリックリンクの名前をプロジェクト名にする
これによって、”サイト名/プロジェクト名“というURLをアプリケーションのメインページとすることができる。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/home | +-USER | | | +-laravel | | | +-PROJECT | | | +-app | +-arisan | +-bootdtrap | : | +-public | : | +-www | +-PROJECT(publicへのシンボリックリンク) |
プロジェクトのダウンロード
GitHubのリポジトリーをさくらサーバーのユーザーホームディレクトリー下でclone。
|
1 |
% git clone git@github.com:USER/PROJECT.git |
故人開発であり、git pull/pushにするとサーバー側での.envの編集などの本質でない操作などが反映されてしまうので、ローカル側で編集したプロジェクトをさくらサーバー上でcloneするのがよいと考えた。
.envファイルの編集
さくら側のMySQLに接続するため、.envファイルの以下を変更。
|
1 2 3 4 5 6 |
DB_CONNECTION=mysql DB_HOST=MYSQL_HOST DB_PORT=3306 DB_DATABASE=DB_NAME DB_USERNAME=USER DB_PASSWORD=PASS |
MYSQL_HOSTはさくらのMySQLホスト名mysql**.ユーザー名.sakura.ne.jpなど
DB_NAMEはさくら上でのDB名ユーザー名_任意のDB名など
USER/PASSはMySQLに接続するためのユーザー名とパスワード
publicディレクトリーのシンボリックリンク
非公開に置いたプロジェクトのうち、公開対象のpublicディレクトリーのシンボリックリンクを公開領域(~/www)に作成する。リンク名はプロジェクト名と同じにした。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
% cd ~/www % ln -s ~/laravel/PROJECT/public/ PROJECT % ls -Al total 60 -rw-r--r-- 1 taustation users 277 12月 2 2016 .htaccess -rw-r--r-- 1 taustation users 364 12月 2 2016 .htaccess.auth .... lrwxr-xr-x 1 taustation users 38 2月 20 17:14 PROJECT -> /home/USER/laravel/PROJECT/public/ .... |
ログイン・サインアップできない
Laravelでの症状
当初プロジェクトをさくらサーバーに配置したとき、以下のような状況になった。
- 非認証時のメインページや説明ページなどは表示・遷移できる
- ログインやサインアップのフォームページも表示される
- ログインページで入力後にボタンを押すと、WordPressのログイン画面に遷移してしまう
- サインアップページで入力後にボタンを押すとWordPressの「ページが見つかりませんでした」表示
元々ドメイン直下ではWordPressが実行されるようになっていて、サブディレクトリーでLaravelを動かそうとしてこのような状況になった。
URL指定による同じ状況の再現
LoginController/RegisterControllerのredirectToを変えたり、ルーティングファイルやindex.phpを触ったりしてみたが、状況は変わらず。その中で、以下のことに気づく。
- URLで直接
http://DOMAIN.com/loginを指定すると、WordPressのログイン画面に遷移する - URLで直接
http://DOMAIN.com/registerを指定すると、WordPressの「ページが見つかりませんでした」表示
原因特定
Laravelではいずれもボタンを押した後に上と同じ状況になることに気づき、login.blade.phpとregister.blade.phpを見てみると、POSTを発しているform要素のactionで"/login"、"/register"を直に書いていた。
これらをルート名で"{{ route('login') }}"、"{{ route('register') }}"に変更したところ、正常にログインとサインアップができるようになった。これらのルート名は、Auth::routes()で設定自動的に設定されるので、artisanで確認。
考えてみれば至極当然の挙動で、ローカルと本番で配置形態が変わる場合に備えて徹底的にroute()を使うのがよさそう。