J'ai écrit plusieurs applications web en Common Lisp, dont l'un est actuellement en déploiement et de faire de l'argent (une compagnie charter système de réservation qui étonnamment n'a rien à voir avec ITA), et d'autres qui sont encore en cours de développement (financier du système de modélisation pour les grands projets pétroliers - j'ai laissé, mais ils ont signé avec un éminent VC entreprise il y a quelques mois, à une nouvelle génération de négociation/de TA plate-forme pour les contrats à terme et des produits de base - mon projet en cours) ou ont été mis en veilleuse, mais sont de bonne idées d'entreprise (web "reverse proxy" pour les annonceurs et les visser sur les solutions de fixation des applications web que vous ne pouvez pas fixer n'importe quel autre moyen, je suis toujours intéressé à l'élaboration de cette).
Résultat: j'ai une certaine expérience dans le déploiement de Lisp web apps, cependant, comme vous pouvez le voir, il est fortement biaisée en faveur de la haute performance des applications Intranet avec pas que beaucoup d'utilisateurs, et en particulier la nécessité de rendre le navigateur web de l'expérience de se sentir aussi sensible comme une application de bureau. Si mon projet actuel se passe selon le plan, je devrais avoir l'occasion de tester mon approche sur un site web public.
Voici comment j'ai configuré Lisp applications web:
Tout (y compris le contenu statique (images) est servi directement à partir de Hunchentoot en cours d'exécution sur SBCL sur Linux. Hunchentoot utilise un thread par modèle de requête, ce qui est exactement ce que mes applications web besoin. SBCL sur Linux utilise NPTL, qui, selon certains tests de fait thread-par-requête plus vite que futzing avec NIO. Je n'ai pas fait mes propres repères, mais je ne suis pas inquiet à propos de Hunchentoot garder comme un serveur web.
Je commence SBCL à l'intérieur de GNU écran à l'aide de setuidgid à exécuter en vertu d'un verrouillée, compte non privilégié et d'avoir encore accès à la REPL pour la mise à niveau du système sans les interruptions de service.
Tout le HTML de la génération se fait par CL-QUI. J'ai ma propre Lisp-à-compilateur JavaScript appelé Parenscript. Sur les champs pétroliers projet de modélisation, nous avons évalué à peu près tout pour l'écriture d'applications web et s'installe sur faire notre propre en adoptant Parenscript de ses précédents responsables. L'écriture d'applications web qui fonctionnent comme des applications de bureau est difficile - la différence entre quelque chose qui se sent "natif" et quelque chose qui est inutilisable indésirable est généralement un couple de lignes de code. Trouver le bon couple de lignes sans être capable de générer et de instrument de code JS dans une façon intelligente est une tâche immense.
Pour le stockage j'utilise le CLSQL de la bibliothèque. Il a vraiment une dingo de la syntaxe pour l'écriture de la première classe de requêtes SQL (ie - objets réels et non pas seulement des chaînes de caractères) en Lisp, mais après utilisation, je pense que c'est plus d'ennuis que cela vaut la peine. Pour la réservation de projet, j'ai écrit un certain nombre de macros qui a eu une entreprise description de l'objet et SQL généré des schémas (vraiment simple à l'aide de types SQL sans aucune sorte de Lisp encodage ou des métadonnées), des fonctions pour produire des formulaires HTML pour la saisie et l'édition de ces objets, et après des gestionnaires pour la manipulation et la vérification de ces soumissions de formulaire tout en traitant avec de multiples soumettre et CSRF questions. Qui s'est avéré vraiment RESTy.
Celui qui prétend que cette configuration n'est pas fiable a de graves problèmes avec leurs serveurs. Le système de réservation que j'ai conçu a été exécuté pendant plus d'un an avec le seul temps d'arrêt due à une défaillance du matériel.
Belles choses que j'ai fait facilement avec cette approche:
- Comète (il suffit de demander Hunchentoot pour le ruisseau et continuer à écrire)
- Au moment de la compilation intra-lien demande de vérification (voir mon billet de blog)
- Portable de profilage pour l'ensemble de votre code JS
- Générer des versions spécifiques à un navigateur JS et ressources de contenu sont parfaitement mis en cache
Je n'aime pas les cadres, préférant l'Unix idéal de mettre ensemble orthogonal outils, donc je ne peux pas vraiment recommander UCW ou Webactions.
J'utilise CL-QUI parce que la plupart du HTML dans les applications est générée. Si vous avez un document orienté web app et quelqu'un pour HTML et CSS, vous voudrez probablement une sorte de système de template.
Une chose que vous devez regarder dehors pour lorsque le déploiement est la question que Brian Carpes mentionné avec les Vps. Le principal coupable semble être Virtuozzo - leur système de mémoire virtuelle ne peut pas gérer overcommitment sur tout, mais les instances de l'hôte. SBCL fait cela, mais d'autres implémentations différentes de la mémoire de stratégies de gestion n'aurez pas ce problème. Pour information, le système de réservation est effectivement déployées sur l'hôte VZ instances.