# 🔀 ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã‚’ãƒ—ãƒ­ã‚­ã‚ˇã™ã‚‹ ãƒĒバãƒŧã‚šãƒ—ãƒ­ã‚­ã‚ˇã¯ã€å¤šããŽäēēが最初ãĢæą‚ã‚ã‚‹æ§‹æˆã§ã™ã€‚å…Ŧ開ã‚ĸドãƒŦ゚が 1 つ、そぎ čƒŒåžŒãĢã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãŽã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šãŒ 1 つäģĨ上、ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗå´ãŽå¤‰æ›´ã¯ 不čĻã€‚ã“ãŽãƒšãƒŧジは、単一ぎã‚ĸムトからヘãƒĢ゚チェック、ã‚ŋイムã‚ĸã‚Ļト、バックã‚ĸップを 備えたプãƒŧãƒĢぞでをįĩ„ãŋįĢ‹ãĻ、反寞側からã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãŒäŊ•ã‚’čĻ‹ã‚‹ã‹ã‚’į¤ēしぞす。 ## 🧾 はじめる前ãĢ - Pingclair が導å…Ĩされ動いãĻいることīŧˆ[ã‚¤ãƒŗã‚šãƒˆãƒŧãƒĢ](/ja/start/install/)īŧ‰ã€‚原験中は ã‚ĩãƒŧビ゚を停æ­ĸしぞす: `sudo pc service stop`。 - ロãƒŧã‚ĢãƒĢポãƒŧãƒˆã§åž…ãĄå—ã‘ãĻいるã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã€‚äž‹ã§ã¯ `127.0.0.1:3000` を äŊŋいぞす。 - ãƒ—ãƒ­ã‚­ã‚ˇč‡ĒčēĢぎポãƒŧト。䞋では `:8080`。 ## 🔀 ã‚ĸムトが 1 つ ```caddyfile { admin 127.0.0.1:2019 } http://:8080 { reverse_proxy 127.0.0.1:3000 } ``` ```bash sudo cp Pingclairfile /etc/Pingclair/Pingclairfile sudo pingclair validate /etc/Pingclair/Pingclairfile sudo kill -USR1 "$(systemctl show -p MainPID --value pingclair)" curl -i http://localhost:8080/ ``` åŋœį­”はã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãŽã‚‚ãŽã§ã€ããŽãƒ˜ãƒƒãƒ€ãƒŧもそぎぞぞ通りぞす。`admin` は `pingclair reload` ãŒåŽŸčĄŒä¸­ãŽã‚ĩãƒŧバãƒŧãĢåąŠãã‚ˆã†ãĢするためで、`SIGUSR1` ãĢは 不čĻã§ã™īŧˆ[再čĒ­ãŋčžŧãŋãŽæ„å‘ŗ](/ja/start/service/#-再čĒ­ãŋčžŧãŋãŽæ„å‘ŗ)īŧ‰ã€‚ ## âš–ī¸ ã‚ĸãƒ ãƒˆãŒč¤‡æ•° `to` ã§ã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šã‚’ä¸Ļãšã€ããŽã‚ã¨åˆ†æ•Ŗæ–šæŗ•ã‚’é¸ãŗãžã™ã€‚ ```caddyfile http://:8080 { reverse_proxy { to 127.0.0.1:3000 to 127.0.0.1:3001 lb_policy round_robin } } ``` į”ŸããĻいる 2 台へぎ 6 ãƒĒクエ゚トはäē¤äē’ãĢãĒりぞす。おぎポãƒŧãƒˆãŒį­”ãˆãŸã‹ã‚’čŋ”す ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã§ãŽåŽŸæ¸Ŧ: ```text 3000 3001 3000 3001 3000 3001 ``` | `lb_policy` | 動äŊœ | | --- | --- | | `round_robin` | 順į•ĒãĢ 1 ãƒĒクエ゚トずつ。æ—ĸ厚値。 | | `random` | ãƒŠãƒŗãƒ€ãƒ ãĒã‚ĸムト。 | | `least_conn` | é€˛čĄŒä¸­ãŽæŽĨįļšãŒæœ€ã‚‚å°‘ãĒいã‚ĸムト。 | | `ip_hash` | 同じクナイã‚ĸãƒŗãƒˆã‚ĸドãƒŦ゚は常ãĢ同じã‚ĸムトへ。 | | `first` | åˆŠį”¨å¯čƒŊãĒ最初ぎã‚ĸムト。 | | `header <名前>`, `cookie <名前>`, `query <名前>` | ããŽãƒ•ã‚ŖãƒŧãƒĢãƒ‰ã§ãƒãƒƒã‚ˇãƒĨし、ã‚ģãƒƒã‚ˇãƒ§ãƒŗã‚’ 1 台ãĢå›ē厚。 | | `weighted_round_robin <重ãŋ> â€Ļ` | åŒã˜čĄŒãĢã‚ĸムトごとぎ重ãŋ。 | 重ãŋはã‚ĸムトごとãĢã‚‚æ›¸ã‘ãžã™ã€‚į†į”ąãŒå°ã”ã¨ãĢé•ã†ã¨ãã¯ã“ãĄã‚‰ãŽãģうがčĒ­ãŋやすく ãĒりぞす。 ```caddyfile http://:8080 { reverse_proxy { to 127.0.0.1:3000 { weight 3 } to 127.0.0.1:3001 } } ``` âš ī¸ `lb_policy weighted_round_robin 3 1` はæ—ĸãĢ書かれたã‚ĸムトを数えるぎで、`to` čĄŒã¯ **先**ãĢįŊŽãåŋ…čĻãŒã‚ã‚Šãžã™ã€‚é€†é †ãĢ書くと `validate` が `2 weights were given for 0 upstreams` で拒åĻしぞす。 `backup` をäģ˜ã‘たã‚ĸムトは、äģ–ぎすずãĻãŒåˆŠį”¨ã§ããĒいときãĢだけäŊŋわれぞす。 ```caddyfile http://:8080 { reverse_proxy { to 127.0.0.1:3000 to 127.0.0.1:3001 { backup } } } ``` ä¸Ąæ–šãŒį”ŸããĻいると、すずãĻぎãƒĒクエ゚トは `3000` へ。そぎプロã‚ģ゚をæ­ĸめると、 æŦĄãŽãƒĒクエ゚トは `3001` がčŋ”しぞす。 ## đŸŠē ヘãƒĢ゚チェック ãƒã‚§ãƒƒã‚¯ãŒį„Ąã„å ´åˆã€ã‚ĸムトはãƒĒã‚¯ã‚¨ã‚šãƒˆãŒå¤ąæ•—ã—ãĻ初めãĻ外れぞす。チェックがあれば 先ãĢ外れぞす。 ```caddyfile http://:8080 { reverse_proxy { to 127.0.0.1:3000 to 127.0.0.1:3001 health_check { path /health interval 2s timeout 1s status 200 consecutive_failure 2 consecutive_success 1 } } } ``` ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãĢã¯åŽ‰äžĄãĢį­”ãˆã‚‹ã‚¨ãƒŗãƒ‰ãƒã‚¤ãƒŗãƒˆãŒåŋ…čĻã§ã™īŧˆã“こでは `/health`īŧ‰ã€‚ įŠļ態ぎ変化はログãĢ掋るぎで、ãĒぜ回čģĸから外れたかが分かりぞす。 ```text INFO pingclair_proxy::health_check: đŸŠē Active upstream health changed backend=Inet(127.0.0.1:3001) healthy=false INFO pingclair_proxy::health_check: đŸŠē Active upstream health changed backend=Inet(127.0.0.1:3001) healthy=true ``` こぎ構成でぎ原æ¸Ŧ: 2 å°į›Žã‚’čŊã¨ã™ã¨å…¨ãƒˆãƒŠãƒ•ã‚Ŗãƒƒã‚¯ãŒ 1 å°į›Žã¸ã€æˆģすと `consecutive_success` 回ぎ成功ぎあとãĢ回čģĸへ垊帰しぞした。原際ぎ Caddyfile が äŊŋã†åšŗåĻãĒįļ´ã‚Šīŧˆ`health_uri`、`health_interval`、`health_timeout`、 `health_status`、`health_fails`、`health_passes`īŧ‰ã‚‚åŒã˜ãƒã‚§ãƒƒã‚¯ã‚’č¨­åŽšã—ãžã™ã€‚ ## âąī¸ ã‚ŋイムã‚ĸã‚Ļト ã‚ŋイムã‚ĸã‚Ļトは `reverse_proxy` ãŽį›´ä¸‹ã§ã¯ãĒく、そぎ中ぎ `transport http` ブロックãĢ įŊŽããžã™ã€‚ ```caddyfile http://:8080 { reverse_proxy { to 127.0.0.1:3099 to 127.0.0.1:3000 transport http { connect_timeout 1s first_byte_timeout 1s read_timeout 30s write_timeout 30s } } } ``` 原æ¸Ŧ: `127.0.0.1:3099` がäŊ•も受けäģ˜ã‘ãĒい場合、`connect_timeout 1s` で 1 į§’ã‚’ č˛ģやし、ãƒĒクエ゚トは 2 å°į›ŽãŽã‚ĸムトãĢ再čŠĻčĄŒã•ã‚ŒãĻ `200` がčŋ”りぞす。æŽĨįļšã ã‘ 受けäģ˜ã‘ãĻæœŦ文を 3 į§’åž…ã¤ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãĢは `first_byte_timeout 1s` が劚き、 クナイã‚ĸãƒŗãƒˆã¯ `504` を受け取りぞす。 `dial_timeout` は `reverse_proxy` ぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã§ã¯ã‚ã‚Šãžã›ã‚“ã€‚ãã“ãĢ書くと `validate` が `Unknown directive 'reverse_proxy: dial_timeout'` で拒åĻしぞす。 `transport http` ぎ中でぎ名前は `connect_timeout` です。 ## 🔁 名前で指厚するã‚ĸムト ã‚ĸムトはã‚ĸドãƒŦ゚ではãĒく名前でも指厚できぞす。新しい IP で再čĩˇå‹•する ã‚ŗãƒŗãƒ†ãƒŠãŒåŋ…čĻã¨ã™ã‚‹åŊĸです。 ```caddyfile { dns_refresh 5s } http://:8080 { reverse_proxy { to api.internal:3000 } } ``` åå‰ã¯ããŽé–“éš”ã§å†č§Ŗæąēされ、変更はログãĢ掋りぞす。 ```text INFO pingclair_proxy::dns: 🔄 Upstream DNS scheduler enabled interval_secs=5 pools=1 INFO pingclair_proxy::dns: 🔄 Upstream DNS refresh changed=1 adopted=0 kept_stale=0 unresolved=0 ``` `/etc/hosts` ã‚’å”¯ä¸€ãŽæƒ…å ąæēã¨ã—たåޟæ¸Ŧ: `api.internal` を `127.0.0.1` ãĢ向けると 1 å°į›ŽãŒåŋœį­”し、`127.0.0.2` ãĢ書き換えると間隔内ãĢ 2 å°į›ŽãŒåŋœį­”しぞした。再čĩˇå‹•ã‚‚ å¤ąæ•—ã—ãŸãƒĒã‚¯ã‚¨ã‚šãƒˆã‚‚ã‚ã‚Šãžã›ã‚“ã€‚č§ŖæąēãĢå¤ąæ•—ã—ãŸå ´åˆã¯å‰ãŽã‚ĸドãƒŦ゚が回čģĸãĢ掋りぞす。 ## 📨 ã‚ĸムトがčĻ‹ã‚‹ã‚‚ãŽ ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗã¯å…ƒãŽ `Host` と、いつもぎヘッダãƒŧãĢå…ĨãŖãŸã‚¯ãƒŠã‚¤ã‚ĸãƒŗãƒˆãŽ ã‚ĸドãƒŦ゚を受け取りぞす。 ```text { "host": "127.0.0.1:8080", "x_forwarded_for": "127.0.0.1", "x_forwarded_proto": "http", "x_real_ip": "127.0.0.1" } ``` åˆĨãŽãƒ—ãƒ­ã‚­ã‚ˇãŽčƒŒåžŒã§ã¯ã€ããŽãƒ—ãƒ­ã‚­ã‚ˇãŒ `trusted_proxies` ãĢåĢぞれãĒい限り、 これらぎヘッダãƒŧぎã‚ĸドãƒŦã‚šã¯ããŽãƒ—ãƒ­ã‚­ã‚ˇãŽã‚‚ãŽã§ã™ īŧˆ[Cloudflare Tunnel ã‚Ŧイド](/ja/guides/cloudflare-tunnel/)īŧ‰ã€‚ ## âš ī¸ うぞくいかãĒいとき - **ãƒ—ãƒ­ã‚­ã‚ˇã‹ã‚‰ãŽ `502`。** おぎã‚ĸムトもåŋœį­”しãĻいぞせん。ã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãŒ åž…ãĄå—ã‘ãĻいるかīŧˆ`sudo ss -ltnp | grep :3000`īŧ‰ã¨ã‚ĸドãƒŦã‚šãŽä¸€č‡´ã‚’įĸēčĒã—ãžã™ã€‚ - **間をįŊŽã„た `504`。** ã‚ŋイムã‚ĸã‚Ļトがį™ēįĢしãĻã„ãžã™ã€‚é…ã„ãƒãƒƒã‚¯ã‚¨ãƒŗãƒ‰ãĒら `first_byte_timeout`、遅いæœŦ文ãĒら `read_timeout`、æąēしãĻ受けäģ˜ã‘ãĒã„į›¸æ‰‹ãĒら `connect_timeout` です。 - **`Unknown directive 'reverse_proxy: â€Ļ'`。** そぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã¯å…Ĩれ子ぎブロックãĢ åąžã—ãžã™īŧˆã‚ŋイムã‚ĸã‚Ļトは `transport http`、チェックは `health_check`īŧ‰ã€‚ `validate` は拒åĻしたįļ´ã‚Šã‚’そぎぞぞį¤ēしぞす。 - **č¨­åŽšå¤‰æ›´ãŒåæ˜ ã•ã‚ŒãĒい。** 再čĒ­ãŋčžŧãŋãŒéŠį”¨ã™ã‚‹ãŽã¯ãƒãƒĒã‚ˇãƒŧで、新しい ãƒĒ゚ナãƒŧではありぞせん。再čĒ­ãŋčžŧãŋがčŋŊ加ぞたはį§ģ動した場合は、ãƒĻニットぎ status line ãŒå¤‰ã‚ãŖãŸã‚ĸドãƒŦ゚をį¤ēし、`sudo pc service restart` がそれを éŠį”¨ã—ãžã™īŧˆ[ã‚ĩãƒŧビ゚としãĻ動かす](/ja/start/service/#-再čĒ­ãŋčžŧãŋãŽæ„å‘ŗ)īŧ‰ã€‚ - **すずãĻぎãƒĒクエ゚トが 1 台ãĢåąŠãã€‚** それが唯一ぎåĨ全ãĒã‚ĸムトです。ヘãƒĢ゚ チェックぎログが、いつäŊ•ãŽį†į”ąã§äģ–が外れたかをį¤ēしぞすīŧˆ`ConnectRefused`、 `failure_statuses` ãĒおīŧ‰ã€‚ ## 🧭 æŦĄãŽæ‰‹é † - [é™įš„ã‚ĩイトを配äŋĄã™ã‚‹](/ja/guides/static-site/): åœ§į¸Žã€ã‚­ãƒŖãƒƒã‚ˇãƒĨã€ã‚ˇãƒŗã‚°ãƒĢ ペãƒŧジã‚ĸプãƒĒã‚ąãƒŧã‚ˇãƒ§ãƒŗãŽãƒ•ã‚ŠãƒŧãƒĢバック。 - [`reverse_proxy`](/ja/reference/directives/#reverse_proxy): ãƒ‡ã‚ŖãƒŦã‚¯ãƒ†ã‚Ŗãƒ–ãŽ ãƒĒãƒ•ã‚ĄãƒŦãƒŗã‚šã€‚ - [ã‚ĩãƒŧビ゚としãĻ動かす](/ja/start/service/): 再čĒ­ãŋčžŧãŋ、再čĩˇå‹•、ログ。