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

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

ただいまの
回答率

90.32%

  • Apache

    1918questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • nginx

    904questions

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

  • SSL

    528questions

    SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

  • HTTPS

    277questions

    HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

  • proxy

    129questions

    proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

nginxをリバースプロキシサーバにする設定について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 1,777

sekkati

score 16

 前提・実現したいこと

前提:
新人のプログラマです。なぜか常駐先で環境構築をすることになりました。私自身WordpressをVPSにデプロイするような本を少し読んだ程度の知識しかありません。お手柔らかにお願いします!

昨日質問させていただいた内容:nginxをリバースプロキシサーバとして使いたい

参考にさせていただいたサイト:8.1 プロクシー

実現したいこと:
①昨日nginxをリバースプロキシ化したのですがその際にdefault.confのlocation内にproxy_set_headerという文言を見つけました。これらは何のために設定するものなのでしょうか?proxy_redirectもよく解っておらず、ググった結果、「プロクシーサーバの返すレスポンスの "Location", "Refresh" ヘッダをどのように書き換えるべきかを指定します。」ということがとあるサイトに書かれていました。その部分も設定すべきか判別がつきません。

②ここまで環境構築の勉強をしてきて思ったのですが、皆様はこのようなサーバの設定の知識などはどこで勉強しているのでしょうか?

①や②どちらか片方でも良いのでご回答よろしくおねがいします!

 該当のソースコード

【default.conf】

### httpでアクセスしてきた場合はhttpsにリダイレクト
#server {
#    listen 80;
#    server_name localhost;
#    return 301 https://$host$request_uri;
#}

### https設定
server {
    # listen       80;

    ## 追加7/13
    listen       443 ssl;

    server_name  localhost;

    ## 追加7/13
    ssl_certificate /etc/nginx/localhost.crt;
    ssl_certificate_key /etc/nginx/localhost.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    ## コメントアウト7/18
    #location / {
    #    root   /usr/share/nginx/html;
    #    index  index.html index.htm;
    #}

    ## 追加7/18
    location / {
        proxy_pass http://192.168.100.110:8090;
#        proxy_redirect                         off;
#        proxy_set_header Host                  $host;
#        proxy_set_header X-Real-IP             $remote_addr;
#        proxy_set_header X-Forwarded-Host      $host;
#        proxy_set_header X-Forwarded-Server    $host;
#        proxy_set_header X-Forwarded-For       $proxy_add_x_forwarded_for;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

 補足情報(FW/ツールのバージョンなど)

フレームワーク:MVVMフレームワーク(フレームワークもどきと呼ばれてました)

$ cat /etc/redhat-release
CentOS release 6.10 (Final)

$ nginx -v
nginx version: nginx/1.14.0

$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Jun 19 2018 15:45:13

$ php -v
PHP 5.6.13 (cli) (built: Sep  3 2015 14:19:17)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

$ php-fpm -v
PHP 5.6.36 (fpm-fcgi) (built: Apr 25 2018 10:12:10)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

①昨日nginxをリバースプロキシ化したのですがその際にdefault.confのlocation内にproxy_set_headerという文言を見つけました。これらは何のために設定するものなのでしょうか?

バックエンド(設定例では 192.168.100.110:8090)がそのヘッダを必要としているからだと思います。

例えば、proxy_set_header Host $host; 設定がないと、Nginx からバックエンドへのリクエストは「Host: 192.168.100.110:8090」となります。
バックエンドが Host ヘッダによらず正しく処理できるのであればいいのですが、「Host: www.example.com」(リバースプロキシーのURL のホスト名)じゃないとうまく処理できないのであれば、それに合わせて Nginx で Host ヘッダを付け替える必要があります。

proxy_redirectもよく解っておらず、ググった結果、「プロクシーサーバの返すレスポンスの "Location", "Refresh" ヘッダをどのように書き換えるべきかを指定します。」ということがとあるサイトに書かれていました。その部分も設定すべきか判別がつきません。 

バックエンドが 301 や 302 でリダイレクトを返す場合、「Location: http://192.168.100.110:8090/〜」を応答するかもしれません。
Nginx がそのままブラウザに返しても、ブラウザからは 192.168.100.110:8090 にアクセスできませんので、proxy_redirect で変換する必要があります。
逆に、バックエンドが Host ヘッダなどを見て「Location: https://www.example.com/〜」を返すのであれば、変換は不要です。

バックエンドがどう処理するかによりますので、環境により設定は異なります。
実際に試してみて、うまくいかなければリクエスト、レスポンスのヘッダを確認して調整するということになると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/20 11:23 編集

    TaichiYanagiya 様 ご回答ありがとうございます。

    すみません知識が乏しく、半分も理解できていないというところが正直なところです。

    # proxy_redirect off;
    # proxy_set_header Host $host;
    # proxy_set_header X-Real-IP $remote_addr;
    # proxy_set_header X-Forwarded-Host $host;
    # proxy_set_header X-Forwarded-Server $host;
    # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


    を設定をした場合、しなかった場合でそれぞれchromeのディベロッパツールでリクエストヘッダレスポンスヘッダを確認したのですが、特に差があるようには思えませんでした。ということは、ご指摘いただいた「バックエンドが Host ヘッダによらず正しく処理できる」ということになるのでしょうか?

    またこのテストをするにあたって、default.confを再読み込みを実行したくなりました。

    nginx -s reload
    service nginx reload
    service nginx restart

    解らなかった為それぞれ実行しました。このようなconfの読み直しは上記のどのコマンドを実行すればよいのでしょうか?

    キャンセル

  • 2018/07/20 11:32 編集

    今まで[クライアント]→[Apache] はIPアドレスでアクセスし、ポート番号で画面が分かれていました。
    それを[クライアント]→[Nginx]→[Apache] と設定したという認識です。

    その際、Nginx-Apache間でクライアントから送られているヘッダー情報が、Nginxのヘッダー情報で上書きされてしまうのを防いでいる。という認識でよろしいでしょうか?

    キャンセル

  • 2018/07/20 12:12

    > chromeのディベロッパツールでリクエストヘッダレスポンスヘッダを確認したのですが

    Nginx - バックエンド間のヘッダを確認しないと。
    設定再読み込みはどれでもいいと思います。

    > その際、Nginx-Apache間でクライアントから送られているヘッダー情報が、Nginxのヘッダー情報で上書きされてしまうのを防いでいる。という認識でよろしいでしょうか?

    proxy_set_header で「防いでいる」のか、逆に「邪魔している」かはバックエンドによります。
    バックエンドが所望の動作をするように、リクエストヘッダを調整するということです。

    キャンセル

  • 2018/07/20 12:38 編集

    TaichiYanagiya 様 再度ご回答ありがとうございます!!

    >バックエンドが所望の動作をするように、リクエストヘッダを調整するということ。

    つまり、自分の環境でいう[nginx]-[apache]間のリクエストヘッダを調整しているという感じでよろしいでしょうか?自分がクロームで見たリクエストヘッダ情報は[クライアント]-[nginx]間ということでしょうか?もしそうであれば、サーバ間のリクエストヘッダの確認方法がわかりません。

    そこでもう一点疑問が沸いてしまったのですが、Apacheはこの受け取ったリクエストヘッダで何か処理分けができるものなのでしょうか?(例えばhost部分が○○なら、弾くなど)

    キャンセル

  • 2018/07/20 13:23

    > サーバ間のリクエストヘッダの確認方法がわかりません。

    tcpdump, wireshark などでパケットキャプチャするとか、Apache httpd の mod_dumpio でログに出すとか。
    Nginx でもログに出力できると思います。

    > Apacheはこの受け取ったリクエストヘッダで何か処理分けができるものなのでしょうか?

    Host ヘッダについては、VirtualHost を分けるとか、Webアプリケーション側でホスト名、ドメイン名で制限しているとか、リダイレクトの URL を組み立てるのに用いるとか、いろいろあると思います。
    接続元(クライアントの)IPアドレスをどのヘッダに載せるのか、Nginx とバックエンドで取り決めて、アクセス制限するとか、ログに記録するとか。

    キャンセル

  • 2018/07/20 14:19

    TaichiYanagiya 様 ご回答ありがとうございます。

    ご丁寧に教えていただきありがとうございます。
    パケットキャプチャ周辺の知識も調べてみたいと思います!

    キャンセル

+1

多分、難しく考えすぎていると思います。

リーバスプロキシーを入れると、バックエンドのサーバには
ブラウザから直接アクセスした時とは違った情報(ヘッダー)が伝わる場合があります。

例えば、アクセス元のアドレス(REMOTE_ADDR)ですが常にリバースプロキシーのアドレスになります。
ところが、バックエンド側では、アクセス元に応じて、処理を変える(アクセス制限など)場合があります。
そのために。
proxy_set_header X-Real-IP $remote_addr;
で、リバースプロキシーへのアクセス元のアドレスを、バックエンドに渡します。
また。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
は、多段プロキシーでアクセスされた場合に、経路がわかる様にプロキシーサーバのアドレスをどんどん追加します。(なので add)

また、プロキシーサーバには、www.example.comでアクセスして
バックエンド側の設定では、www.exmaple.jpで設定されてる様な場合

proxy_set_header Host $host;
ではなく

proxy_set_header Host www.exmaple.jp;
みたいに強制的にセットすることもあります。

また、HTTPSをプロキシーサーバで受けて、バックエンドにはHTTPでアクセスすることが多いと思います。
この時、バックエンド側で、HTTPSにリダイレクトするみたいな処理をしてると、無限のリダイレクトループになります。
そこで、

HTTPSのエントリーで
proxy_set_header    X-Forwarded-Proto https;
としてバックエンドに渡して
バックエンド側で
if(isset($_SERVER["HTTP_X_FORWARDED_PROTO"])&& $_SERVER["HTTP_X_FORWARDED_PROTO"]=="https"){
$_SERVER['HTTPS'] = "on";
}

みたいにして、バックエンドを騙します。
proxy_set_header   https on;
とすれば良さそうですが、バックエンドが自分でセットするのでダメです。

そのほか必要に応じて、バックエンドに渡すのが、
proxy_set_headerです、なので、ブラウザ側から観ても何も変わらないのです。

バックエンドに対してどう伝わってるかは、phpであれば、phpinfoでわかります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/23 09:01

    asakawaya様 ご回答ありがとうございます。
    まだサーバ構築関係の知識は浅いので、わかりやすい解説大変たすかります。
    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Apache

    1918questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • nginx

    904questions

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

  • SSL

    528questions

    SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

  • HTTPS

    277questions

    HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

  • proxy

    129questions

    proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。