Nginxをリバースプロキシとして使ってみた

## はじめに
以下の記事を参考に試してみた結果の備忘録です。
https://qiita.com/OPySPGcLYpJE0Tc/items/1f4219a51980a75696b5

## リバースプロキシサーバーの構築
### centos7のdockerコンテナを用意

```
$ docker run -it -d --privileged --name nginx_reverse_proxy centos:centos7 /sbin/init
```

### コンテナにnginxをインストール
コンテナにログイン

```
$ docker exec -it nginx_reverse_proxy /bin/bash
```

nginxをインストール

```
# vi /etc/yum.repos.d/nginx.repo
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

# yum -y install nginx
```

nginxを起動する

```
# systemctl start nginx

# systemctl status nginx
    ● nginx.service - nginx - high performance web server
    Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
    Active: active (running) since Wed 2021-05-12 14:33:11 UTC; 7s ago
        Docs: http://nginx.org/en/docs/
    Process: 168 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
    Main PID: 169 (nginx)
    CGroup: /docker/ef5c700de13cd3382f585be627278ab4d2bf5263b9867a2d9a3d5e431247512b/system.slice/nginx.service
            ├─169 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx...
            ├─170 nginx: worker process
            └─171 nginx: worker process
            ‣ 169 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx...

    May 12 14:33:11 ef5c700de13c systemd[1]: Starting nginx - high performanc....
    May 12 14:33:11 ef5c700de13c systemd[1]: Started nginx - high performance....
    Hint: Some lines were ellipsized, use -l to show in full.

# curl localhost:80
// nginxのデフォルトのhtmlテンプレートが表示される。省略。
```

### nginxをリバースプロキシとして設定
リバースプロキシとしての設定ファイルを以下のように追加。
※なお最初の3行でキャッシュ機能を有効化させている点も注意すること。

```
# hostname -i
    172.17.0.2

# vi /etc/nginx/conf.d/backend.conf
    proxy_cache_path /var/cache/nginx/rproxy keys_zone=zone1:1m max_size=1g inactive=24h;
    proxy_temp_path /var/cache/nginx_tmp;
    proxy_ignore_headers Cache-Control;

    server {
        listen 80;
        server_name 172.17.0.2;
        location / {
            proxy_pass http://172.17.0.3:8080;
            proxy_cache zone1;
            proxy_cache_valid 200 302 600s;
            add_header X-Nginx-Cache $upstream_cache_status;
        }
    }
```

nginxを再起動

```
# systemctl restart nginx
```

## webサーバーの構築
### centos7のdockerコンテナを用意

```
$ docker run -it -d --privileged --name httpd_server centos:centos7 /sbin/init
```

### コンテナにhttpdをインストール
dockerコンテナログイン

```
$ docker exec -it httpd_server /bin/bash
```

httpdをインストール

```
# yum -y install httpd
```

### httpdをwebサーバとして設定
8080番ポートに設定。（リバースプロキシnginxのコンテナからアクセスされるようにするため）

```
# vi /etc/httpd/conf/httpd.conf
    Listen 8080
```

httpd起動

```
# systemctl start httpd

# systemctl status httpd
```

lsofコマンドで確認

```
# yum -y install lsof

# lsof -i:8080
    COMMAND PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    httpd   171   root    3u  IPv4 697190      0t0  TCP *:webcache (LISTEN)
    httpd   172 apache    3u  IPv4 697190      0t0  TCP *:webcache (LISTEN)
    httpd   173 apache    3u  IPv4 697190      0t0  TCP *:webcache (LISTEN)
    httpd   174 apache    3u  IPv4 697190      0t0  TCP *:webcache (LISTEN)
    httpd   175 apache    3u  IPv4 697190      0t0  TCP *:webcache (LISTEN)
    httpd   176 apache    3u  IPv4 697190      0t0  TCP *:webcache (LISTEN)
```

webページを配置

```
# echo "hoge" > /var/www/html/index.html

# curl localhost:8080
    hoge
```


## 動作検証
### キャッシュ確認
リバースプロキシへアクセスする前に、nginxの設定ファイルで記述したキャッシュ先ファイルを確認しておく。
空である。

```
# ls /var/cache/nginx/rproxy/
```

### リバースプロキシへアクセス
リバースプロキシへアクセスしてみる。

```
# curl 172.17.0.2:80
    hoge
```

### キャッシュ確認

```
# ls /var/cache/nginx/rproxy/
    bea87927112d3594daed0e660e1256e4
```

```
# cat /var/cache/nginx/rproxy/bea87927112d3594daed0e660e1256e4
    m�`~�`�`pA)np"5-5c223261fc200"
    KEY: http://172.17.0.3:8080/
    HTTP/1.1 200 OK
    Date: Wed, 12 May 2021 14:54:13 GMT
    Server: Apache/2.4.6 (CentOS)
    Last-Modified: Wed, 12 May 2021 14:51:42 GMT
    ETag: "5-5c223261fc200"
    Accept-Ranges: bytes
    Content-Length: 5
    Connection: close
    Content-Type: text/html; charset=UTF-8

    hoge
```

### アクセスログも確認
webサーバー側（httpd入れた側）のログを確認する。
最初にlocalhostでアクセスしたログと、リバースプロキシを介してアクセスしたログの2つがある。

```
# tail -f /var/log/httpd/access_log
    127.0.0.1 - - [12/May/2021:14:52:17 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.29.0"
    172.17.0.2 - - [12/May/2021:14:54:13 +0000] "GET / HTTP/1.0" 200 5 "-" "curl/7.29.0"
```

### キャッシュが使われていることを確認する
上記のtailコマンド実行した状態で、以下のように2度、3度とリバースプロキシにアクセスしてみる。

```
# curl 172.17.0.2:80
    hoge

# curl 172.17.0.2:80
    hoge
```

上記のようにアクセスしても、tailコマンドの反応はない。
つまり、webサーバーにアクセスされていない。
要するにキャッシュが使われていることが考えられる。

確認のためリバースプロキシ側（nginx）のログをみる。
以下のように4つログがあるので、リバースプロキシへはアクセスは行っている。

```
# cat /var/log/nginx/access.log 
127.0.0.1 - - [12/May/2021:14:35:54 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
172.17.0.2 - - [12/May/2021:14:54:13 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.29.0" "-"
172.17.0.2 - - [12/May/2021:15:00:57 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.29.0" "-"
172.17.0.2 - - [12/May/2021:15:00:58 +0000] "GET / HTTP/1.1" 200 5 "-" "curl/7.29.0" "-"
```

以上から、2回目、3回目のリバースプロキシへのアクセスは、リバースプロキシへは届いているが、webサーバーへはアクセスされていないため、リバースプロキシ内のキャッシュが使われているはずであることがわかる。