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

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

ただいまの
回答率

90.48%

  • AWS(Amazon Web Services)

    2593questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Docker

    1082questions

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

  • nginx

    1050questions

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

AWS環境+Nginxでのmastodonのリバースプロキシが上手く行かない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,120

pratula

score 4

流行のマストドンを構築しています。
http://qiita.com/tsuitta_dayo/items/dfd659ec68435653d16a
この記事を参考にインスタンスを立てる所まで行ったのですが、

http://<ドメイン名>
にアクセスしても、SSL接続にはリダイレクトされるのですが、
Nginxのデフォルトトップページに飛んでしまいます。

デフォルトのNginxのコンフィグファイルでは動きませんでした。

ProxyPassあたりがおかしいと思うのですが
設定でおかしい場所が分かりません。

どなたが御指南お願いします。

発生している問題・エラーメッセージ

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

このトップページに飛んでしまいます。
Http接続がリダイレクトされて、port3000で動いているdocker内(?)のマストドンに飛んでほしいです。

該当のソースコード

/etc/nginx/conf.d/mastodon.conf

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name msdnaart.net;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
#SSL証明書はELBに置いています。
#なのでリダイレクトループ回避の設定を書いています。
  location / {
      if ($http_x_forwarded_proto != https){
      rewrite ^ https://$host$request_uri? permanent;
     } 
   }
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name msdnaart.net;

  ssl_protocols TLSv1.2;
  ssl_ciphers EECDH+AESGCM:EECDH+AES;
  ssl_ecdh_curve prime256v1;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

#  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
#  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
#  ssl_dhparam         /etc/ssl/certs/dhparam.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 0;

  root /home/mastodon/live/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";

  location / {
   try_files $uri @proxy;
  }

  location /assets {
    add_header Cache-Control "public, max-age=31536000, immutable";
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
   proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
 }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://localhost:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

また、インスタンスのNATテーブルです。
qiitaで書かれている通りに

 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000


するとNginxに飛ぶ前にport3000に飛び、http接続がリダイレクトされません。
また、「連合」も動きませんでした。

現在のiptables -t natです

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  ip-172-18-0-0.ap-northeast-1.compute.internal/16  anywhere 
MASQUERADE  all  --  ip-172-17-0-0.ap-northeast-1.compute.internal/16  anywhere 
MASQUERADE  tcp  --  ip-172-18-0-5.ap-northeast-1.compute.internal  ip-172-18-0-5.ap-northeast-1.compute.internal  tcp dpt:4000
MASQUERADE  tcp  --  ip-172-18-0-6.ap-northeast-1.compute.internal  ip-172-18-0-6.ap-northeast-1.compute.internal  tcp dpt:3000

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere
DNAT       tcp  --  anywhere             anywhere             tcp dpt:4000 to:172.18.0.5:4000
DNAT       tcp  --  anywhere             anywhere             tcp dpt:3000 to:172.18.0.6:3000

環境

AWS

EC2インスタンス 1
VPC 1
サブネット 1
ELB
リスナー 
HTTP(port80) -> HTTP(port80)
HTTP(port443) -> HTTP(port80)

追記

Nginxから443番ポートに飛ばされた後、
また80番に飛ぶんだからリダイレクトループするよな、と思い、
リスナーの設定を変更しました。

HTTP(port80) -> HTTP(port80)
HTTP(port443) -> HTTP(port443)

そうすると、今度はタイムアウトしていしまいます。
”curl http://127.0.0.1:443”は
「curl: (52) Empty reply from server」です。
"http://127.0.0.1:3000”はちゃんとトップページが帰ってくるので、
やはりポートの割振りの問題だと思います。

ここから先に進めないです・・・

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

自己解決しました。

何回かやり直したので、きちんと原因は特定出来てないのです。
おそらく、iptables に PREROUTINGで80portを3000portでリダイレクトするように設定したことと、
Nginxの設定をconf.dではなく、/etc/nginx/site-enabled/defaultを編集するようにするべきだったかと。

一連の手順をまとめました。
これで大丈夫かと思います。

http://qiita.com/shibafu/items/6f3646115acc16c748ad

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

以下、実際のFQDNに合わせて変更してください。

    server_name msdnaart.net;

よくわからなければ以下でもいいです。

    server_name _;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/26 19:26 編集

    ありがとうございます!

    以下の設定ファイルで
    これでhttp → httpsからport3000番に飛ぶ!までが出来ました。
    ですが、まだ「連合」機能が動いていません。

    連合はport4000を通して動作するらしいので、やはりNginxのプロキシの問題だと思うのですが、
    何かご存じないでしょうか?
    御指南いただけると幸いです。

    map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
    }

    server {
    listen 80;
    listen [::]:80;
    server_name msdnaart.net.;
    # Useful for Let's Encrypt
    location /.well-known/acme-challenge/ { allow all; }
    location / {
    if ($http_x_forwarded_proto != https){
    rewrite ^ https://$host$request_uri permanent;
    }
    }
    }

    server {
    # listen 443 ssl;
    # listen [::]:443 ssl;
    listen 401;
    listen [::]:401;
    server_name msdnaart.net.;

    # ssl_protocols TLSv1.2;
    # ssl_ciphers EECDH+AESGCM:EECDH+AES;
    # ssl_ecdh_curve prime256v1;
    # ssl_prefer_server_ciphers on;
    # ssl_session_cache shared:SSL:10m;

    # ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # ssl_dhparam /etc/ssl/certs/dhparam.pem;

    keepalive_timeout 70;
    sendfile on;
    client_max_body_size 0;

    root /home/ubuntu/mastodon/live/public;

    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    add_header Strict-Transport-Security "max-age=31536000";

    location / {
    try_files $uri @proxy;
    }

    location /assets {
    add_header Cache-Control "public, max-age=31536000, immutable";
    }

    location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
    }

    location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://localhost:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
    }

    error_page 500 501 502 503 504 /500.html;
    }

    .env.production のドメイン部分です

    ~
    # Federation
    LOCAL_DOMAIN=msdnaart.net.
    LOCAL_HTTPS=false
    ~

    キャンセル

同じタグがついた質問を見る

  • AWS(Amazon Web Services)

    2593questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Docker

    1082questions

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

  • nginx

    1050questions

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