C言語で現代のWebアプリを作り、商用サービスを出荷した
A Modern Web App in C
1994年と同じCGI方式で、アカウント管理やStripe決済、Postmarkメール送信を備えた商用WebサービスをC言語で構築。BCHSスタック(OpenBSD、C、httpd、SQLite)を使い、依存はlibcurlとlibsodiumのみ。静的リンクした単一バイナリを差し替えるだけで無停止デプロイが可能。フレームワークやテンプレート言語、コンテナは不要で、ビルドは数秒、再ビルドは0.5秒未満。モダンな技術スタックの複雑さに疑問を投げかける。
CGIの衰退は2004年には正当化されたが、2026年には通用しない。C言語でモダンなWebアプリケーションを書くことは可能だ。私はそれを出荷した。バイナリ1つ、SQLiteファイル1つ、依存関係3つ、全体が頭の中に収まる。
HNでの議論
135- dorongrinstein
多くのツールで同じことができる。鉛筆でもペンでもクレヨンでもメモを書ける。秘密を教えてあげるけど、誰にも言わないでね。アセンブリでも書けるんだよ。
- ramses0
私のお気に入りのトリビアは、busybox に組み込みの cgi-bin サポートがあることだ(そして `rclone serve webdav` も言及されていないのは手落ちだろう)。`https://elixir.bootlin.com/busybox/1.37.0/source/networking/...`
この記事で言及されていることは100%真実で、よく筋が通っている。特に特権を落とすための pledge/chroot/etc. の包含はそうだ。
根本的に相反する2つのデプロイ機構がある:
1) 単純な `echo "hello world"` を実行するために、glop のスタックタワーを互いの上に積み上げ、proxmox サーバー内の vm 内の docker コンテナ上で、リモートコンピュート上で動作するハイパーバイザー下の k8s クラスタの一部として動かす...
2) ただ `bash -c 'echo "hello world"'` を実行し、CGI でフロントする(ステートレス、単一バイナリ、云々...)
https://github.com/Domain/bash.cgi を覗いてみてほしい... 別に「busybox 上の bash を cgi-bin で使う」ことが「適切なアーキテクチャ」だと言っているわけではない。ほぼ真に「フレームワークレス」になるのを妨げるコード量がごくわずかで、推論が容易であることを示そうとしているだけだ。
仕事でやっている内部ツールのいくつかでは、次のような方向に傾いている:
some-cmd [--json|--markdown] ...yet-more-args...
プロセスとシェル環境自体を repl として使うと、`[--cgi-bin]` が「ただ」別の出力タイプになる方向に進み、コマンドが独立していて再現可能で、入力引数だけに依存することを保証する能力(いや、先見性!)が、そのまま「敵対的」な環境でも実行可能な方向へと導いてくれる( […]
- OleksandrC
奇妙なウェブアプリケーションに興味がある人向けに、私は C++ でゲームプロジェクトに取り組んでいる。クライアントは Emscripten で WebAssembly にコンパイルされ、アプリケーションサーバーも C++ で実装されている(nginx の背後で)。
これも AI 以前の時代のものだ。ゲームは Civ ライク。カスタムエンジンをゼロから(3D 関連も、ウェブ処理もすべて含めて)。
見てみてほしい:https://statebuilder.com/
- assimpleaspossi
私は22年前に、自分が所有していたレストランのオンラインメニュー注文システムを開発した後、ウェブ開発会社を始めた。私、そしてその後は私たちは、投稿で語られていることとほぼ同じことをしたが、fastcgi を使っていた。C を知っていたので C から始めた。それが私の本職だった。とてもうまく動作したので、フランチャイズが私からソフトウェアを買い取り、その後 Microsoft のもの一式に変えてしまい、それ以降は問題に次ぐ問題だった。それはまた別の話だ。
私はオンライン注文を必要とする他の会場、たとえば劇団やレストランのためにサイトを作り続けた。すべて C、fastcgi、FreeBSD、postgresql、そして h2o-server で、なぜならそれは常に、他人のルールに屈することなく、私たちが望むことをしてくれたからだ。速く、変更も簡単で、変更が私たちのために、あるいは私たちの同意なしに行われることもなかった。私たちはとてもうまくやった。
- unixholder
複雑なウェブ技術やフレームワークを深く掘り下げれば掘り下げるほど、シンプルさが勝つということがますます明らかになる。
- benlivengood
Golang でも、単一のバイナリからウェブサイトやサービスを提供することが可能だ。コア Go にこだわれば(CGO_ENABLED=0)、libc のリンクすら避けられるし、従来のウェブサーバー(nginx、apache、httpd)を置き換えるのに必要な http と tls のライブラリもすべて付属している。
私は C が大好きで、過去に C でいくつか CGI を書いたこともあるが、C での並行プログラミングは好きではない。fork と exec は .text セグメントに共有の読み取り専用 mmap を使えるが、.bss と .data は初期化とコピーが必要だ。スレッド化されたプロセスが避けることのできる起動オーバーヘッドは避けられず、生の pthreads はかなり苦痛だ。低トラフィックのサイトを提供するだけであれば、CGI で十分だ。
私の最大の心配は、SQLite DB がどのくらいの頻度でバックアップされるかだ。今日の世界で C のウェブサーバーが RCE から自由であるはずがないからね。
- Levitating
CGI は素晴らしい。残念ながら nginx は lighttpd と違ってネイティブにサポートしていない。
nginx に CGI を追加するこのプロジェクトが気に入っている:https://github.com/pjincz/nginx-cgi
また、passenger[1] を介して nginx から直接 Rack アプリケーションを起動する方法もある。Rack は Ruby ウェブアプリのための CGI ライクなインターフェースだ:https://github.com/rack/rack
これにより、数行の Ruby でアプリケーションとミドルウェアを簡単に書ける。
[1]: https://www.phusionpassenger.com/documentation/Users%20guide...
- creatonez
CGI プロセスはリクエストごとに SQLite データベースを開いているのか...?それなら史上最も狂った競合が起きるだろう。