LoginSignup
10
17

More than 5 years have passed since last update.

laravel で作ったサービスをサーバー移行する話

Posted at

個人で、laravelで作った小さなwebサイトを持っているのですが、
諸事情により載せている某サーバーから移行する必要
(決してネガティブな理由ではないが諸事情によりサービス名を言えない)が出てきたので
今回移行した作業ログを残そうと思います。

学び/思ったこと

  • /var/www/html はOSインストール時にできるディレクトリだと思ってたがwebサーバーがインストールされたときに作成される
  • locahostに対して通信するのと、IP直叩きで通信するのは名前解決までの挙動が違う。詳しくはループバックインタフェースについて調べる。(http://e-words.jp/w/ループバックアドレス.html)
  • composerが神。なかったら多分死んでた
  • ミドルウェアの変更は面倒だが、いつやるのがいいのか不明
    • 今回mysql、apacheのバージョンを変更しましたがそれによって一瞬動かなくなったものもあった
    • とんでもない脆弱性が見つかるか、こんなことでもないと見直すタイミングないのでは
    • ミドルウェア周りはdockerとかでまずテストするのがいいのかな
  • 個人のサービスで小さくてもansibleとかchef用意したほうがいいのかなとちょっと思った

前提

  • サービスはlaravel5.1で動いている
  • サービスは一部のページについては動的にDBから情報を引いて作成される
  • git(bitbucket)で管理されている
  • chef とか ansibleなんてものはない!!!!

ハマったポイント

/var/www/html がない

本番サーバーでは/var/www/html/ にサービスを配置していたので特に何も考えず配置をしようと思い
gitをまず入れ、apacheを入れる前にcloneしようと思ったのですが、該当のディレクトリがありませんでした。
apacheを入れることで該当のディレクトリが作成されました。

centos5と7の違い

詳しくは以下リンクに譲りますが、結構変わってます。
http://qiita.com/sion_cojp/items/115e1671fcbc8f214aee

(serviceとsystemctl変える必要ある?)

mysql5.7で コマンドの実行ができない

以下サイトによるとmysql5.7では初回インストール時にテンポラリのPasswordがrootに設定されるようです。
http://weblabo.oscasierra.net/installing-mysql57-centos7-yum/
もろもろのコマンドはrootユーザーのPasswordを変更しないと実行ができないようなのですが、
Passwordの変更をupdateで変更してももろもろのコマンドは動きませんでした。
正しくはalterで変更するみたいです。

ただだめなだけじゃなくて、実際ログイン時のPasswordは変更されるのでちょっとハマりました。
alterコマンドで変更しないとmysql的には変更されたことが検知されないのかな。

mysql5.7で group by ができない

サイトのデータ移行が完了し、動作確認をしたところ
一部のページで以下のエラーが。

which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

どうやら適当にgroupbyを使ってると怒られる様になったみたいです。
http://qiita.com/nagi244/items/04747f8e4ec351b22311

とりあえず今回はonly_full_group_byを無効にし事なきを得ましたが、あまり良くなさそうです。

作業ログ

やる必要があると思っていたざっくり作業(前日まで)

  • サーバーの用意
  • gitの用意
  • gitからサービスを落としてくる
  • サーバー環境の構築
    • mysqlインストール
    • mysqlユーザーの作成
    • 開発用のユーザー作成
  • composer update
  • apacheのインストール
    • これを期にnginxにする?
  • apacheのDocumentRoot指定
  • apache起動
  • 動作確認→終わり

実際にやった作業

サーバーの用意

conohaの一番安いプランにしました。
(GMOと自分は一切の利害関係がありません)
さくらのvpsを一台持っていたのでさくらにしようとも思いましたが、
さくらってスケールアップ/ダウンできないんですね。
値段もconohaのほうが安いのでconohaをにしました
接続許可ポートというのがファイアウォールなのかどうかだけわからなかったのですが、
ファイアウォールだと想定して設定しました
OSはcent7

開発ユーザの用意

useradd username
passwd password
sudo コマンドを許可する
以下を参考にvisudoコマンドで最下部に追記
http://linuxserver.jp/linux/sudo%E3%81%A7%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7%E3%82%82root%E6%A8%A9%E9%99%90%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C

git のインストール

以下の作業はrootで実行しました。

参考サイト
http://www.task-notes.com/entry/20150622/1434942000

yum install git
2017/3/26 では1.8.3.1がyumの最新みたいです。

git --version
git version 1.8.3.1
cd /usr/local/src
git clone git://git.kernel.org/pub/scm/git/git.git
cd git
make prefix=/usr/local all

以下のエラーが出たので調べる
/bin/sh: cc: コマンドが見つかりません

参考サイト
http://dqn.sakusakutto.jp/2012/10/centos6git18.html

sudo yum install make curl-devel gcc openssl-devel expat-devel  cpan
sudo yum install gettext  asciidoc xmlto

もう一度makeの実行
make prefix=/usr/local all

動いているけどversionが変わらない

git --version
git version 1.8.3.1

yum remove gitをしてもう一度makeしてみるとgitがなくなるだけ

作業ログ振り返りると、gitがインストールされたディレクトリが、
yumによる場所とgitのmakeされた場所が違ったので、aliasを設定する。

参考サイト
http://webkaru.net/linux/alias-command/

vi ~/.bashrc
alias git='/usr/local/src/git/git' を追記
source ~/.bashrc

gitが使えるようになりました。

git --version
git version 2.12.GIT

同じことを開発用に用意したユーザーにも行わないと開発ユーザーからgitが参照できません。

apacheのインストール

/var/www/html がなかったのでapacheをインストールしました。

nginxでも良かったけど、色々以前調べて動的に大量のサイトを生成するときはapacheに分があるという理解だったので
今回はapacheを入れました。

yum install httpd
ls /var/www/html/

gitからサービスを落としてくる

git clone https://name@yourrepository.git
fatal: could not create work tree dir 'yourrepository': 許可がありません

となったのでまずはユーザー設定をします。

git config --global user.name "yourname"
git config --global user.email "youraddress@domain"

併せて/var/www/htmlを開発ユーザーの権限に変更します。
chown -R username www

ls -l
drwxr-xr-x   4 username  root 4096  3月 26 11:43 www
git clone https://name@yourrepository.git
warning: templates not found /usr/local/share/git-core/templates
fatal: Unable to find remote helper for 'https'

必要なパッケージが足りないようです。

参考サイト
http://qiita.com/a_ishidaaa/items/8bb63a625e8a89b21a12

sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

git のディレクトリで以下を実行

make
make install

参考
http://stackoverflow.com/questions/8329485/unable-to-find-remote-helper-for-https-during-git-clone

git cloneを実行するも以下のエラー

fatal: unable to access '/root/etc/gitconfig': 許可がありません
sudo をつけると解決(ただしgitでなぜsudoが必要になったのか不明)

sudo git clone https://name@yourrepository.git

PHPインストール/composerインストール

PHP

普通にyumでインストールすると5.4が入るのですが、
サービスで使っている殆どのコンポーネントが5.4ではcomposerインストールできなかったのと
本番サーバーではPHP5.6が動いていたので、流石に5.6をインストールしました。
以下を参考にそのままできました

参考サイト
http://qiita.com/koichi_amami/items/e97bc70e82e95ab99f55

composer

参考サイト
http://weblabo.oscasierra.net/php-composer-centos-install/

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
mv composer.phar /usr/local/bin/composer

PHP5.6を入れたため特に問題なくcomposer installでモジュールのインストールが完了。
ここのバージョンについてはサービスの状況によって違うと思います。

mysql のインストールと設定

yum install mysql mysql-devel mysql-server mysql-utilities

mysqlコマンドを実行するもmysqlを立ち上げる事ができませんでした

以下サイトを発見
http://weblabo.oscasierra.net/installing-mysql57-centos7-yum/

どうやらcent7だと普通にyumを使ってもインストールができない模様。
書いてるとおりにやってみた結果は以下です。

ps aux | grep "mysql"
mysql     9323  0.1 34.3 1119472 171724 ?      Sl   14:06   0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root      9442  0.0  0.1 112664   964 pts/2    R+   14:12   0:00 grep --color=auto mysql

上のリンクを補足しておくと、インストールされた後のテンポラリのパスワードは以下コマンドでわかります。
grep "password" /var/log/mysqld.log

以下サイトを参考に、一回rootで使うときはPasswordがいらない状態にしてmysqldump の投入。
終わったらまたオプションを消してPasswordでのログインを必須にしておきます。

参考
http://qiita.com/ksugawara61/items/d8d69b7d57a3afcef980

データの移行

本当はユーザーを作って対象のテーブルへの権限を付けたかったのですが、
権限を付ける前に対象のDB+テーブルを作ったほうが良さそうだったのでまずDBの作成を行いました。

本番サーバーからmysqldumpを使ってDBのダンプを行います。
gitにpushしておけばpullするだけでdumpファイルが届くので、DBを作成したあとそれを入れる
mysql -u root DB < dump_db_20170326.sql

rootユーザーPasswordを変更する

インストール時に設定されたrootユーザーのテンポラリPasswordを変更します。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'your-PASSWORD';
これでOK

You must reset your password using ALTER USER statement before executing this statement.
のエラーが出るときは、Passwordを設定してないか、updateで変更していないか確認したほうがよいです。
以下のサイトを参考に最初は実行しました。
http://qiita.com/is0me/items/91a0af0342c307b94a16
たしかにログインPasswordは変更できましたが、そのあと記載のエラーでshow databasesコマンドすら動かなかったため
更に調べてALTERで変更したところ動きました。

サービス用のユーザーを作成する

create user
    -> 'name'@'localhost' identified by 'hoge';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Passwordの設定に制約ができた模様。
サービスで使うDBなので、サービスの.envを書き換えることも考えましたが、
localの設定も変更しなくてはいけないので、断念(めんどくさい)。
以下サイトを参考にPasswordの制限レベルを低くする
参考サイト
http://music431permemo.blogspot.jp/2016/01/mysql.html

create user
    -> 'name'@'localhost' identified by 'hoge';
Query OK, 0 rows affected (0.00 sec)

権限の付与
grant all on DB.* to name@'localhost'

追加したユーザーでmysqlに入り、DBのデータを参照できることを確認しOK

動作確認

ここまで問題ないかを確認する(ここまで問題なければ普通はあとapacheの設定だけのはず)

php artisan serve
curl localhost:8000

curlコマンドでtopページのhtmlが吐き出されたのでOK

apacheの設定

conohaの場合(?)ServerName がhost-xxx-xxx-xxx-xxx(IPアドレス)になっているので、IPアドレスに変更をする
また、DoumentRootをgit cloneしたディレクトリとして追加する

diff /etc/httpd/conf/httpd.conf{,.bk}
< #ServerName host-xxx-xxx-xxx-xxx
< ServerName xxx.xxx.xxx.xxx
356,362d353
< 
< <VirtualHost *:80>
<     DocumentRoot "/var/www/html/yourproject/public/"
<     <Directory "/var/www/html/yourproject/public/">
<         AllowOverride All
<     </Directory>
< </VirtualHost>

ファイアウォールの設定(サイトを直接アクセスしたら見れなかった)

apacheの設定も終わったので、ブラウザからIPアドレス直叩きでサイトにアクセスしたところ、トップが表示されず。
参考サイト
https://teratail.com/questions/53543
先程確認に使ったのは以下コマンド
curl localhost:8000
どうやらlocalhostを指定するのと、IPアドレスを指定するのは名前解決の経路が違うため、別途ファイアウォールの設定が必要なようです。
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

参考サイト
http://www.server-memo.net/centos-settings/firewalld/firewalld.html

ドメイン指定でトップが見れるようになりOK

mysqlが動かなかった

トップは見えたものの、一部ページで以下のエラー
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'DB.hoge_master.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mysql5.7では適当にgroup byをすると動かなくなる模様。
sqlモードを変更して対応しました。
/etc/my.cnfからonly_full_group_byの設定がされている部分を削除してmysqlの再起動でOK
ただし非推奨のようですので、急ぎじゃないときは実行の見直しをしたほうがいいかもしれません。

DNSの変更

最後にDNSを変更します。
お名前.comで管理している(GMOと自分は利害関係がありません)ので以下サイトを参考に変更。

参考
http://server-99.com/onamae-zone/

最初一番下のチェックボックスをつけないで設定を反映したところ、
サイトに繋がらなくなったため、もう一度今度はチェックボックスをつけて反映したら30分くらいでサイトが見える様になりました。


終わりに

今日中にサーバー移行を終わらせないといけない事情があったため色々雑に作業しましたが、なんとか終わりました。
一部先輩エンジニアにこっそり質問したりしましたが、賞味7時間くらいでしょうか。
仕事でこの辺は自分でやらず、担当の人にお願いすることが多かったのでいい経験になったなという感じです。

特にlocal+本番サーバー一台での開発だとイマイチピンときてませんでしたが、composer の威力に驚きました。
構成管理やinfra as a code といった話が盛り上がるのも理解できます。

また、作業ログとして残したので、抜け漏れとか見づらい部分が多少あると思います。
一部有用そうな部分や今後改修が必要な部分については改めてまとめて別の記事にするかもしれません。

以上です。

10
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
17