--- 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>