Ein modernes Webprodukt in C – mit CGI aus dem Jahr 2004
A Modern Web App in C
Corey Prophitt hat marketyour.games, ein kommerzielles Webprodukt mit Benutzerkonten, Stripe-Zahlungen und Postmark-E-Mails, in C geschrieben und über CGI ausgeliefert. Der Stack BCHS – OpenBSD, C, httpd und SQLite – kommt ohne Framework, Templating-Sprache oder Container aus. Ein statisch gelinktes Binary, eine SQLite-Datei und drei Bibliotheken; Deployments ersetzen nur eine Datei, ohne Neustart oder Ausfallzeit.
CGI ist serverless, nur ohne Anbieter (und ohne Überraschungsrechnungen).
- dorongrinstein
Viele Tools können dasselbe erreichen. Ich kann eine Notiz mit Bleistift, Kugelschreiber, Wachsmalstift usw. schreiben. Ich verrate dir ein Geheimnis, aber erzähl es niemandem: Du kannst sie auch in Assembly schreiben.
- ramses0
Mein liebster Fun Fact ist, dass busybox eingebaute cgi-bin-Unterstützung hat (und `rclone serve webdav` scheint es auch versäumt zu haben, das zu erwähnen). `https://elixir.bootlin.com/busybox/1.37.0/source/networking/...`
Alles, was der Beitrag erwähnt, ist 100 % wahr und gut begründet, besonders die Einbeziehung von pledge/chroot/etc. zum Ablegen von Privilegien.
Es gibt zwei diametral entgegengesetzte Deployment-Mechanismen:
1) Türme von Glop aufeinanderstapeln, bis du ein einfaches `echo "hello world"` auf einem Docker-Container in einer VM auf einem Proxmox-Server als Teil eines k8s-Clusters unter einem Hypervisor auf Remote-Compute laufen lässt...
2) einfach `bash -c 'echo "hello world"'` ausführen und es mit CGI fronten (zustandslos, einzelne Binary, yada yada yada...)
Wirf einen Blick auf https://github.com/Domain/bash.cgi ... nicht, dass ich vorschlagen würde, dass 'bash über busybox mit cgi-bin' die "richtige Architektur" ist, es soll eher veranschaulichen, dass die Menge an Code, die dich davon abhält, nahezu wirklich "frameworkless" zu sein, winzig und leicht zu durchschauen ist.
Für einige der internen Tools, die ich für die Arbeit erstelle, tendiere ich zu:
some-cmd [--json|--markdown] ...yet-more-args...
Wenn du den Prozess und die Shell-Umgebung selbst als REPL verwendest, fängst du an, in Richtung `[--cgi-bin]` zu tendieren, das "einfach" ein weiterer Ausgabetyp wäre, und die Fähigkeit (nein: Weitsicht!), sicherzustellen, dass deine Befehle unabhängig, reproduzierbar sind und nur von ihren Eingabeargumenten abhängen, führt dich direkt dazu, dass sie sowohl in "feindlichen" ( […]
- OleksandrC
Für Leute, die Interesse an seltsamen Webanwendungen haben: Ich habe an einem Spielprojekt in C++ gearbeitet, bei dem der Client mit Emscripten zu WebAssembly kompiliert wird und der Anwendungsserver ebenfalls in C++ implementiert ist (hinter nginx).
Das ist auch aus der Prä-KI-Ära. Das Spiel ist Civ-ähnlich. Eigene Engine von Grund auf (einschließlich sowohl der 3D-Sachen als auch der gesamten Web-Verarbeitung).
Schau es dir an: https://statebuilder.com/
- assimpleaspossi
Ich habe vor 22 Jahren ein Webentwicklungsunternehmen gegründet, nachdem ich ein Online-Menü-Bestellsystem für ein Restaurant entwickelt hatte, das mir gehörte. Ich, dann wir, machten so ziemlich dasselbe wie im Beitrag beschrieben, aber wir verwendeten fastcgi. Ich begann mit C, weil ich C kannte. Das war mein eigentlicher Job. Es lief so gut, dass das Franchise die Software von mir kaufte – und sie dann auf den ganzen Microsoft-Kram umstellte und von da an Problem um Problem hatte. Das ist eine andere Geschichte.
Ich machte weiterhin Websites für andere Locations, die Online-Bestellungen benötigten, wie Theatergruppen und Restaurants. Alles in C, fastcgi, FreeBSD, postgresql und h2o-server, weil es immer tat, was wir wollten, ohne sich den Regeln anderer zu beugen. Es war schnell und einfach, Änderungen vorzunehmen, während Änderungen nicht für uns oder ohne unsere Zustimmung vorgenommen wurden. Wir haben sehr gut für uns selbst gesorgt.
- unixholder
Je tiefer man in komplexe Webtechnologien und Frameworks eintaucht, desto offensichtlicher wird, dass Einfachheit gewinnt.
- benlivengood
Golang macht es ebenfalls möglich, eine Website oder einen Dienst aus einer einzigen Binary bereitzustellen. Du kannst sogar das Linken gegen libc vermeiden, wenn du dich auf Core-Go beschränkst (CGO_ENABLED=0), und es bringt alle HTTP- und TLS-Bibliotheken mit, die du brauchst, um den traditionellen Webserver (nginx, apache, httpd) zu ersetzen.
Ich liebe C und habe in der Vergangenheit einige CGIs in C geschrieben, aber ich liebe nebenläufige Programmierung in C nicht. Während Forking und Execing ein gemeinsames schreibgeschütztes mmap auf .text-Segmenten nutzen können, müssen .bss und .data initialisiert und kopiert werden; es gibt unvermeidbaren Start-Overhead, den ein Thread-Prozess vermeidet, und rohe pthreads sind ziemlich schmerzhaft. Wenn alles, was du tun musst, das Bedienen einer Website mit wenig Traffic ist, ist CGI in Ordnung.
Meine größte Sorge wäre, wie oft die SQLite-DB gesichert wird, denn es gibt keinen Weg, dass ein C-Webserver in der heutigen Welt frei von RCEs sein wird.
- Levitating
CGI ist großartig. Leider unterstützt nginx es nicht nativ, im Gegensatz zu lighttpd.
Ich mag dieses Projekt, um CGI zu nginx hinzuzufügen: https://github.com/pjincz/nginx-cgi
Es gibt auch Methoden, Rack-Anwendungen direkt von nginx aus über passenger[1] zu starten. Rack ist die CGI-ähnliche Schnittstelle für Ruby-Webapps: https://github.com/rack/rack
Es ermöglicht leicht das Schreiben von Anwendungen und Middleware mit ein paar Zeilen Ruby.
[1]: https://www.phusionpassenger.com/documentation/Users%20guide...
- creatonez
Öffnet der CGI-Prozess die SQLite-Datenbank für jede Anfrage...? Das hätte die verrückteste Konkurrenz aller Zeiten.