awsでcapistrano動かす作業ログ


# 初めに
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サーバに接続できない

###設定ファイル

```database.yml
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サーバのバージョンがおかしい

##対応１：インストールまで

```.rb
# バージョンが古い者たちを消してあげる
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))
```

##対応２：設定周り(A)

```.rb
# 自動起動設定
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`を設定変更後、再度リスタート掛ける→権限周りスキップしてるのでエラーは吐かれるが問題なく起動するはず

```/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テーブルが開けない

```.sh
# 初期データを作る
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
```

##対応３：設定周り(B)

```.rb
# 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は

```.rb
# 一度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の依存関係がおかしいよう。

```.rb
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のエラー

```.sh
$ 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の設定は別の記事に書く**