初めに
railsプロジェクトをawsサーバにデプロイメントする
ただし、capistrano,unicorn,nginxを用いて行うこととする
当然エラーが出まくるので、それの対応メモ。後で役に立つので作業をもめしておく。ただの個人用メモです。
初めに、エラーの結論と構成について
エラー
mysqlの設定エラー→結論、/etc/my.cnf
の設定ミス
capistranoのデプロイエラー→結論、対象リポジトリでbundle install
nginxのエラー→結論、権限付けるだけ
unicornが起動しない→secret keyの設定漏れ
構成
- rails 4.2.1
- ruby 2.2.1
- mysql 5.6
- aws
- capistrano
- nginx
- unicorn
エラー解決手順
mysql2のエラー
Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (13)
- mysql2→gem名
-
/tmp/mysql.sock
→ソケットパス - MySQLサーバに接続できない
設定ファイル
default: &default
adapter: mysql
encoding: utf8
pool: 5
username: root
password: password
socket: /var/lib/mysql/mysql.sock
production:
<<: *default
database: db名
host: ホスト名:3306
原因
- mysqlがサーバ側にインストールされていない
- mysqlサーバのバージョンがおかしい
対応1:インストールまで
# バージョンが古い者たちを消してあげる
rpm -qa | grep -i mysql
# 僕の場合は5.5がいたのでこいつを消した
sudo rpm -e mysql55-common-5.5.42-1.4.amzn1.x86_64
# rpmで最新版の6.5に合わせる
sudo rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
# パッケージ情報を調べる
sudo yum info mysql-community-server
# mysql-community-serverをインストール
sudo yum -y install mysql-community-server
# バージョン確認→5.6になってたら成功
$ mysql --version
mysql Ver 14.14 Distrib 5.6.24, for Linux (x86_64) using EditLine wrapper
$ mysqld --version
mysqld Ver 5.6.24 for Linux on x86_64 (MySQL Community Server (GPL))
対応2:設定周り(A)
# 自動起動設定
sudo chkconfig mysqld on
$ chkconfig | grep mysql
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# リスタート時のwarnレベル以上
$ sudo service mysqld restart
Stopping mysqld: [ OK ]
MySQL Daemon failed to start.
Starting mysqld: [FAILED]
# 2-1
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
# 2-2
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
# 2-3
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
対応2-1:非推奨のデフォルト値がある
/etc/my.cnf
を設定変更後、再度リスタート掛ける→権限周りスキップしてるのでエラーは吐かれるが問題なく起動するはず
// Please use --explicit_defaults_for_timestamp server option
explicit_defaults_for_timestamp=1
skip-grant-tables
対応2-2,2-3:権限周り
- 権限テーブルが開けない
- mysql.pluginテーブルが開けない
# 初期データを作る
etc/rc.d/init.d/mysqld restart
# root権限でログインする
mysql -u root
# テーブルが作られているか確認
> use mysql;
> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
# パスワードを設定する
set password for root@localhost=password('パスワード');
# mysqlテーブルのチェック
mysql_upgrade -u root -p
# mysql -u rootでは入れないことを確認後、ログイン
mysql -u root -p
対応3:設定周り(B)
# 3-1
LoadError: /usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so) - /var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so
/var/www/pj/shared/bundle/ruby/2.2.0/gems/mysql2-0.3.18/lib/mysql2.rb:31:in `require'
/var/www/pj/shared/bundle/ruby/2.2.0/gems/mysql2-0.3.18/lib/mysql2.rb:31:in `<top (required)>'
/var/www/pj/releases/20150407233148/config/application.rb:7:in `<top (required)>'
/var/www/pj/releases/20150407233148/Rakefile:4:in `require'
/var/www/pj/releases/20150407233148/Rakefile:4:in `<top (required)>'
(See full trace by running task with --trace)
対応3-1:libmysqlclient周り
- libmysqlclientのロードエラー
- 16を要求しているが18しかない?
- mysql2は
# 一度mysql2をインストールしてみる
sudo yum install mysql-devel
gem install mysql2
# 検索してみる
sudo find / -name libmysqlclient_16
$ ldcondig -p | grep mysql
libmysqlclient.so.18 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.18
find ~/.rbenv/versions/2.2.1/ -name 'mysql2.so'
# libmysqlclient.so.18依存
$ ldd /usr/lib64/mysql/libmysqlclient.so.18
linux-vdso.so.1 => (0x00007ffe9eb2e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f14d07f2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f14d05ee000)
librt.so.1 => /lib64/librt.so.1 (0x00007f14d03e5000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f14d00e1000)
libm.so.6 => /lib64/libm.so.6 (0x00007f14cfddf000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f14cfbc8000)
libc.so.6 => /lib64/libc.so.6 (0x00007f14cf807000)
/lib64/ld-linux-x86-64.so.2 (0x00007f14d0fe3000)
# mysql2.so依存1
ldd .rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so
ldd .rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/mysql2-0.3.18/ext/mysql2/mysql2.so
ldd .rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/mysql2-0.3.18/lib/mysql2/mysql2.so
linux-vdso.so.1 => (0x00007ffde7bd3000)
libmysqlclient.so.18 => /usr/lib64/mysql/libmysqlclient.so.18 (0x00007fabb6760000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fabb653d000)
libm.so.6 => /lib64/libm.so.6 (0x00007fabb623b000)
librt.so.1 => /lib64/librt.so.1 (0x00007fabb6033000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fabb5e2e000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fabb5bf7000)
libc.so.6 => /lib64/libc.so.6 (0x00007fabb5836000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fabb5531000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fabb531b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fabb6f3c000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fabb50a0000)
# mysql2.so依存2
ldd /var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so
/var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so: /usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so)
linux-vdso.so.1 => (0x00007ffe122d4000)
libmysqlclient.so.18 => /usr/lib64/mysql/libmysqlclient.so.18 (0x00007fc8f2f0c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc8f2ce9000)
libz.so.1 => /lib64/libz.so.1 (0x00007fc8f2ad3000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc8f27d1000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007fc8f2563000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fc8f217e000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc8f1f7a000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fc8f1d42000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc8f1981000)
librt.so.1 => /lib64/librt.so.1 (0x00007fc8f1779000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fc8f1474000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc8f125e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc8f36e8000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fc8f101b000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fc8f0d35000)
libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007fc8f0b32000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fc8f0907000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fc8f068b000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fc8f0480000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fc8f027d000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fc8f0062000)
libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007fc8efe41000)
エラーの再現できた。どうやら送信されたアプリのmysql2.soの依存関係がおかしいよう。
cd /var/www/pj/releases/20150408173738/
bundle exec irb
> require 'mysql2'
LoadError: /usr/lib64/mysql/libmysqlclient.so.18: version `libmysqlclient_16' not found (required by /var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so) - /var/www/pj/shared/bundle/ruby/2.2.0/extensions/x86_64-linux/2.2.0-static/mysql2-0.3.18/mysql2/mysql2.so
from /var/www/pj/shared/bundle/ruby/2.2.0/gems/mysql2-0.3.18/lib/mysql2.rb:31:in `require'
from /var/www/pj/shared/bundle/ruby/2.2.0/gems/mysql2-0.3.18/lib/mysql2.rb:31:in `<top (required)>'
from (irb):1:in `require'
from (irb):1
from /home/ec2-user/.anyenv/envs/rbenv/versions/2.2.1/bin/irb:11:in `<main>'
該当リポジトリに行ってbundle install
したら一旦デプロイのソース自体は通過
nginxのエラー
$ service nginx restart
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2015/04/09 03:28:19 [warn] 9363#0: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:5
権限を付与するか、出力ログ位置を変更する
unicornが起動しない
プロセスがない
ps aux | grep unicorn
ここにないのでunicornのコードがおかしいということになる。
gem 'capistrano3-unicorn'
を設定している際はtasksにわざわざ書かなくてもリスタートされる。コメントアウトしたらsuccessした
ただ、動かなかったので、productionのシークレットキーを直書きしたら動いた。後は、これを環境変数化して呼び出すなどの対応をすればよし
mysqlの設定は別の記事に書く