nginx その3 -リバースプロキシを作る-
どうも、今回もnginxのお話です。
今回は、リバースプロキシを作りたいと思いますのでやっていこうと思います。
プロキシとは
プロキシサーバはご存知でしょうか?会社や学校などからインターネットにアクセスするときにブラウザにこれ設定してね?と言われるやつです。設定しないとインターネット見れないやつです。
クライアントやサーバを直接インターネットに接続せずに、インターネットとの通信はプロキシサーバが中継することで、セキュリティやアクセスの効率化を図るためのものです。
フォワードプロキシ | クライアントからのアクセスをインターネットに中継する役割 |
リバースプロキシ | インターネットからのアクセスをWebサイトに中継する役割 |
フォワードプロキシとは
フォワードプロキシの役割としては主に2つあります。
1つ目はセキュリティの確保です。クライアントが直接インターネットにアクセスすると、好き放題にアクセスできてしまいます。
Webサイトの中には悪意のあるサイトでウィルス感染させたり、詐欺サイトなどもあるかと思います。また、危険なサイトではなくとも、好ましくないサイト。例えば会社で業務中にゲームサイト、ギャンブルサイトやエッチな動画サイトなど業務に全く関係ないサイトを見られたら困りますよね?
そういったサイトにアクセスさせないようにブロックする機能をもたせることができます。
2つ目はキャッシュ機能(アクセスの効率化)です。企業や学校において、みんなが同サイトにアクセスしたときに通信量が多くなりますが、プロキシサーバは前にアクセスした情報(キャッシュ)を持っていて同じサイトにアクセスしたときには、わざわざそのWebサイトにアクセスしてWebコンテンツを取ってくるのではなく、プロキシサーバが保持しているキャッシュをクライアントに送り返すことでアクセス速度が早くなったり、インターネットへの通信するデータ量を減らすことができます。
リバースプロキシとは
リバースプロキシとはクライアントのブラウザとWebサーバまたは、アプリケーションサーバの間で通信を中継してくれるサーバであることには変わりないのですが、役割がちょっと違います。
フォワードプロキシとは、クライアントからのアクセスを代理してインターネットに直接出さないものでしたが、リバースプロキシは、Webサイトにおいて、Webサーバやアプリケーションサーバを直接インターネットからアクセスさせずに、リバースプロキシだけをインターネットからのアクセスを受け付けるものです。
フォワードプロキシ同様にセキュリティやアクセスの効率化を目的として設置します。
リバースプロキシでは、セキュリティやキャッシ機能に合わせて、SSL処理(HTTPSの暗号化通信をHTTPに復号化する処理)、負荷分散(複数のWebサーバに通信を振り分ける)の役割をもたせることもあります。
アクセスの多いWebサイトにおいては一つのWebサーバですべてを行おうとするとサーバの負荷が大きくなってしまい、結果として応答速度が悪くなってしまうことを避ける目的があります。
リバースプロキシを作る
今回はnginxでリバースプロキシを作りたいと思います。
リバースプロキシ自体はapache、squidといった他のソフトウェアでももちろん作ることができます。
今回はお手軽に、1台のサーバ内でリバースプロキシとWebサーバを作って見ようと思います。
イメージ画像のように、1台のサーバ上にnginxでリバースプロキシを作り、Webサーバはお試し環境なので、PythonのWebフレームワークのdjangoのデフォルトページを表示するように作ってみましょう。
djangoの本番環境ではこんな構成はとらず、「uwsgi」を使うと思いますが、今回は動作確認用なのでお手軽に開発用のdjangoの簡易Webサーバを使います。
流れとしては、クライアントからリバースプロキシ(http://localhost)にアクセスします。
nginxはクライアントから受け付けたHTTPリクエストをWebサーバであるdjangoに中継します。
djangoはnginxからのHTTPリクエストに対して、デフォルトのTOPページをHTTPのレスポンスとして返します。
nginxはdjangoから受け取ったデフォルトのTOPページのHTTPレスポンスをクライアントに返します。
Webサーバを作る
リバースプロキシ自体は、中継が役割なので、Webコンテンツを持っていなです。
なので、まずは動作確認用のWebコンテンツを表示するWebサーバを作ります。
Webページさえ表示できればよいので、何でも良いのですが今回はdjangoで作ってみました。
# django用のディレクトリを作る
$ mkdir testweb
$ cd testweb
# djangoで開発プロジェクトを作る
$ django-admin startproject web01
# djangoの開発プロジェクトの初期ファイルができたことを確認する
$ cd web01/
$ ll
total 16
drwxrwxr-x 3 vagrant vagrant 4096 Mar 20 04:03 ./
drwxrwxr-x 3 vagrant vagrant 4096 Mar 20 04:03 ../
-rwxr-xr-x 1 vagrant vagrant 661 Mar 20 04:03 manage.py*
drwxrwxr-x 2 vagrant vagrant 4096 Mar 20 04:03 web01/
# 開発用の簡易Webサーバを起動する
$ python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
March 20, 2022 - 04:04:00
Django version 4.0.3, using settings 'web01.settings'
Starting development server at http://127.0.0.1:8000/ #←簡易WebサーバへのアクセスUTL
Quit the server with CONTROL-C.
それでは、djangoの簡易Webサーバに「http://localhost:8000」でアクセスしてみましょう。
無事djangoのTOP画面が表示できました。
ちなみにdjangoの簡易Webサーバは初期設定では自分のPC(localhost)でしかアクセスできません。
リバースプロキシを作る
まずはキャッシュ機能などの個別設定はすべて標準のまま、単純にクライアントから受けた受けたリクエストを簡易Webサーバに中継するだけの仕組みを作ってみます。
# nginxのファイルの保存フォルダに移動
$ cd /etc/nginx/sites-available
$ ll
total 20
drwxr-xr-x 2 root root 4096 Mar 19 06:21 ./
drwxr-xr-x 8 root root 4096 Mar 6 07:41 ../
-rw-r--r-- 1 root root 2416 Mar 26 2020 default
-rw-r--r-- 1 root root 171 Mar 19 06:21 rvproxy
-rw-r--r-- 1 root root 403 Mar 13 04:17 tick
# リバースプロキシ用の設定ファイルの内容
$ cat rvorixy
server {
listen 80;
location / {
# djangoの簡易Webサーバにリクエストを中継する
proxy_pass http://localhost:8000/;
}
}
それでは、nginxを動かしてみましょう。上で作ったrvproxyファイルを「sites-enable」ディレクトリにシンボリックリンクを貼り、起動します。
クライアントから「http://localhost/」にアクセスしてみましょう。無事アクセスできました。
ただ、これだけだと本当にアクセスしているかどうかわかないので、nginxのアクセスログを見てみましょう。
ちょと分かりづらいですが、アクセスした際のHTTPリクエスト情報が出力されていました。
# nginxのログディレクトリに移動
$ cd /var/log/nginx
# nginxのログは現時点では何も個別設定していないので、「access.log」です
$ sudo cat access.log
(抜粋)
"GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 "http://localhost:8090/static/admin/css/fonts.css" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36"
同時にdjangoの簡易Webサーバにも以下のようなHTTPリクエストを受け取ったログがコンソールに表示されました。
[20/Mar/2022 04:35:35] "GET / HTTP/1.0" 200 10697
[20/Mar/2022 04:35:36] "GET /static/admin/css/fonts.css HTTP/1.0" 200 423
Not Found: /favicon.ico
[20/Mar/2022 04:35:36] "GET /favicon.ico HTTP/1.0" 404 2109
[20/Mar/2022 04:35:36] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.0" 200 86184
[20/Mar/2022 04:35:36] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.0" 200 85876
[20/Mar/2022 04:35:36] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.0" 200 85692
とても簡単にあっさりとできてしまいましたまず。
リバースプロキシとして動作することができました。
終わりに
今回はリバースプロキシの基本をまとめてみました。
ただ、これだけの設定だとWebアプリケーションの挙動で問題があることもあると思いますので、
次回は、リバースプロキシの細かい設定をまとめてみたいと思います。
ディスカッション
コメント一覧
まだ、コメントがありません