🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

Q&A

解決済

2回答

10574閲覧

UnicornのSocketファイル「unicorn.sock」が生成されない【Rails+Unicorn+Nginx】

whitia

総合スコア7

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

0グッド

1クリップ

投稿2019/10/08 11:35

編集2019/10/09 00:06

みなさん、お世話になります。


追記
実はデプロイ中にエラーが発生していました。
そのエラーはconfig/deploy.rb内で行っているunicornの再起動(restart)のところを、unicornの起動(start)に変更することで対処していました。
この対処がunicorn.sockが作成されていない原因ではないかと思い、unicornの再起動(restart)に戻してデプロイからやり直しています。
しかし、そこでもエラーが発生するので、別途質問をあげさせてもらいました。
CapistranoでRailsアプリのデプロイ中にUnicornにてエラーが発生【Rails+Unicorn+Nginx】


今回、初めてRailsアプリを作成し、VPSにデプロイを行おうとしているところです。

(初心者向け)vpsを契約して、capistrano3でRailsアプリをデプロイするまで [その1 サーバー設定編]
上記を参考にRailsアプリをConohaにデプロイするところまで完了しました。
最後にアクセス確認しようとしたところ、以下のエラーが表示されてしまいました。

We're sorry, but something went wrong. If you are the application owner check the logs for more information.

VPSにアクセスし、nginx.error.logを確認したところ、以下のエラーが発生していました。

2019/10/xx xx:xx:xx [crit] 17197#0: *18 connect() to unix:/tmp/sockets/unicorn.sock failed (2: No such file or directory) while connecting to upstream, client: x.x.x.x, server: x.x.x.x, request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/sockets/unicorn.sock:/", host: "x.x.x.x"

/tmp/sockets/unicorn.sockは確かに存在しませんでした。

このファイルはUnicornとNginxが通信するために必要なファイルだという認識です。
このファイルが存在しないということは、Unicornの設定がおかしいのかと思い何度も見直したんですが、おかしなところはなさそうに思えます。

Unicorn関連の設定ファイルをいかに掲載します。3つあります。
基本的には参考にしたページのとおりです。

config/unicorn/production.rb

#ワーカーの数 $worker = 2 #何秒経過すればワーカーを削除するのかを決める $timeout = 30 #自分のアプリケーション名、currentがつくことに注意。 $app_dir = "/var/www/app/current" #リクエストを受け取るポート番号を指定。後述 $listen = '/tmp/sockets/unicorn.sock' #PIDの管理ファイルディレクトリ $pid = '/tmp/pids/unicorn.pid' #エラーログを吐き出すファイルのディレクトリ $std_log = File.expand_path 'log/unicorn.log', $app_dir # 上記で設定したものが適応されるよう定義 worker_processes $worker working_directory $app_dir stderr_path $std_log stdout_path $std_log timeout $timeout listen $listen pid $pid #ホットデプロイをするかしないかを設定 preload_app true #fork前に行うことを定義 before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! old_pid = "#{server.config[:pid]}.oldbin" if old_pid != server.pid begin Process.kill "QUIT", File.read(old_pid).to_i rescue Errno::ENOENT, Errno::ESRCH end end end #fork後に行うことを定義 after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end

lib/capistrano/tasks/unicorn.rb

#unicornのpidファイル、設定ファイルのディレクトリを指定 namespace :unicorn do task :environment do set :unicorn_pid, "/tmp/pids/unicorn.pid" set :unicorn_config, "#{current_path}/config/unicorn/production.rb" end #unicornをスタートさせるメソッド def start_unicorn within current_path do execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D" end end #unicornを停止させるメソッド def stop_unicorn execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})" end #unicornを再起動するメソッド def reload_unicorn execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})" end #unicronを強制終了するメソッド def force_stop_unicorn execute :kill, "$(< #{fetch(:unicorn_pid)})" end #unicornをスタートさせるtask desc "Start unicorn server" task start: :environment do on roles(:app) do start_unicorn end end #unicornを停止させるtask desc "Stop unicorn server gracefully" task stop: :environment do on roles(:app) do stop_unicorn end end #既にunicornが起動している場合再起動を、まだの場合起動を行うtask desc "Restart unicorn server gracefully" task restart: :environment do on roles(:app) do if test("[ -f #{fetch(:unicorn_pid)} ]") reload_unicorn else start_unicorn end end end #unicornを強制終了させるtask desc "Stop unicorn server immediately" task force_stop: :environment do on roles(:app) do force_stop_unicorn end end end

config/deploy.rb

# capistranoのバージョン固定 lock "~> 3.11.2" # デプロイするアプリケーション名 set :application, 'app' # cloneするgitのレポジトリ # 1-3で設定したリモートリポジトリのurl set :repo_url, 'git@github.com:aaa/bbb.git' # deployするブランチ。デフォルトはmasterなのでなくても可。 set :branch, 'master' # deploy先のディレクトリ。 set :deploy_to, '/var/www/app' # シンボリックリンクをはるファイル set :linked_files, fetch(:linked_files, []).push('config/secrets.yml') # シンボリックリンクをはるフォルダ set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system') # 保持するバージョンの個数(※後述) set :keep_releases, 5 # rubyのバージョン # rbenvで設定したサーバー側のrubyのバージョン set :rbenv_ruby, '2.6.3' # 出力するログのレベル。 set :log_level, :debug # デプロイのタスク namespace :deploy do # unicornの再起動 desc 'Restart application' task :start do invoke 'unicorn:restart' end # データベースの作成 desc 'Create database' task :db_create do on roles(:db) do |host| with rails_env: fetch(:rails_env) do within current_path do # データベース作成のsqlセット # データベース名はdatabase.ymlに設定した名前で sql = "CREATE DATABASE IF NOT EXISTS app_production;" # クエリの実行。 # userとpasswordはmysqlの設定に合わせて execute "mysql --user=root --password=xxxxx -e '#{sql}'" end end end end after :publishing, :restart after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do end end end

VPSの/etc/nginx/conf.d/app.confの設定は以下のとおりです。

conf

1 upstream app_server { 2 server unix:/tmp/sockets/unicorn.sock fail_timeout=0; 3 }

なぜunicorn.sockが作られていないのかおわかりになる方はいらっしゃいますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

CapistranoでRailsアプリのデプロイ中にUnicornにてエラーが発生【Rails+Unicorn+Nginx】

上記質問が解決済になったことにより、こちらの質問も解決済となりました。

投稿2019/10/12 01:53

whitia

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

怪しいと思っている点を書いてみます。

/tmp/sockets/unicorn.sock
は、記載場所によって2種類の意味を持つことがあります。
・ルートディレクトリ配下の /tmp
・アプリケーションのルートディレクトリ配下の tmp

tmpと書いてある場所それぞれについて、'/'をつけるのが正しいのか、外すのが正しいのか、はたまたフルパスを記載するのが正解なのか、見極めないといけません...

そして少なくとも、このnginxの設定ファイルの記述は、フルパスを記載する必要があった気がします。

# /etc/nginx/conf.d/app.conf upstream app_server { # これでは、nginxがルートディレクトリ配下の unicorn.sock を探しに行ってしまう server unix:/tmp/sockets/unicorn.sock fail_timeout=0; # server unix:/var/www/????/current/tmp/sockets/unicorn.sock fail_timeout=0; # or どちらか、実際にtmpディレクトリがある方 # ???? の部分は正しいpathを自身で調べて記載して下さい # server unix:/var/www/????/shared/tmp/sockets/unicorn.sock fail_timeout=0; }

(ただし、whitiaさんが本当にルートディレクトリ配下の /tmp 内にsockファイルを生成したいのであれば質問文のままで問題ないです。)

他の記載箇所については、一つ一つ確認してみてはいかがでしょう?

参考: 【CentOS 7】Nginx + Unicorn で Rails アプリケーションを本番環境で立ち上げる方法

投稿2019/10/11 12:25

siruku6

総合スコア1382

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

whitia

2019/10/12 01:52

すみません、こちらの質問は[CapistranoでRailsアプリのデプロイ中にUnicornにてエラーが発生【Rails+Unicorn+Nginx】](https://teratail.com/questions/216195)の質問が解決済みになったことにより、解決済になりました。こちらの質問を解決済みにするのを失念しており、申し訳ありません。記載の設定は絶対パスで書いており、紛れもなくルートディレクトリ配下の/tmp/pids内にsockファイルを生成しようとしていました。しかし現在は先の質問にもある通り、/var/www/app/shared/tmp/pids配下に生成するようにしています。
siruku6

2019/10/12 02:10

いえいえ、きちんと経過報告していただけてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問