danjo0193
@danjo0193

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

nginx.confの記述について。バックエンドのWebサーバーがダウンしている場合

解決したいこと

Dockerで複数のウェブサーバーコンテナを実行しています。
Nginxコンテナをリバースプロキシとして運用し、いろいろなドメイン、サブドメイン、サブディレクトリでのアクセスに対し各サイトへルーティングする仕組みを作りたいです。
nginx.confのlocationブロックは以下の表記です。site_14はサービス名・コンテナ名です。

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass "http://site_14:80";
        }

site_14コンテナが正常に起動している場合はこの設定で正しくルーティングされています。
しかし、運用上すべてのウェブサーバーコンテナが起動しているとは限らない想定です。
一部は停止していることがある場合、nginx全体が起動に失敗します。
上記の場合、site_14コンテナが停止している場合、
nginxの新規起動や、nginx -s reloadコマンドなどが失敗します。

自分で試したこと

バックエンドのウェブサーバーが一部ダウンしていても有効なnginx.confの書き方を模索しました。
以下のように、変数を使って間接的に指定することで、起動時ではなくリクエスト時にバックエンドの解決を試みるとの情報を得て上手く行きました。

        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;

            set $upstream_site14 "http://site_14:80";
            proxy_pass $upstream_site14;
        }

ここからが問題です。

サブディレクトリの場合の問題

サブディレクトリにルーティングしたいサイトの場合に上手く行きません。

        location /subdir1 {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            set $upstream_site21 "http://site_21:80";
            proxy_pass $upstream_site21;
        }

ブラウザからアクセスするとNot Foundになります。
どのように修正するのが正しいか、知恵をお貸し下さい。

0

2Answer

upstream nginx で他のサンプルも確認して下さい.hash等のモードが選択できますよ

upstream subdir1 {
....
}
upstream websv {
    least_conn;
    server 10.20.30.1:1000 weight=1;
    server 10.20.30.2:1000 weight=100;
    server 10.20.30.3:1000 backup;
}
server {
  ....
 location ~/subdir1.* {
     proxy_pass http://subdir1;
  }
  location ~/.* {
     proxy_pass http://websv;
  }
}

サブディレクトリにルーティングしたいサイトの場合に上手く行きません。

コンテナのwebアプリもサブディレクトリ付きのURLでなくてはいけませんよ。

0Like

Comments

  1. @danjo0193

    Questioner

    ありがとうございます。
    nginx.confの設定項目、まだまだ私には知らない部分が多かったです。
    もっと勉強してみます。

  2. こちら補足になりますが、確かにhttp://example.com/subdir1/には接続できますが、/xxx/subdir1//subdir1xxx/、そして/subdir1にもヒットしますからlocationで正規表現を利用される場合はご注意ください。

サブディレクトリにルーティングしたいサイトの場合に上手く行きません。

サブディレクトリをlocationで表現したいのであれば

location /subdir1/ {
	#...
}

と、最後に句切り文字の/を足します。
あなたが問題として提示してきた設定ファイルの内容に当てはめるとhttp://example.com/subdir1というアドレスとなり、サブディレクトリとしてでは無く、ファイルのような評価をされてしまいNot Foundとなるのは必然です。後ろに/が付く・付かないはとても重要なことです。


既にコチラは指摘がありますので無視して頂いて構いません。リバースプロキシを行う場合はupstreamを活用した方が良いです。理由は様々なのでこちらについてはご自身で探してみてください。

# 省略
upstream site_14 {
	server 相手先IP:ポート;
}

server {
	# 省略
	location / {
		proxy_pass http://site_14;
	}
}

upstreamに名前site_14とつけるとproxy_passの記述は上記の通りに変わることに留意してください。

0Like

Your answer might help someone💌