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

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

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

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

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

3761閲覧

nginxについて。フロントとバックエンドで繋ぐ先を振り分ける方法が知りたいです。

yaha4967

総合スコア106

nginx

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

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/06/03 02:20

編集2021/06/03 04:40

保留します

自己解決しそうなのですが、今、細かく書く余裕がないのであとで自己解決書きます!遅くとも月曜には書きます

何かヒントが欲しいです。

現状

reactとrails APIモードで開発をしています。apiには「ホスト名/api/v1」でアクセスできます。

現在、reactとrails APIのそれぞれに1つずつnginxを使っています。それをEC2に載せたのですが、nginx周りの設定が出来ておらずサイトにアクセスしてもエラーは出ないものの何も表示されない状態です。おそらくrailsの方にアクセスしているのかと思います。

問題

・現状railsにしかアクセスできていないこと
しかし、api/v1にアクセスしてもjsonが返ってこないのが気になります。

・nginxを二つ使って良いのかわからない。

実現したいこと

最終的には
http://ホスト名/api/v1にアクセスした時にはrails apiにそれ以外はreactに繋がるようにしたい。

考えたこと

①nginx二つでやるのが普通か。もしくは一つだけ使いnginxの設定で振り分けるのか。
ちょっと調べてみたところlocationというので繋ぐ先を振り分けることができるっぽいので後者かと考えました。

②分けるとした場合どうすれば良いのか。
①の考えが正しかったとしたら

  1. nginxを1つにする
  2. nginxの設定を1つにまとめる

具体的にはapiのルートが「ホスト/api/v1」なのでバックエンドへのアクセスを「location api/v1」としてフロントエンドのアクセスを「location /」で書く。

という作業を踏むことになると思うのですが、
現状、apiの方のnginxはupstreamというものを用いています。

このupstreamで定義したappをどう「location /api/vi」に置き換えれば良いのかがわからないです。

nginx

1upstream app { 2 server unix:///app/tmp/sockets/puma.sock; 3} 4 5server { 6 listen 80; 7# =========ローカルと本番切り替え=========== 8 9 #server_name ~~~~~~~; 10 server_name localhost; 11 12# ====================================== 13 14 access_log /var/log/nginx/access.log; 15 error_log /var/log/nginx/error.log; 16 17 root /app/public; 18 19 client_max_body_size 100m; 20 error_page 404 /404.html; 21 error_page 505 502 503 504 /500.html; 22 try_files $uri/index.html $uri @app; 23 keepalive_timeout 5; 24 25 location @app { 26 proxy_set_header X-Real-IP $remote_addr; 27 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 28 proxy_set_header Host $http_host; 29 proxy_pass http://app; 30 } 31} 32

ちなみにフロントの方のnginxの設定はこうなっています。

server { listen 80; location / { root /var/www; index index.html index.htm; try_files $uri /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

ご教示いただけたら幸いです。よろしくお願いします。

追記 nginxを一つにまとめてみました(local)

私が考えたことをローカルで実際に試してみたのですが、reactにしかアクセスできませんでした。reactはまだ一切いじってないので、どのルートにアクセスしてもreactのロゴが回るあの初期画面のままです。
以下の設定では/api/v1にアクセスされた時だけrailsに繋がるようにしたつもりなのですが。。。

改めましてどなたかご教示お願いします。よろしくお願いします!

nginx

1upstream app { 2 server unix:///app/tmp/sockets/puma.sock; 3} 4 5server { 6 listen 80; 7# =========ローカルと本番切り替え=========== 8 9 #server_name 54.95.194.179; 10 server_name localhost; 11 12# ====================================== 13 14 access_log /var/log/nginx/access.log; 15 error_log /var/log/nginx/error.log; 16 17 root /app/public; 18 19 client_max_body_size 100m; 20 error_page 404 /404.html; 21 error_page 505 502 503 504 /500.html; 22 try_files $uri/index.html $uri @app; 23 keepalive_timeout 5; 24 25 location / { 26 root /var/www; 27 index index.html index.htm; 28 try_files $uri /index.html; 29 } 30 error_page 500 502 503 504 /50x.html; 31 location = /50x.html { 32 root /usr/share/nginx/html; 33 } 34 location /api/v1 { 35 location @app { 36 proxy_set_header X-Real-IP $remote_addr; 37 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 38 proxy_set_header Host $http_host; 39 proxy_pass http://app; 40 } 41 } 42} 43

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

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

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

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

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

guest

回答2

0

以下の設定では/api/v1にアクセスされた時だけrailsに繋がるようにしたつもりなのですが。。。

としたい場合は

location /api/v1 {

location @app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://app; }

}

ではなく

location /api/v1 { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://app; }

追記

・nginxを二つ使って良いのかわからない。

好きにすれば良いけど振り分け先が二カ所になるからという理由でnginxを二つ使うのは不適切な対応
今質問者が試している内容が正解

投稿2021/06/03 05:45

編集2021/06/03 05:47
hentaiman

総合スコア6426

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

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

0

自己解決

すいません。回答遅れてしまいました。

ポイントは今回、apiの方がサーバー内でしか使わないと言う点です。なのでserver_nameはlocalhostでいけました。

apiの方のconfig

upstream app { server unix:///app/tmp/sockets/puma.sock; } server { listen 3000; server_name 127.0.0.1; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; root /app/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @app; keepalive_timeout 5; location @app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://app; } }

そして、ユーザーは基本frontの方に流れます。下記です。

その中でもし、api/v1へのアクセスがあればそれは先ほどのapiの方に流れます。この流す部分はlocation /api/v1により設定してます。

frontの方のconfig

server { listen 80; server_name ^^^^^^^^; root /var/www; index index.html index.htm; try_files $uri /index.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location /api/v1 { proxy_pass http://127.0.0.1:3000; } }

投稿2021/06/13 09:46

yaha4967

総合スコア106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問