Calm Hill My Random Thoughts

Nginx to Caddy

အလုပ်ထဲမှာဖြစ်ဖြစ် ကိုယ်ပိုင်ဆာဗာမှာပဲဖြစ်ဖြစ် Apache ကနေ Nginx ပြောင်းသုံးတာ နှစ်အတော်ကြာခဲ့ပြီ သုံးရတာလည်း အဆင်ပြေပါတယ် Webserver အနေနဲ့ ဘာမှထူးပြီးတော့ ပြဿနာမရှိပါဘူး။ တလောကမှဖြစ်ချင်တော့ ကိုယ်ပိုင်ဆာဗာလေးမှာ Let’s Encrypt က ပြဿနာစတက်တယ် Cert ကို တိုးလို့မရဘူးလို့ အီးမေးဝင်လာတယ်။ ကိုယ့်ရဲ့ဆာဗာက Run နေတာ နှစ်ပေါင်များစွာဖြစ်နေတော့ Let’s Encrypt က အစောပိုင်း Stable မဖြစ်ခင်ကတည်းက နည်းလမ်းအမျိုးမျိုးနဲ့ Install လုပ်ခဲ့တော့ တချို့ဟာတွေက Binary အနေနဲ့ရှိတယ် တချို့ဟာတွေက pip နဲ့ Install လုပ်ထားတဲ့ Extension တွေလည်းရှိတော့ အကုန်လုံးလုံး တစစီပြန်ပြီးတော့ ဖြုတ်တဲ့ဟာဖြုတ် ပြန်ပြီးရှင်းလင်းရေး အတော်လုပ်ရတယ်။

ရှင်းလင်းပြီးလို့ Let’s Encrypt အတွက် certbot ကို Install ပြန်လုပ်မယ်ဆိုမှ Caddy ကို စိတ်ထဲပေါ်လာတယ်။ Caddy က TLS ကို Native Support လုပ်ပြီးသား ဘာမှထွေထွေထူးထူး လုပ်ပေးစရာမလိုဘူး Cert Request တွေလည်း သူ့ဟာသူသူပဲ တာဝန်ယူသွားလိမ့်မယ်။ ဘယ်လောက်အဆင်ပြေတယ် ပြောပြောပါလေ သာမန်အားဖြင့်အလုပ်ထဲမှာဆိုရင် အသစ်ပြောင်းသုံးဖို့ ချက်ချင်းဆုံးဖြတ်လို့ ရမှာမဟုတ်ပေမယ် ကိုယ်ပိုင်ဆာဗာဖြစ်တာရယ် မဟုတ်လည်းကိုယ့်မှာ Static Site ဖြစ်နေမှပဲဆိုတော့ ဘာမှလည်းထွေထူးမလိုဘူးဆိုတော့ Caddy ကို ပြောင်းသုံးကြည့်လိုက်တယ်။

Installation ကလည်း နည်းလမ်းအမျိုးမျိုးပေးထားတယ် ကိုယ်ကတော့ Ubuntu ဆိုတော့ သူတို့ရဲ့ Repo ကို Configure လုပ်ပြီးတော့ apt နဲ့ပဲ Install လုပ်လိုက်တယ်။ Install လုပ်လိုက်တယ်ဆိုရင် systemd service ထဲလည်း ရောက်သွားပြီးသားဆိုတော့ ဘာမှလည်ထွေထူး လုပ်စရာမလိုပါဘူး။ Config file က /etc/caddy/ အောက်မှာ Caddyfile ဆိုတာရှိတယ် Configure လုပ်ချင်တဲ့ Domain တွေကို အဲဒီအထဲမှာသွားပြီး ပြင်ပေးဖို့လိုလိမ့်မယ်။ ဥပမာအနေနဲ့ Static site ကို Configure လုပ်ပြထားတယ် ဘာမှထွေထူးလုပ်စရာမလိုဘူး non-https ကို https အဖြစ် redirect လည်း သူ့ဟာသူလုပ်တယ် ကိုယ့်ဟာကိုယ် non-www ကို www ဘက်ကို redirect လုပ်ထားတာတခုပဲ ထည့်ထားတာရှိတယ် မလိုချင်လည်း မထည့်နဲ့ပေါ့လေ။

    yourdomain.whatever {
        redir https://www.{host}{uri}
    }

    www.yourdomain.whatever {
        root * /path/to/your/website
        encode zstd gzip
        file_server
        log {
            output file /var/log/caddy/access.log
        }
    }

Config က အင်မတန်ရှင်းပါတယ် encode zstd gzip က Encoding ကို Zstandard and Gzip နဲ့ Compress လုပ်ချင်လို့ ထည့်ထားတာရယ်ပါ အဲဒါမပါလည်း Compress မလုပ်တာပဲရှိမှာ အလုပ်ကလုပ်ပါတယ်။ Caddyfile ကို ပြင်ပြီးပြီဆိုရင် sudo systemctl reload caddy ဆိုရင်အဆင်ပြေပြီ Service log ကို sudo systemctl status caddy နဲ့အချက်ကြည့်လိုက်ရင် TLS certificate တွေ request လုပ်သွားတဲ့ Status တွေမြင်ရလိမ့်မယ်။ အရေးကြီးတာက Service ကို Reload မလုပ်ခင်မှာ DNS Record တွေကို အရင်ဆုံးအနေနဲ့ Point လုပ်ထားဖို့လိုလိမ့်မယ် မဟုတ်ရင်တော့ Certificate request တွေ လုပ်လို့မရပဲနဲ့ ပြဿနာတွေ တက်နေလိမ့်မယ် အဲဒါဆိုလည်း ဘာမှတော့မဖြစ်ပါဘူး Point လုပ်ပြီးတော့ Service ကို Reload ထပ်လုပ်လိုက်ရင် ပြေလည်သွားပါလိမ့်မယ်။

နည်းနည်းပြဿနာတက်တာက HTTP Basic Authentication တွေက Nginx မှာ Password တွေကို Apache ခေတ်ကတည်းက htpasswd နဲ့သုံးလာတာတွေ မပြောင်းလိုက်ရပေမယ့် Caddy မှာတော့ ပြန်ပြီးတော့ Generate လုပ်လိုက်ရတယ်။ သိပ်လည်းခက်ခက်ခဲခဲ မဟုတ်ပါဘူး caddy hash-password နဲ့ Genererate လုပ်ပြီး Configure လုပ်လိုက်ရင်ရပါတယ်။ Caddy မှာ Plugin တွေ အများကြီးတော့ ထည့်လို့ရတယ် htpasswd နဲ့ Hash တွေလည်းသုံးလို့ ရချင်ရနိုင်ပါတယ် ဒါပေမယ့်လည်း လွယ်နေတာကိုပိုပြီး ခက်အောင်မလုပ်တော့ပါဘူး။

    basicauth /your_secure_path/* {
        whatever_username hash_value_from_caddy_hash-password
    }

ကိုယ်ပိုင်ဆာဗာလေးမှာ Static Site ဖြစ်တာရယ် လူလည်းဘယ်လောက်မှ လာမှမဟုတ်တာရယ်နဲ့ သုံးတာဘာမှမဖြစ်ပေမယ့် Caddy ကို အလုပ်ထဲက Production မှာ သုံးမှာလားဆိုရင်တော့ ပြောရခက်သေးတယ် မသေချာသေးပေမယ့် Development Server လိုဟာမှာ အစမ်းသုံးကြည့်ဦးမယ် စိတ်ကူးထားတယ်။

Reference

  1. Install - https://caddyserver.com/docs/install#debian-ubuntu-raspbian
  2. Encoding - https://caddyserver.com/docs/caddyfile/directives/encode
  3. Basic Auth - https://caddyserver.com/docs/v2-upgrade#basicauth