---
title: デプロイエラー(chat-spaceまで)
tags: ナレッジ, AWS, 応用
---
<!--
◆◆◆テンプレ◆◆◆
## タイトル
<details><summary>説明を開く</summary><div>
説明文(divの下は1行空ける)
[カリキュラムを開く](カリキュラムのURL)
<ローカルorリモート> **ファイル名**
```ruby
コード
# このように書き換えているか確認
```
</div>
</details>
---
◆◆◆ここまで◆◆◆
-->
## はじめに
折りたたんでいる部分は検索に引っかからないので、ソースを表示してそれに対して検索をかけてください。
項目を追加する際はコメントアウトされているテンプレートをコピペしてください。
## 基礎知識
自動デプロイ後はmysqld,nginx,unicornが起動していないと本番環境は正常に動作しない。
また、全てのファイルはcurrent及びshared以下のものが使われている。
よって`/var/www/chat-space`のフォルダで`git pull`したり`less log/unicorn.stderr.log`するのは意味が無い。
```shell
# mysql
# <EC2> 起動してるか確認
sudo service mysqld status
# (再)起動
sudo service mysqld restart
# ログの場所
/var/log/mysqld.log
# 権限が無い場合
sudo chmod 755 /var/log/mysqld.log
```
```shell
# nginx
# <EC2> 起動してるか確認
sudo service nginx status
# (再)起動
sudo service nginx restart
# ログの場所
/var/log/nginx/error.log
# 権限が無い場合
sudo chmod 755 /var/log/nginx/error.log
```
```shell
# unicorn
# <EC2> 起動してるか確認
ps aux | grep unicorn
# <ローカル> 停止、起動
bundle exec cap production unicorn:stop
bundle exec cap production unicorn:start
# <EC2> ログの場所
/var/www/chat-space/current/log/unicorn.stderr.log
```
◆チェックしたいログファイル
※lessやvimではなくtail -fで実行するとログがリアルタイムで確認できる。
```
# 本番環境のコントローラ等のエラー
less /var/www/chat-space/current/log/production.log
```
```
# 自動デプロイ時のリモートのunicornのエラー
less /var/www/chat-space/current/log/unicorn.stderr.log
```
## ◆bundle exec cap production deployをしても何もログが表示されない
<details><summary>説明を開く</summary><div>
まずはElastic IPにchromeでアクセスしてみる
### ●Welcome to nginx on the Amazon Linux AMI!と表示される
EC2には入れたがnginxの設定が怪しい状態。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1506)
<リモート> **sudo vim /etc/nginx/conf.d/rails.conf**
```yaml
server_name XXX.XXX.XXX.XXX
# < > などつけていないか確認
```
### ●403 Forbidden Nginxと表示される
nginxは起動できてるが何も表示できない状態
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1507)
<ローカル> **config/deploy/production.rb**
```ruby
server 'XXX.XXX.XXX.XXX', user: 'ec2-user', roles: %w{app db web}
# 記入漏れや< >など入ってないか確認
```
</div>
</details>
---
## ◆SSHKit::Runner::ExecuteError: Exception while executing as deploy@example.com: Authentication failed for user deploy@example.comと出る
<details><summary>説明を開く</summary><div>
capistranoがEC2へSSH通信したが弾かれている。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1507)
<ローカル> **config/deploy.rb**
```ruby
set :ssh_options, auth_methods: ['publickey'],
keys: ['~/.ssh/hoge.pem']
# keys: のファイル名が ssh -i コマンドで使用しているファイル名と合ってるか確認
```
[参考URLを開く](https://qiita.com/aoitrain/items/90036ec9c24f0566711e)
</div>
</details>
## ◆fatal: Could not read from remote repository.と出ている
<details><summary>説明を開く</summary><div>
capistranoがリモートリポジトリを見つけられない状態。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1507)
<ローカル> **config/deploy.rb**
```ruby
set :repo_url, 'git@github.com:hogehoge/chat-space.git'
# exampleや<Githubのユーザー名>などとなっていないか確認
```
[参考URLを開く](https://www.tabosque.com/tech/22)
</div>
</details>
## ◆手動デプロイでrake db:〜時に“Connect failed: Access denied for user 'root'@'localhost' (using password: YES)”と出る。
<details><summary>説明を開く</summary><div>
MySQLにアクセスするためのパスワードに異常がある。
①database.ymlのproduction:〜が間違えていないか確認。
間違えていたら修正しコミット&プッシュ、リモートでgit pull origin masterも実行する。
<ローカル> **config/database.yml**
```ruby
production:
<<: *default
database: ~~~(それぞれのアプリケーション名によって異なっています。こちらは編集しないでください)
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
# このように書き換えているか確認
```
②設定したパスワードを使ってmysql -u root -pで入れるか確認する。
<リモート>
・`env | grep DATABASE_PASSWORD`でパスワードを表示する。
・`mysql -u root -p`を実行し、先程表示されたパスワードで入れるか試す。
入れなかったら想定しているものとは別のパスワードが設定されている可能性が高い。
パスワードの設定時に出てくる↓のメッセージをパスワードの設定に失敗したと勘違いして別のパスワードを登録しようとする受講生がよくいる。
`Warning: Using a password on the command line interface can be insecure.`
なので`sudo vim /etc/environment`で正しいパスワードを設定しec2に入り直す。
ターミナルで`history`を実行すると実行したコマンドの履歴が見れるので正しいパスワードが見つかるかもしれない。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1505)
</div>
</details>
---
## ◆Can't connect to local MySQL server through socket 'mysql.sock' と出る
<details><summary>説明を開く</summary><div>
capistranoが`rake db:migrate`をしたらmysqlに接続できなかった状態
### エラー文末尾が(2)の時
そもそもmysqlが起動していない可能性を疑う。
<リモート>
`$ sudo service mysqld start`を実行
`START` と表示されたらmysqlが起動していなかったのが原因
### まだ直らない
sockファイルのパス指定を疑う。
[カリキュラム](https://master.tech-camp.in/curriculums/1505)
<ローカル> **config/database.yml**
```ruby
production:
socket: /var/lib/mysql/mysql.sock
# このように書き換えているか確認
```
### まだ直らない
sockファイルが生成される場所がおかしくなっている可能性がある。
※sockファイルはmysqlを起動した時に生成される。
<リモート>
`sudo vim /etc/my.cnf`でmy.cnfを開き、以下のようになるよう編集する。
4行目あたりにsocket=/tmp〜といった記述があるようであれば削除する。
編集が完了したら再度`sudo service mysqld restart`を実行する。
```
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```
</div>
</details>
---
### (検証中)Can’t connect to local MySQL server through socket ‘mysql.sock’ と出て末尾が(2)の時(不確定な対策方法)
<details><summary>説明を開く</summary><div>
何らかの原因でsockファイルが作れていない。
<リモート> 以下手順でsockファイルを自分で作る
```shell
$ sudo service mysqld stop
$ sudo touch /var/lib/mysql/mysql.sock
$ sudo service mysqld start
```
→まだ直らない
→<リモート>sudo rm mysql.sockで一旦削除し、sudo touch mysql.sockで手動作成、sudo chown mysql:mysql mysql.sockで権限を付与しておく
[参考](https://qiita.com/kanohisa/items/564035efd74d9c75bdcb)
</div>
</details>
---
### (検証中)Can’t connect to local MySQL server through socket ‘mysql.sock’ と出て末尾が(38)の時
<リモート>「sudo chown mysql:mysql /var/lib/mysql」で権限を与える
## ◆bundle installが(5分以上)終わらない
<details><summary>説明を開く</summary><div>
EC2がメモリ不足でクラッシュしている可能性が高い。
<ローカル>
`control + C` でデプロイコマンドを強制終了する。
`ssh -i`コマンドでEC2に接続できるか確認。
### ●接続できない
EC2がクラッシュしているのがほぼ確定した状態。
<ブラウザ>
AWS→EC2のコンソールを開き、EC2インスタンスを停止→開始と順に実行する(再起動は使わないこと)
<リモート> 以下コマンドでmysqlとnginxを起動する
```shell
$ sudo service mysqld start
$ sudo service nginx start
```
<ローカル>
再度デプロイする
### ●もう1回やっても終わらない
メモリ不足を根本的に解消する必要がある。
<リモート> 以下手順でEC2内に2Gのswap領域を確保する
```shell
sudo dd if=/dev/zero of=/swap bs=1M count=2048
sudo mkswap /swap
sudo swapon /swap
sudo chmod 600 /swap
sudo vim /etc/fstab
# 以下を追記
/swap swap swap defaults 0 0
```
[参考](https://qiita.com/HrsUed/items/c156ed69e927b6165717)
</div>
</details>
---
## ◆working_derectryのcurrent/currentがどうたらこうたらとでる
<details><summary>説明を開く</summary><div>
unicorn.rbの記述が
`app_path = File.expand_path('../../../', __FILE__)`
となっているか再確認。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1507)
<ローカル> **config/unicorn.rb**
```ruby
app_path = File.expand_path('../../', __FILE__)
worker_processes 1
working_directory app_path
pid "#{app_path}/tmp/pids/unicorn.pid"
listen "#{app_path}/tmp/sockets/unicorn.sock"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
↓↓↓↓↓↓↓ 以下のように変更 ↓↓↓↓↓↓
# ../が一つ増えている
app_path = File.expand_path('../../../', __FILE__)
worker_processes 1
# currentを指定
working_directory "#{app_path}/current"
# それぞれ、sharedの中を参照するよう変更
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
# このように書き換えているか確認
```
</div>
</details>
---
## ◆ArgumentError: wrong number of arguments (given 3, expected 1..2)が出る。
<details><summary>説明を開く</summary><div>
deploy.rbの記述がきちんとかけているか確認。auth_methods:が:auth_methodsになってたりしてないか。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1507)
<ローカル> **config/deploy.rb**
```ruby
# config valid only for current version of Capistrano
# capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する
lock '<Capistranoのバージョン>'
# Capistranoのログの表示に利用する
set :application, '自身のアプリケーション名'
# どのリポジトリからアプリをpullするかを指定する
set :repo_url, 'git@github.com:<Githubのユーザー名>/<レポジトリ名>.git'
# バージョンが変わっても共通で参照するディレクトリを指定
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')
set :rbenv_type, :user
set :rbenv_ruby, '<このアプリで使用しているrubyのバージョン>' #カリキュラム通りに進めた場合、2.5.1か2.3.1です
# どの公開鍵を利用してデプロイするか
set :ssh_options, auth_methods: ['publickey'],
keys: ['<ローカルPCのEC2インスタンスのSSH鍵(pem)へのパス>'] ※例:~/.ssh/key_pem.pem
# プロセス番号を記載したファイルの場所
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }
# Unicornの設定ファイルの場所
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5
# デプロイ処理が終わった後、Unicornを再起動するための記述
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
task :restart do
invoke 'unicorn:restart'
end
end
# このように書き換えているか確認
```
</div>
</details>
---
## ◆自動デプロイは通ったものの画面の表示が崩れている(assets:precompileがうまくいってなさそう)
<details><summary>説明を開く</summary><div>
・Elastic IP:3000にアクセスしていないか、していたら:3000を外す
・3000無しでアクセス出来ない時↓を試す。
<リモート>
「cd /var/lib」、「sudo chmod -R 775 nginx」、「sudo service nginx restart」
を試す。
.<リモート>
nginxのrails.confを確認する。`location ^~ /assets/〜`に記述ミスがないか?修正したらnginxを再起動して再度自動デプロイ。
`sudo vim /etc/nginx/conf.d/rails.conf`
```ruby:
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
root /var/www/<アプリケーション名>/current/public;
}
```
</div>
</details>
---
## ◆本番だけS3に画像がアップロードできない(ローカルはうまくいっている)
<details><summary>説明を開く</summary><div>
<リモート>
●ターミナルで`convert -version`を実行してみる。
`Version: ImageMagick〜`と出なかった場合、本番環境にImageMagickが入っていないので↓を実行する。(コピペして一度に実行すること)
```
sudo yum install \
git make gcc-c++ patch \
libyaml-devel libffi-devel libicu-devel \
zlib-devel readline-devel libxml2-devel libxslt-devel \
ImageMagick ImageMagick-devel \
```
[カリキュラムを開く](https://master.tech-camp.in/curriculums/1503)
●production.logにExcon::Error::Forbidden (Expected(200) <=> Actual(403 Forbidden)と出る。
S3に関する環境変数が怪しい。
設定ミスが無いか、secrets.ymlに誤字脱字がないかチェックする。(結局カッコ抜けが原因だった事例があった)
[カリキュラムを開く](https://master.tech-camp.in/curriculums/2143)
</div>
</details>
---
## ◆ローカルでバグを修正してpushと自動デプロイもしたのに本番環境のバグが直らない
<details><summary>説明を開く</summary><div>
本番環境に変更が反映されていない説(古いバージョンのアプリが起動し続けている?)
↓の手順を行う。
① `ps aux| grep unicorn`でプロセスを表示。
②`kill -9 プロセス番号`でunicornのプロセスを終了。
③`bundle exec cap production deploy`で再度自動デプロイ
</div>
</details>
---
## ◆何をやってもunicornが立ち上がらない場合
<details><summary>説明を開く</summary><div>
何かの作業でフリーズし、EC2を強制終了させた時などにpidファイルが残ってしまっている。EC2のアプリにunicorn.pid(unicorn.older.pid?)ファイルが残っていないか確認する。
残っていれば`sudo rm ファイル名`でこれを削除する。
</div>
</details>
---
## ◆S3に画像をあげようとしているが、自動デプロイの際にassets:precompileでエラーが出る
<details><summary>説明を開く</summary><div>
・ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_keyと出ている場合
[カリキュラム](https://master.tech-camp.in/curriculums/2143)通りに設定できているか見直す。
・どこも間違えていなさそうな場合、環境変数を疑う。
<ローカル>
`env | grep AWS`を実行する。何も表示されなかったら環境変数が設定できていないので
`vim ~/.bash_profile`で環境変数を設定してから`source ~/.bash_profile
`を実行する。
環境変数が表示された場合、変更が適用されていない可能性がある。
これはターミナルを複数開いているとそれぞれで↓を実行しないと適用されないため。
`source ~/.bash_profile`
自動デプロイをしているターミナルで↑を実行する。
</div>
</details>
---
## ◆bundle installで怒られる。
<details><summary>説明を開く</summary><div>
gem ffiのバージョンが違うやらなんやら言われるのでその通りにffiのversionを1.11.1の最新のversionに合わしてあげた。localとec2のversionが違うのでerrorが出た。ffi updateを試し、根強く再起動などを試す。
また、gem scssc(おそらくfontawesomeのgem)はこの本番環境では入らないので、削除する。
</div>
</details>
---
## ◆ローカルでrails sなどをしようとするとArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_keyと出てしまう。
<details><summary>説明を開く</summary><div>
secrets.ymlに異常がある可能性が高い。
・自動デプロイ後にsecrets.yml自体が消失している場合がある。その際は再度用意する。
・secrets.ymlに記述ミスがないか確認する。ローカルならdevelopment:の部分をよく見直す。また、unicorn.rbのpathあたりを再確認。
[カリキュラムを開く](https://master.tech-camp.in/curriculums/2143)
<ローカル> **config/secrets.yml**
```ruby
development:
secret_key_base: ~~~~~~~~
aws_access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
aws_secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
test:
secret_key_base: ~~~~~~~~
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
aws_access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
aws_secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
# このように書き換えているか確認
```
</div>
</details>
---
## cap installが出来ない。
<details><summary>説明を開く</summary><div>
sshkitというgemとcapistranoのバージョン依存関係が狂ってしまっている?
●対処策
sshkitのバージョンを指定して下げる。Gemfileのgroup :development, :testに↓を追加する。
```
gem 'sshkit', '1.18.2'
```
</div>
</details>
## 以下工事中
<style>
p.part>a,p.part>a:link,p.part>a:visited,p.part>a:hover,p.part>a:active {
color: #FDE659;
}
#doc {
background-color: #113F67;
color: #ededed;
}
pre.part {
background-color: #E7EAF6;
}
.markdown-body code {
background-color: #E7EAF6;
color: #B22221 !important;
}
.markdown-body pre code {
color: inherit !important;
}
</style>