質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
unicorn

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

nginx

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ruby on Rails

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

Q&A

2回答

2915閲覧

物理的に分かれている二台のサーバーを使ったunicorn,nginx連携のやり方及び仕組み

domidomi

総合スコア34

unicorn

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

nginx

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ruby on Rails

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

0グッド

0クリップ

投稿2018/08/09 10:33

編集2022/01/12 10:55

##追記
二つ疑問に思ったのですが、

TCPでつなぐ際に傍受の危険性はないのでしょうか?(普通にTCPでつないだ場合暗号化が無いと怖い気がする)
・調べているとwebsoketという技術があるようですが、nginxunicornwebsoketで繋ぐ事はできないのでしょうか?
websoketはコネクションを繋ぎっぱなしである場合TCPの上位互換の様に見受けられました。unicornnginxのやり取りは高速な双方向通信が望ましい気がするのでwebsoketが適しているのかなと思った次第です。

知識が足りず大変恐縮ですが、お知りの方がいらっしゃいましたらご教示頂けると幸いです。

##疑問
nginx(WEBサーバ)とunicorn(APサーバ)を現在同一のサーバーの中で連携させrailsで使用していますが、違うサーバーに分けて(物理的に分かれている二台のサーバー)運用しようと思った際はどのようにすればよいのでしょうか?

・またその通信のプロトコルはどのようになっているのでしょうか?
(TCPコネクションがずっと繋がっている?)

##詳細

一つのサーバーにどちらも入れている現在、nginxとunicornを連携させるときnginx設定ファイルに

nginx/conf.d/local.conf

upstream unicorn { server unix:/var/www/app/deploy_app/shared/sockets/unicorn.sock; }

のような記述をしました。
これはUNIXドメインソケットを用いたつなぎ方かと思います。

ただUNIXドメインソケットは同一オペレーションシステム上のプロセス間通信であり、サーバーが分かれた場合(違うOS上で動いている者同士)使用できないと考えます。

とすると

nginx/conf.d/local.conf

upstream unicorn { server 192.168.39.11:5555 }

config/unicorn.rb

listen 5555

のように書いてTCP通信をするのかな?と思ったのですがこれではunicornがおかれたサーバーに対し5555ポートで接続しようとするとみんなつないでしまう気がします。
そもそもTCPを繋ぎっぱなしにするなんてあんまりあり得ない気がします。(速度もとっても遅くなってしまいそう)

そして途方にくれています・・・。

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

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

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

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

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

guest

回答2

0

普通に tcp でつなぐことが多いと思います。
リバース Proxy も普通に tcp が使われますし、大きな問題はないと思います。


気にされている点は、「APサーバ に クライアントが直接繋げるのではないか」という点でしょうか。

たとえば、サーバーの構成が、「 [Clinents] --- Internet (TCP) ---> [nginx] -- ローカルネットワーク (TCP) --> [APサーバ(インターネット未接続)] 」なら ありでしょうか?

文字で書くとわかりにくいので... 専用サーバ上で複数のマシンをネットワーク接続する――はじめての「さくらの専用サーバ」(3) の図1、図2をお借りして書くと...

質問者さんの「複数台構成のイメージ」は、「図1 すべてのサーバーが直接インターネットに接続される構成」なんだと思います。

3台並んでいるサーバーの右側がAPサーバーと仮定した場合、この図では、firewall 等で、アクセス制限しないと インターネット側から自由にアクセスできます。

複数台のサーバー構成を「図2 一部のサーバーのみがインターネットに接続される構成」のようにして、通常のインターネット接続とは別のローカルネットワークを用意して、

  • すべてのサーバーは、ローカルネットでつながっていて、サーバー間の通信は、ローカルネットを使う。
  • クライアントが接続するサーバーのみグローバルなインターネット接続を行う

構成の場合、右側のサーバーがAPサーバーと仮定すると APサーバーは、グローバルなインターネットに接続していないので、クライアントから直接アクセスされることはありません。

投稿2018/08/10 02:32

CHERRY

総合スコア25171

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

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

domidomi

2018/08/12 02:24

丁寧なご回答ありがとうございます。 TCPでも大丈夫な旨、ネットワークセキュリティ的な構成などがわかりました。 二つ疑問に思ったのですが、こちらに記載する可読性が低い気がしたので質問に追記という項目で追加させて頂きました。お時間御座いましたらご覧頂けると幸いです。
guest

0

別サーバの場合、もちろん一般的にはTCPで接続するかと思いますが、「あんまりあり得ない」と思われている(UNIXドメインソケットだったらあり得るのに?)のがちょっとよくわかりませんでした。別に普通にあり得ますし、「とっても遅く」なることはないですよね。

試しに同一サーバでも127.0.0.1で接続するようにしてみるといいんではないでしょうか。(そういう問題でもないんでしょうか。)

追記について

TCPは普段のインターネットウェブブラウジングで使用しているプロトコル

というかTCPを使わないのはUDPベースの限られたもので、ほとんどのプロトコルはTCPの上で動くものなのでした。

TCPでつなぐ際に傍受の危険性はないのでしょうか?

あります。そのため、場合によってはTLS(SSL)等を使ったりすることもあります(TLSもTCPの上で動きます)。
が、傍受の危険性は普通のUNIXドメインソケットでもあるので、どこまで気にするか(どこで守るか)の問題になるかと思います。

ちなみにWebSocketは双方向通信を行うもので、HTTPとの比較で考えるもので、TCPとの比較で考えるものではないです。むしろ、WebSocketはHTTPベースで通信をしている経路の上にTCP(ソケット)的な通信を行うためのもので、TCPそのものが使えるのであればわざわざWebSocketにするのはなぜ…?という気がします。

投稿2018/08/09 11:58

編集2018/08/12 03:13
takahashim

総合スコア1877

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

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

domidomi

2018/08/12 02:33

ご回答ありがとうございます。 知識が浅く、また、乱筆乱文申し訳ございません。 ・webサーバーとアプリケーションサーバーは高速で双方向な通信が必要 ・TCPは普段のインターネットウェブブラウジングで使用しているプロトコルという事で、上記が満たされない という固定観念があり、先の様な記述となってしまいました。 TCPもwebサーバーとアプリケーションサーバー間で高速で双方向な通信を満たせるようなプロトコルなのですね。 また、二つ疑問に思ったのですが、こちらに記載する可読性が低い気がしたので質問に追記という項目で追加させて頂きました。お時間御座いましたらご覧頂けると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問