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

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

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

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

Apache

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

nginx

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

SSL

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

proxy

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

Q&A

解決済

2回答

2451閲覧

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

sekkati

総合スコア24

HTTPS

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

Apache

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

nginx

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

SSL

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

proxy

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

0グッド

3クリップ

投稿2018/07/19 01:11

編集2018/07/19 01:19

前提・実現したいこと

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

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

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

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

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

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

該当のソースコード

【default.conf】

nginx

1### httpでアクセスしてきた場合はhttpsにリダイレクト 2#server { 3# listen 80; 4# server_name localhost; 5# return 301 https://$host$request_uri; 6#} 7 8### https設定 9server { 10 # listen 80; 11 12 ## 追加7/13 13 listen 443 ssl; 14 15 server_name localhost; 16 17 ## 追加7/13 18 ssl_certificate /etc/nginx/localhost.crt; 19 ssl_certificate_key /etc/nginx/localhost.key; 20 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 21 ssl_ciphers HIGH:!aNULL:!MD5; 22 23 #charset koi8-r; 24 #access_log /var/log/nginx/host.access.log main; 25 26 ## コメントアウト7/18 27 #location / { 28 # root /usr/share/nginx/html; 29 # index index.html index.htm; 30 #} 31 32 ## 追加7/18 33 location / { 34 proxy_pass http://192.168.100.110:8090; 35# proxy_redirect off; 36# proxy_set_header Host $host; 37# proxy_set_header X-Real-IP $remote_addr; 38# proxy_set_header X-Forwarded-Host $host; 39# proxy_set_header X-Forwarded-Server $host; 40# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 41 } 42 43 #error_page 404 /404.html; 44 45 # redirect server error pages to the static page /50x.html 46 # 47 error_page 500 502 503 504 /50x.html; 48 location = /50x.html { 49 root /usr/share/nginx/html; 50 } 51 52 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 53 # 54 #location ~ .php$ { 55 # proxy_pass http://127.0.0.1; 56 #} 57 58 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 59 # 60 #location ~ .php$ { 61 # root html; 62 # fastcgi_pass 127.0.0.1:9000; 63 # fastcgi_index index.php; 64 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 65 # include fastcgi_params; 66 #} 67 68 # deny access to .htaccess files, if Apache's document root 69 # concurs with nginx's one 70 # 71 #location ~ /.ht { 72 # deny all; 73 #} 74}

補足情報(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

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

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

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

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

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

guest

回答2

0

ベストアンサー

①昨日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 01:16

TaichiYanagiya

総合スコア12173

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

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

sekkati

2018/07/20 02:26 編集

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の読み直しは上記のどのコマンドを実行すればよいのでしょうか?
sekkati

2018/07/20 02:33 編集

今まで[クライアント]→[Apache] はIPアドレスでアクセスし、ポート番号で画面が分かれていました。 それを[クライアント]→[Nginx]→[Apache] と設定したという認識です。 その際、Nginx-Apache間でクライアントから送られているヘッダー情報が、Nginxのヘッダー情報で上書きされてしまうのを防いでいる。という認識でよろしいでしょうか?
TaichiYanagiya

2018/07/20 03:12

> chromeのディベロッパツールでリクエストヘッダレスポンスヘッダを確認したのですが Nginx - バックエンド間のヘッダを確認しないと。 設定再読み込みはどれでもいいと思います。 > その際、Nginx-Apache間でクライアントから送られているヘッダー情報が、Nginxのヘッダー情報で上書きされてしまうのを防いでいる。という認識でよろしいでしょうか? proxy_set_header で「防いでいる」のか、逆に「邪魔している」かはバックエンドによります。 バックエンドが所望の動作をするように、リクエストヘッダを調整するということです。
sekkati

2018/07/20 03:44 編集

TaichiYanagiya 様 再度ご回答ありがとうございます!! >バックエンドが所望の動作をするように、リクエストヘッダを調整するということ。 つまり、自分の環境でいう[nginx]-[apache]間のリクエストヘッダを調整しているという感じでよろしいでしょうか?自分がクロームで見たリクエストヘッダ情報は[クライアント]-[nginx]間ということでしょうか?もしそうであれば、サーバ間のリクエストヘッダの確認方法がわかりません。 そこでもう一点疑問が沸いてしまったのですが、Apacheはこの受け取ったリクエストヘッダで何か処理分けができるものなのでしょうか?(例えばhost部分が○○なら、弾くなど)
TaichiYanagiya

2018/07/20 04:23

> サーバ間のリクエストヘッダの確認方法がわかりません。 tcpdump, wireshark などでパケットキャプチャするとか、Apache httpd の mod_dumpio でログに出すとか。 Nginx でもログに出力できると思います。 > Apacheはこの受け取ったリクエストヘッダで何か処理分けができるものなのでしょうか? Host ヘッダについては、VirtualHost を分けるとか、Webアプリケーション側でホスト名、ドメイン名で制限しているとか、リダイレクトの URL を組み立てるのに用いるとか、いろいろあると思います。 接続元(クライアントの)IPアドレスをどのヘッダに載せるのか、Nginx とバックエンドで取り決めて、アクセス制限するとか、ログに記録するとか。
sekkati

2018/07/20 05:19

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

0

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

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

例えば、アクセス元のアドレス(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/22 05:37

asakawaya

総合スコア45

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

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

sekkati

2018/07/23 00:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問