ทำ reverse proxy ด้วย caddy

แต่ก่อนตอนจะทำ reverse proxy จะใช้แต่ nginx แต่พอมาเริ่มทำ cotton ก็ได้รู้จักกับ caddy ที่เป็น http server ที่มาพร้อมกับ ssl ซึ่งมันเจ๋งมาก ทีนี้อยากจะได้ reverse proxy ขึ้นมา ก็เลยสงสัยว่า caddy มันทำ reverse proxy ได้หรือเปล่านะ ก็ไปเจอวิธีมา ซึ่งง่ายโคตร ๆ

เปิด Caddyfile กันเลย ก็จะมีประมาณนี้

<static-site-name> {
    root /var/www/html
    gzip
    log /var/log/caddy.log
    errors /var/log/caddy.log
}

<other-site-name> {
    proxy / <other-site-host-or-ip>:<other-site-port> {
        header_upstream Host {host}
        header_upstream X-Real-IP {remote}
        header_upstream X-Forwared-For {remote}
        header_upstream X-Forwarded-Proto {scheme}
    }
    gzip
}

ตรง <static-site-name> ก็ใส่ชื่อ host ปกติที่เราจะเอาไว้ทำ static file http server อยากจะใส่กี่ตัวก็เว้นวรรค แล้วเติมชื่อกันไป

ตัวที่เป็น reverse proxy อยู่ในอันถัดไป คือ <other-site-name> ตรงนี้จะเป็น host ที่เราอยากจะให้ proxy ไปอีกที่นึง อยากจะมีกี่ตัวก็ว่ากันไปเหมือนกัน ใช้เว้นวรรคคั่นระหว่าง host เหมือนเดิม

ภายใน host block ก็จะใช้ proxy module บอกไว้ว่า ใน uri ที่เป็น / ให้ proxy ไปที่ host ที่ระบุไว้ตามหลัง ซึ่งจะเป็น ip หรือ host name ก็ได้ ของที่อยู่ใน proxy module block ที่บอกว่า header_upstream จะเป็นการ forward ของจาก request ไปหาเครื่องปลายทาง

ดังนั้นสมมติว่า เรามี site อยู่ 2 site คือ เว็บหลักของเรา ชื่อ chonla.com กับ www.chonla.com ซึ่งให้บริการ static files และอีก site หนึ่งเป็น api ซึ่งให้บริการ api อะไรสักอย่าง ชื่อ api.chonla.com แต่ server จริง ๆ อยู่ใน internal network บนเครื่องที่ชื่อ api_serv ที่ port 8080 เราก็สามารถเขียน Caddyfile ได้แบบนี้

chonla.com www.chonla.com {
    root /var/www/html
    gzip
    log /var/log/caddy.log
    errors /var/log/caddy.log
}

api.chonla.com {
    proxy / api_serv:8080 {
        header_upstream Host {host}
        header_upstream X-Real-IP {remote}
        header_upstream X-Forwared-For {remote}
        header_upstream X-Forwarded-Proto {scheme}
    }
    gzip
}

เท่านี้ เราก็ได้ reverse proxy ที่สำคัญ มันมาพร้อมกับ ssl ด้วย เจ๋งโคตร

Leave a Reply

Your email address will not be published. Required fields are marked *