自動HTTPS搭載!Caddyでサーバー管理が劇的に楽になる方法とは?
引用元:https://news.ycombinator.com/item?id=43070025
Caddyを使うと、開発中にAPIのHTTP2テストがめっちゃ楽になるんだ。多くの開発サーバーはHTTP1しか対応してないから、ローカルホストへの同時接続数が6に制限されちゃう。HTTP2はSSLが必要だけど、Caddyのリバースプロキシを使えば簡単にHTTP2が使えるようになり、ElectricSQLではこれをおすすめしてるよ。長いポーリングを行うAPIに最適だし、Viteの前に置くとリロードも速くなるんだ。
HTTP2は厳密にはSSLが不要なんだけど、ブラウザがサポートしてないから、実質的にはサーバー間や非ブラウザクライアントでしか使えないんだ。HTTP3は完全に暗号化が必要になったけどね。
ローカルでのHTTP2サポートがないのはほんと残念だよね。
HTTP2を平文でサポートしない理由は、サーバーがHTTP/2かHTTP/1.1で応答するのを検出するのが複雑になるからだと思うよ。TLSを使えばALPNがあるから簡単なんだけどね。
最新のブラウザでは簡単にできるけど、実は愚かな中間プロキシがHTTP/2のリクエストをキャッシュしたり、壊したりする可能性があるからなんだ。暗号化があればこの問題はなくなるんだよね。
それはあんまり良い言い訳じゃないな。ブラウザがGopherサーバーに接続するのはgopher://example.comって打てばいいし、HTTP2もhttp2://example.comで良いはずだと思う。理由はさておき、そこの証明書をコピーしてブラウザでHTTP2使ってるよ。自分で作るより1秒早いんだ。
URLでhttp2を使うのは、初期の移行が複雑になるんだよね。リンクをシェアする際に、ユーザーに最適な体験を直接保証できないし、古いリンクも気になるところだね。
おお、これのおかげでさらに1秒節約だわ!
これって、どのブラウザやライブラリが信頼してるの?それともGoのツールチェーンがインストールするのかな?
特に信頼されてる訳じゃなくて、ただの自己署名証明書なんだ。自分の自己署名証明書と何が違うかって、生成するコマンドを考えなくていいだけだよ。
ローカルホストで信頼しちゃうと、リスクがあるよね。みんながキーのコピーを手に入れられちゃうから。
DNS名を作ってローカルホストにリダイレクトする方法もあるよ。無理なら、無料のDNSサービスで正規ドメイン名を取得して証明書もらうのもあり。自分はtraefik.meを使ってて、ローカル開発でHTTP/2が動いてる。
すごく簡単なのは、/etc/hostsを使うこと。127.0.0.1 localhost local.foobar.comってやって、CaddyやNginxでワイルドカードの証明書を使えばOK。
DNS名を登録することで商業的に敏感な情報が漏れないか心配なら、SAN証明書は避けたほうがいいよ。ワイルドカード証明書は安全だし、秘密が漏れない名前を選べば大丈夫。
>SAN証明書は証明書透明性ログのせいで駄目だよ。実際、WebのPKIの証明書はほとんどがSANを持ってる。だし、SANがない証明書は使えないってことが確立されたから、もう古い方法は使えなくなったんだ。全く効果がないから、敏感な情報を隠すのは無駄だよ。
>WebのPKIにはすべてSANが含まれてるのは技術的に正しいけど、普通はSAN証明書とは呼ばないよ。つまり、ワイルドカード証明書だってSAN証明書と考えられるし、内部のDNS管理すれば外部からのリクエストに岩を隠せるってわけさ。
mkcertとlocaldev.meを組み合わせて使ってる。mkcertでCAを生成して証明書をインストール、localdev.meでサブドメインをローカルホストにリダイレクトしてるよ。
それじゃあ、開発環境を世間にさらけ出しちゃうことにならない?それは大丈夫なの?
ローカルアドレスへのDNSは何も晒さないよ。myTopSecretsをlocalhostにマッピングすれば、自分だけが使えるし、他の人が使ったら自分のコンピュータにルーティングされるから大丈夫。
でも、myTopSecretsの存在は外にバレちゃうんだよね。証明書透明性ログも含めて、実験や個人的な開発するのに、今の設定が求めるのがクソだよ。
確かにそうだよね。ブラウザがローカルシステムを開発プラットフォームとして使うのを妨げてる気がする。特にJSのlocalStorage APIがドメイン名が必要なとこが気に入らない。ローカルファーストなウェブアプリが作れなくなるのも問題。これができれば、プラットフォーム特有のアプリが減ると思う。 ちょっと実験したり個人的なことをハックするには、現実的にはReplitを使うのがいいけど、このスレッドは複雑に保つことについて話してるからね。> 2) サブスクリプション的な契約に入る必要がある(Let’s Encrypt)。 でも、自分のmyTopSecretsを世界に見せる必要はないよ。ローカルDNSだけで名前を出せばいいし、ワイルドカード証明書を使えばSAN証明書みたいに外に情報を出さずに済む。あ、名前をmyTopSecretsじゃなくてProjectLooBreakにするのもいいかもね。 ドメインを/etc/hostsに追加すれば、ローカルでテストするのにドメインを買う必要はないと思うけど。それに、外部に何も曝露するわけじゃない。 一応できるかもしれないけど、やるのが怖いかな。証明書も必要だし、ブラウザが信頼してくれない証明書の生成とか、モバイルデバイスでも通用させるのが面倒なんだよね。 DNSの話だけをしてたんだ。自己署名証明書にも問題はあるけど。ローカルのリゾルバでキャッシュの問題には全然ぶつからなかったよ。minicaを使ったことあるけど、ルート証明書の作成が楽になるんだよね。 何でも/etc/hostsに追加できるけど、正しい証明書がないとブラウザはそれを信頼しない。ドメインを持ってるなら便利だけどね。 myTopSecretsは、インターネットに出さずにローカルでリダイレクトすることもできるよ。 このコメントで興味を持ったので調べたんだけど、Viteは証明書を設定すれば自動でHTTP2を使うみたい。Caddyをローカルで使う理由はそれほどないかも。 完全に同意。もし共有設定でgitリポジトリにコミットできる方法が必要なら、Localiasをチェックしてみて。これを使えば同じwifiネットワーク内のデバイスから開発サーバーにもアクセスできるから、モバイルテストにも便利だよ。 これはローカルホストでしか使えないってことだよね?DNSサーバーをセットアップしたり、ルート証明書をインストールしたりするような複雑なスキルなしで、社内ネットワーク向けに暗号化されたトラフィックを実現する方法を探してるんだ。お客さんにウェブサーバーを社内で運用してもらいたいから、サーバーが本物かどうかを確認する必要はないんだけど。 サーバーのアイデンティティを確認しないと、暗号化なんて意味ないよ。 Localiasは君の使い方には合ってないし、問題は解決できないよ、ゴメン。 その6つの接続ってデフォルトで、about:configで変更できるよ。今年はもっと高くしてもいいと思うけど、大手ブラウザの人たちが気にするとは思えないね。 >最大で6つの同時接続に制限されちゃうね。 今の時代、製品や企業はほとんどがngrokを使って開発環境やローカルサーバーをHTTP2に公開してると思ってたけど、Caddyがしっかりその役割を果たせるってことに気づいて良かった。 >OSの信頼ストアにインストールされるルート証明書を通じて この目的のためにはオプションだから、明示的にインストールする必要があるよ。 nginxからcaddy-docker-proxyに切り替えてから1年、その後最近Pangolinに移行したけど、すごく楽しい経験をしてるよ。Wireguardでのトンネル機能や認証が組み込まれたTraefikのフロントエンド。MinecraftサーバーのTCP転送が超簡単になったから、Nginx Proxy Managerのより良いバージョンを求めてる人にはおすすめ。ドキュメントはちょっと不足だけど、メンテナーたちはDiscordでとても助けてくれるよ。 Cloudflare Tunnelsの代替品みたいだね。ただしCloudflareのアクセスはCloudflareのセキュリティチームによって保護されているんだ。 アメリカの会社にトラフィック監視されるのはいやだな。もうすでに自分のブラウジング行動が知られてるからさ。 その通りだよね。でもVPSでPangolin使えば、その心配はないよ。どっちにしろクラウドプロバイダーがアクセスするから。 Pangolinがどう動くかは分からないけど、一般的にはエンドツーエンド暗号化でトンネルを作ることができるよ。 OPはすでにCloudflareを使ってると言ってたよ。 Pangolinの名前が挙がっててうれしい! プロジェクトの頑張りに感謝!メッセージを広められてうれしいよ、Milo :) このコメントありがと。サーバー用にドメインを使おうとしてるんだけど、ISPのアドレスは公開したくないから、別のセットアップも考えたい。ec2やDOのドロップレットで静的IPを使い、tailscaleでトラフィックをプロキシしたいと思ってる。ec2やドロップレットのウェブインタフェースからSSH接続を許可するIPを制御するのが楽でいいね。 SSOって何に使うの?他のセルフホステッドアプリとどう連携するの?認証を2回してたら意味がないよね。 特定のサブドメインで認証を無効にすることができるよ。クッキーもあまり元の認証を見ないからね。 なるほどね。理想的にはすべてのセルフホステッドアプリにSSOがあって、一度ログインすれば全てにアクセスできるのがいいな。家族も同じサービスを使うから、’またログインしなきゃいけないの?’って文句を聞きたくないし。スマホアプリもトークンを使うから、アプリUI経由でセットアップしなくちゃいけないのが面倒。だからスマホから2回もログインすることになって、さらに不便だよ。要するにプロキシWebサーバーでIPやIPレンジをブロック・ホワイトリストしたい。Pangolinはそこがすごいみたい。 SSOは一度だけで、パスワードマネージャーに保存できるからログインは大した問題じゃないよ。ユーザーや役割の作成も簡単で、IPやURLのホワイトリストで認証をスキップする設定もできるし、traefikの上に作られてるから拡張性も高い。家族のJellyfinは他の認証があるから、問題が起きないように無効にしてる。 このスレッドはポジティブな意見が多いね。Caddyを批判するつもりはないけど、Nginxに対する主な利点は証明書の設定が簡単ってことだけかな。数年前にKubernetesクラスターで証明書の自動作成と更新を設定したし、Load Balancerを新しいドメインに向けるだけで大丈夫。 Caddyに悪いところはないと言ったが、一つある。動的にロード可能なモジュールをサポートしていないから、例えばgeoipが必要な場合、自分でビルドしないといけないし、CVEの管理も大変。ディストリビューションの管理者を頼れない。 フォークを維持する必要はないよ。必要なものがあればDockerfileを用意してコンテナをビルドするだけだから。レートリミッティングを使う時も、単純にDockerfileを作るだけで済むよ。 Dockerの外でCaddyを使いたいなら、リアルなリモートアドレスを取得するための問題がまだあるんだ。 何もトラッキングする必要もないし、GitHub Actionsのワークフローを設定して依存関係のバージョンを自動で上げてもらえば楽だよ。 それならただ’apt install -y nginx certbot’を実行するだけで、ビルドやパッケージ環境の心配いらないよ。 Golangは基本的にダイナミックロード型のライブラリをサポートしてない。最初はできるように見えるけど、実際にはそうじゃないから気を付けて。 もう少し詳しく教えて。プラグインパッケージがこれを扱えると思ったけど、実際に試したことはないから、本当にダメなの? それはそうだね。LinuxとmacOSに対応したPOCだし、実際には読み込んだシンボルを必要な意味にキャストするのに依存してる。 これが前回見たときの大きなネックだったんだ。Route 53や他のDNSプロバイダがLet’s Encryptのサポートのために使えなきゃいけなかったのが嫌で、自分でプラグインを作らなきゃいけない印象で、もう読むのをやめたよ。Certbotは簡単にインストールできるし、webサーバーとも一発で使えるしね。 Caddy3はWASMプラグインをWazeroみたいなので実装するかもしれないな。パフォーマンスに影響が大きすぎないといいけど。 Caddyはnginxの意見のある代替で、現代的なデフォルトが設定されてる。全てのnginxやapacheの設定をする自信はあるけど、Caddyには「ドメイン名はこれ」って言うだけで、あとは楽に進められる。特定の機能にトラフィックやnginxを使いたいと思ったら、必要なときに切り替えればいいし、Caddyはすぐ使える状態なのが大きな利点だよ。 >でも15分ほどでできるって言ってたけど、それには人が月や年の経験があってこその話じゃないかな。今ならLLMで証明書の設定とかもできると思うけど、過去に何度か挑戦したときは専門用語が多くて、全てを知っている人の視点で書かれてることが多かった。 証明書の設定って本当に面倒。インフラエンジニアリングを何年もやってきたけど、SSLの隠れたコストを軽視する人たちが本当に多い。どこで終端するか、どの部分がSSLを扱うかを理解する必要があって、それを誤ると危険なことになっちゃうんだ。自己署名証明書を簡単に考える人が多いけど、全てのアプリケーションや依存関係がそれを信頼する方法を知らないと危ない。 そうだよ、君の言う通りなんだ。自分でできる人でも、これは価値のある機能だよね。 Caddyは使ったことないけど、設定形式がnginxより悪いことはないだろうと思う。nginxの設定はすごい特殊なところがあるからさ。 >nginxの設定形式より悪くはないと思う。設定をパラメータ化して読み込むことができるから、大きな設定を再利用できるのが嬉しいんだ。これはansibleやbash + envsubstに頼らなくて済むからね。 確かに。nginxの設定は昔から不思議なところがあったけど、結局は解決できたし、なかなか触ることはないから大丈夫だね。 単一の実行ファイルで、OSに関係なくファイルがどこにあるかが分かるのがいいね。 Nginxで苦労してたけど、Caddyにしてみたらコマンド一発で簡単に動かせて感動したよ。もしNginxの設定が難しいって思うなら、Caddyを試してみる価値あり! 単一の実行ファイルはパッケージマネージャーがやるべきことだよ。他のOSではずっと前から解決されてる問題だし。 多くのケースで解決できてないよね。ポータブルアプリが人気なのもその証拠。アプリを一つのフォルダーにまとめるWindowsって、逆に言えば全てがファイルって考え方だよね。 OS間のIPCやネットワークを無視すれば、全てがファイルっていうのは確かだけど。Windowsのやり方は姿勢が変わっただけだよ。 Caddyはまだ試してないけど、Nginxには明らかな欠点があって、早く逃げたい。クエリの検出が遅いのが特に困るね。ログローテーションも面倒だし、他にもいろいろあるから、代替を探してる。 ログローテーションは Nginxを10年近く使ってたけど、設定を書くのが不安だった。でもCaddyは問題なく使えてるから個人的には満足。仕事ではNginxかTraefikを使うかもだけど、Caddyには過去のサポートフォーラムに不安があったのが気になる。 Nginxは企業向けには優れてると思うけど、無駄な設定が多くて、基本的なことをするのも大変だからCaddyに目を向けたよ。 どんな問題があったの?自分の本番環境の設定は65行もないんだけど、簡単にphp-fpmもサポートできるよ。 Caddyマジで好き。数年間使ってて信頼性も高いし、基本を覚えればセットアップも超簡単。ドキュメントはちょっと分かりづらいけど、NGINXでletsencryptの設定に苦労するよりずっと時間とエネルギーの節約になったよ。もっとコメントを表示(1)
ウェブサーバーが0.0.0.0で待機していれば、127.0.0.2や127.0.0.3、127.0.0.4…のlocalhost接続も受け入れるから、各接続に6つできると思うよ。https://superuser.com/questions/393700/what-is-the-127-0-0-2…(ただし、macOSではダメだって言ってるけど)
こんな機能をウェブサーバーにしたくないよ。もっとコメントを表示(2)
もっとコメントを表示(3)
logrotate
がやるべきじゃない?自分はあんまりログ見ないけど、使い道があるのも分かる。