Nginx でリバースプロキシの検証

仕事で任されてる環境でリバースプロキシがあります。まだ触ってません。いつか触るかもしれません。
なにで構築されているのかは知らないが、Nginx が一般的になってきているらしいので、これで検証します。

## 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/9acb1d9c-bd62-0618-2442-66c2a9adee3b.png)

図の通り、WEB サーバへのインターネットからのHTTP の通信をリバースプロキシが中継する構成を実現します。

## リバースプロキシでの作業
### リバースプロキシにNginx をインストール
最初にNginx のインストールです。
作業のためにパブリックIP を与えているので適当にSSH でつなぎます。ネットワークセキュリティグループの設定をお忘れなく。


```
yum install -y nginx   #いきなりインストールでいけました。
・・・・
systemctl start nginx
```
:::note warn
systemctl start nginx が失敗するときもあった。
エラー文を見て対処すること（出た時の記録を失くした）
```
groupadd nginx
useradd -g nginx nginx
```
でユーザー作成すればうまくいった場合と、
SELinux の無効化でうまくいった場合があった。

:::


### ネットワーク設定
Nginx がリクエストを待ち受けるのは8888 番ポートにします。バックエンドのWEB サーバの80 ポートとわかりやすくしたいので。
しかしNginx のデフォルトのポート番号は80 なので、そちらも空けておきます。
```
# ファイアウォール穴あけ
firewall-cmd --permanent --add-port=8888/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# 確認コマンド
firewall-cmd --list-ports
```
ここまでやってブラウザにリバースプロキシのパブリックIP を入れてやると、こんな風な画面が見えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/44b29758-177c-480d-a13b-240a331cf163.png)
とりあえずNginx のページです。

### Nginx 構成
Nginx の構成は、/etc/nginx/nginx.conf をいじります。主要な箇所だけ挙げます。

```
 upstream backend {
     server 10.0.1.4; # WEBサーバのアドレス
 }
 
 server {
        listen       8888 default_server;
        listen       [::]:8888 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
    	    proxy_pass http://backend;
  	}
```


:::note
* upstream はリダイレクト先を書く。backend という名前のグループをつくりその中にWEB サーバのIP アドレスを記載。後のlocation でbackend を指定する。
* server はリバースプロキシの中身を書く。8888 ポートで待ち受けたいので8888 を書く。
* root にはNginx にアクセスしたときのページファイルが入っている。さっき見たNginx のページ。
:::
:::note

nginx.conf のなかにinclude という記述があるが、nginx.conf 以外のファイルに分けた構成を参照しろという意味。高度な構成をしたい場合向け。別に使わなくてもいい。
:::
いじったあとは、次のコマンドでNginx に構成ファイルを読み込ませます。
```
nginx -s reload
```

さて、新しい構成ファイルを読み込んだNginx にブラウザで同様にアクセスすると失敗するのかなと思ったら、特に問題なく先ほどのページが開きます。
ポートの状態を見ると、80 でNginx が待っている。あれ、逆に8888 では待ち受けてない？？
```
# lsof -i:80
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   27582  root    8u  IPv4  80689      0t0  TCP *:http (LISTEN)
nginx   27582  root    9u  IPv6  80690      0t0  TCP *:http (LISTEN)
nginx   27591 nginx    8u  IPv4  80689      0t0  TCP *:http (LISTEN)
nginx   27591 nginx    9u  IPv6  80690      0t0  TCP *:http (LISTEN)
nginx   27591 nginx   17u  IPv4  85387      0t0  TCP revproxy.internal.cloudapp.net:http->softbank126063254171.bbtec.net:51498 (ESTABLISHED)
nginx   27591 nginx   18u  IPv4  85388      0t0  TCP revproxy.internal.cloudapp.net:http->softbank126063254171.bbtec.net:51499 (ESTABLISHED)


#lsof -i:8888
#
```
サービスの再起動をしないといけないかと思ってsystemctl restart したら、SELinux がうんたらかんたらで失敗したので、無効化してから再起動すると8888 番で立ち上がりました。
```
[root@RevProxy testuser]# lsof -i:8888
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1912  root    8u  IPv4  34581      0t0  TCP *:ddi-tcp-1 (LISTEN)
nginx   1912  root    9u  IPv6  34582      0t0  TCP *:ddi-tcp-1 (LISTEN)
nginx   1913 nginx    8u  IPv4  34581      0t0  TCP *:ddi-tcp-1 (LISTEN)
nginx   1913 nginx    9u  IPv6  34582      0t0  TCP *:ddi-tcp-1 (LISTEN)
[root@RevProxy testuser]#
```
そこからブラウザで"リバースプロキシのパブリックIP:8888" でアクセスするとエラーページが見えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/e5ef9fde-ee37-5bd2-ca46-d35e0f29dadd.png)
リダイレクトの設定を入れたのにリダイレクト先でWEBサーバは待ってないし、そもそも通信できるようにしていないです。

## WEB サーバでの作業
### firewall 穴あけ
WEB サーバは80 番ポートを空けて待ち受けます。
```
firewall-cmd --add-port=80/tcp
```
なんでもいいので何かしらの方法でweb サーバを立てます。
```
mkdir /var/www/html/
cd /var/www/html/
vi index.html
```
でhtml ファイルを作成します。

:::note
自分用
mkdir しないとsudo vi しようがCant open file for writing エラーが出て作成できない
:::

続いて次のコマンドでWEB サーバを立ち上げます。
```
[root@Backend html]# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
```
## リバースプロキシの作業
リバースプロキシからWEB サーバへの通信ができているかを確認します。
```
[testuser@RevProxy ~]$ curl http://10.0.1.4
<h2>Hello,World</h2>
<body>This is a test page.</body>
</html>
[testuser@RevProxy ~]$

```
これで先ほど作成したhtml ファイルが返っているので、リバースプロキシとWEB サーバ間の通信は大丈夫です。
もう一度ブラウザで、リバースプロキシのパブリックIP:8888 をたたいてみるとどうでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617557/ce1a5286-980f-c806-c416-7ea7386b0632.png)
はい、これでリバースプロキシへのリクエストがリダイレクトされてWEB サーバに行きました。