Edited at

awsでcapistrano動かす作業ログ

More than 3 years have passed since last update.


初めに

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


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


/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の設定は別の記事に書く