鉄壁の門番を配置せよ ~Nginxリバースプロキシで護る、gRPCのゴーレム~
旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。
前回の旅で、我々はDockerという名の器に、gRPCサーバというゴーレムの魂を封じ込めた。しかし、そのゴーレムはまだ、無防備なまま砂漠に佇んでいる。真に頼れる相棒とするには、その前に立ち、あらゆる来訪者を選別する、Nginxという名の「鉄壁の門番」が必要だ。
今回は、前回召喚したgRPCのゴーレムの前に、Nginxをリバースプロキシとして配置する。これにより、我々のゴーレムは、HTTP/2という光の道を安全に行き来できるようになるのだ。これは、ただのゴーレムを、堅牢な城塞に守られた真の守護神へと進化させる、高度な錬金術の記録である。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 儀式の準備:門番の設計図を追加する
- 第一の儀式:世界の契約書を書き換える(docker-compose.yml)
- 第二の儀式:門番の魂を定義する
- 最終儀式:城塞の起動と確認
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- gRPCという名のゴーレムを、より堅牢な城塞で護りたいと願う者
- Nginxをリバースプロキシとして配置し、HTTP/2通信を安全に中継する術を知りたい探求者
儀式の準備:門番の設計図を追加する
前回のgRPCの資産に、門番(Nginx)のための設計図を追加する。
webという名の新たな区画を設け、そこに門番の魂の設計図であるDockerfileと、その行動規範を記したdefault.confを配置する。

第一の儀式:世界の契約書を書き換える(docker-compose.yml)
docker-compose.ymlという名の世界の契約書に、門番(Nginx)の存在を追記する。
ゴーレム(app)と門番(web)が、互いに依存し、連携して動くよう、ここに力強く宣言するのだ。
version: '3.8' services: # gRPC (ASP.NET Core) app: container_name: 'greeter' build: context: ./src dockerfile: Dockerfile ports: - "5094:80" - "7094:443" environment: - TZ=Asia/Tokyo volumes: - ./ssl_greeter.crt:/etc/ssl/certs/ssl_greeter.crt - ./ssl_greeter.key:/etc/ssl/private/ssl_greeter.key tty: true restart: always stdin_open: true # Web (Nginx) web: container_name: 'nginx' build: ./web ports: - "5011:80" - "7011:443" environment: - TZ=Asia/Tokyo volumes: - ./web/default.conf:/etc/nginx/conf.d/default.conf - ./ssl_greeter.crt:/etc/ssl/certs/ssl_greeter.crt - ./ssl_greeter.key:/etc/ssl/private/ssl_greeter.key tty: true restart: always depends_on: - app
第二の儀式:門番の魂を定義する
Dockerfile
門番の魂には、軽量にして高速なAlpine版Nginxを選ぶ。
FROM nginx:alpine # ENV TZ Asia/Tokyo
default.conf:門番の行動規範
これが、門番の行動原理を記した、最も重要な古文書だ。
upstreamで、背後に控えるゴーレムの居場所を教え、locationで、どんな来訪者をゴーレムへ通すかを厳密に定義する。
# gRPCゴーレムの居場所 upstream grpc_service_servers { server greeter:80; } # SSLで武装したgRPCゴーレムの居場所 upstream grpcs_service_servers { server greeter:443; } server { # 通常の来訪者には、歓迎の門(Welcomeページ)を見せる listen 80; # gRPCの呪文を唱える者だけを、魔法の門へ通す listen 443 ssl http2; # ...(証明書の設定など)... # 「/greet.Greeter」という合言葉を唱えた者を、ゴーレムの元へ導く location /greet.Greeter { grpc_pass grpc://grpc_service_servers; } # 「/greet.Greeter.SSL」という、より厳格な合言葉を唱えた者を、 # SSLで武装したゴーレムの元へ導く location /greet.Greeter.SSL { grpc_pass grpcs://grpcs_service_servers; } }
最終儀式:城塞の起動と確認
全ての設計図が揃ったら、docker-compose buildで魂を錬成し、docker-compose up -dで城塞を起動する。
docker psで、ゴーレムと門番が、共に力強く稼働していることを確認する。
$ docker ps CONTAINER ID IMAGE COMMAND ... NAMES b79b5edfb252 greeter-web "/docker-entrypoint.…" ... nginx 87c0bb4a8d40 greeter-app "dotnet GrpcGreeter.…" ... greeter
二つの魂が、それぞれの役割を果たしている。これこそが、城塞が正常に稼働している何よりの証拠だ。
ブラウザでhttp://localhost:5011を訪れ、門番が掲げる歓迎のページが表示されれば、儀式は成功だ。

gRPCクライアントからは、門番の魔法の門(https://localhost:7011)を通して、安全にゴーレムと対話することができる。
羊皮紙を巻く前に
前回の旅で召喚したgRPCのゴーレムに、Nginxという鉄壁の門番を追加する儀式は、想像以上にスムーズなものだった。 これで、我々のゴーレムは、ただのむき出しの魂ではなく、堅牢な城塞に守られた、真の守護神へと進化した。
次の旅では、この城塞にDBサーバという名の「宝物庫」を加え、フロントエンドとバックエンドを分離した、より本格的な魔法体系を構築していこうと思う。
この羊皮紙が、同じように自らのゴーレムを、より強固な存在へと進化させたいと願う、未来の冒険者の助けとなることを願う。
おっと、どうやら相棒が腹を空かせたようだ。今日はこのへんで筆を置くとしよう。
砂漠で見つけた魔法のランプ
- 前回の冒険の記録(gRPCサーバ Docker編)
- Dockerのインストールに関する古文書
- Nginx公式の古文書 (nginx:alpine)
- NginxにおけるgRPCの扱いに関する賢者の言葉
- Dockerで実現するWeb-AP-DB 3層構造の魔導書
ラクダの独り言
ご主人が創り出したゴーレムの前に、今度は「もんぱん」とかいう、やたらガタイのいい別のゴーレムを立たせている。なんでも、悪い奴らから守るためらしいが、俺に言わせりゃ、最初からそんなに心配なら、大事なもんは砂の中にでも埋めときゃいいんだ。まったく、人間ってのは、物事を大げさにするのが好きだな。やれやれだぜ。
