1eb4a1265dfe1751dd9d7266ca6c1e7edcc9f94e
[kivitendo-erp.git] / doc / INSTALL.fcgi
1
2 Diese Datei ist in Plain Old Documentation geschrieben. Mit
3
4 > perldoc INSTALL.fcgi
5
6 ist sie deutlich leichter zu lesen.
7
8 =head1 FastCGI für Lx-Office
9
10 =head2 Was ist FastCGI?
11
12 Direkt aus L<http://de.wikipedia.org/wiki/FastCGI> kopiert:
13
14   FastCGI ist ein Standard für die Einbindung externer Software zur Generierung
15   dynamischer Webseiten in einem Webserver. FastCGI ist vergleichbar zum Common
16   Gateway Interface (CGI), wurde jedoch entwickelt, um dessen
17   Performance-Probleme zu umgehen.
18
19
20 =head2 Warum FastCGI?
21
22 Perl Programme (wie Lx-Office eines ist) werden nicht statisch kompiliert.
23 Stattdessen werden die Quelldateien bei jedem Start übersetzt, was bei kurzen
24 Laufzeiten einen Großteil der Laufzeit ausmacht. Während SQL Ledger einen
25 Großteil der Funktionalität in einzelne Module kapselt, um immer nur einen
26 kleinen Teil laden zu müssen, ist die Funktionalität von Lx-Office soweit
27 gewachsen, dass immer mehr Module auf den Rest des Programms zugreifen.
28 Zusätzlich benutzen wir umfangreiche Bibliotheken um Funktionaltät nicht selber
29 entwickeln zu müssen, die zusätzliche Ladezeit kosten. All dies führt dazu dass
30 ein Lx-Office Aufruf der Kernmasken mittlerweile deutlich länger dauert als
31 früher, und dass davon 90% für das Laden der Module verwendet wird.
32
33 Mit FastCGI werden nun die Module einmal geladen, und danach wird nur die
34 eigentliche Programmlogik ausgeführt.
35
36 =head2 Kombinationen aus Webservern und Plugin.
37
38 Folgende Kombinationen sind getestet:
39
40  * Apache 2.2.11 (Ubuntu) und mod_fastcgi.
41
42 Folgende Kombinationen funktionieren nicht:
43
44  * Apache 2.2.11 (Ubuntu) + mod_fcgid:
45
46
47
48 =head2 Konfiguration des Webservers.
49
50 Variante 1:
51
52   AddHandler fastcgi-script .pl
53
54 Variante 2:
55
56   AliasMatch ^/web/path/to/lx-office-erp/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
57
58   <Directory /path/to/lx-office-erp>
59     AllowOverride All
60     AddHandler fastcgi-script .fpl
61     Options ExecCGI Includes FollowSymlinks
62     Order Allow,Deny
63     Allow from All
64   </Directory>
65
66   <DirectoryMatch /path/to/lx-office-erp/users>
67     Order Deny,Allow
68     Deny from All
69   </DirectoryMatch>
70
71
72 Variante 1 startet einfach jeden Lx-Office Request als fcgi
73 Prozess. Für sehr große Installationen ist das die schnellste Version,
74 benötigt aber sehr viel Arbeitspseicher: wurden alle Module mindestens
75 einmal aufgerufen, so werden dauerhaft ca. 2GB pro Installation
76 belegt.
77
78 Variante 2 startet nur einen zentralen Dispatcher und lenkt alle Scripte auf
79 diesen. Dadurch dass zur Laufzeit öfter mal Scripte neu geladen werden gibt es
80 hier kleine Performance Einbußen. Trotzdem ist diese Variante vorzuziehen.
81
82
83 =head2 Entwicklungsaspekte
84
85 Die AddHandler Direktive vom Apache ist entgegen der Dokumentation
86 anscheinend nicht lokal auf das Verzeichnis beschränkt sondern global im
87 vhost.
88
89 Wenn Änderungen in der Konfiguration von Lx-Office gemacht werden, oder wenn
90 Templates editiert werden muss der Server neu gestartet werden.
91
92 Es ist möglich die gleiche Lx-Office Version parallel unter cgi und fastcgi zu
93 betreiben. Da nimmt man Variante 2 wie oben beschrieben, und ändert die
94 AliasMatch Zeile auf eine andere URL, und lässt alle anderen URLs auch
95 weiterleiten:
96
97   # Zugriff ohne FastCGI
98   Alias /web/path/to/lx-office-erp /path/to/lx-office-erp
99
100   # Zugriff mit FastCGI:
101   AliasMatch ^/web/path/to/lx-office-erp-fcgi/[^/]+\.pl /path/to/lx-office-erp/dispatcher.fpl
102   Alias       /web/path/to/lx-office-erp-fcgi/          /path/to/lx-office-erp/
103
104 Dann ist unter C</web/path/to/lx-office-erp/> die normale Version erreichbar,
105 und unter C</web/opath/to/lx-office-erp-fcgi/> die FastCGI Version.
106
107 Bei der Entwicklung für FastCGI ist auf ein paar Fallstricke zu achten. Dadurch
108 dass das Programm in einer Endlosschleife läuft, müssen folgende Aspekte
109 geachtet werden:
110
111 =head3 Programmende und Ausnahmen: C<warn>, C<die>, C<exit>, C<carp>, C<confess>
112
113 Fehler, die dass Programm normalerweise sofort beenden (fatale Fehler), werden
114 mit dem FastCGI Dispatcher abgefangen, um das Programm am Laufen zu halten. Man
115 kann mit C<die>, C<confess> oder C<carp> Fehler ausgeben, die dann vom Dispatcher
116 angezeigt werden. Die Lx-Office eigene C<$::form->error()> tut im Prinzip das
117 Gleiche, mit ein paar Extraoptionen. C<warn> und C<exit> hingegen werden nicht
118 abgefangen. C<warn> wird direkt nach STDERR, also in Server Log eine Nachricht
119 schreiben, und C<exit> wird die Ausführung beenden.
120
121 Prinzipiell ist es kein Beinbruch, wenn sich der Prozess beendet, fcgi wird ihn
122 sofort neu starten. Allerdings sollte das die Ausnahme sein. Quintessenz: Bitte
123 kein C<warn> oder C<exit> benutzen, alle anderen Exceptionmechanismen sind ok.
124
125 =head3 Globale Variablen
126
127 Um zu vermeiden, dass Informationen von einem Request in einen anderen gelangen,
128 müssen alle globalen Variablen vor einem Request sauber initialisiert werden.
129 Das ist besonders wichtig im C<$::cgi> und C<$::auth> Objekt, weil diese nicht
130 gelöscht werden pro Instanz, sondern persistent gehalten werden.
131
132 Datenbankverbindungen wird noch ein Guide verfasst werden, wie man sichergeht,
133 dass man die richtige erwischt.
134
135 =head2 Performance und Statistiken
136
137 Die kritischen Pfade des Programms sind die Belegmasken, und unter diesen ganz
138 besonders die Verkaufsrechnungsmaske. Ein Aufruf der Rechnungsmaske in
139 Lx-Office 2.4.3 stable dauert auf einem Core2duo mit 2GB Arbeitsspeicher und
140 Ubuntu 9.10 eine halbe Sekunde. In der 2.6.0 sind es je nach Menge der
141 definierten Variablen 1-2s. Ab der Moose/Rose::DB Version sind es 5-6s.
142
143 Mit FastCGI ist die neuste Version auf 0,4 Sekunden selbst in den kritischen
144 Pfaden, unter 0,15 sonst.
145
146 =head2 Bekannte Probleme
147
148 Bei mehreren Benutzern scheint ab und zu eine Datenbankverbidung von Rose::DB
149 in den falschen Benutzer zu geraten. Das ist ein kritischer Bug und muss gefixt
150 werden.
151
152 Bei Administrativen Tätigkeiten werden in seltenen Fällen die Locales nicht
153 richtig geladen und die Maske erscheint in Englisch.
154
155 Die bin/mozilla und SL/ Scripte haben teilweise noch globale Variablen mit our
156 definiert, oder haben noch startup code der bei einbinden ausgeführt wird.
157 Beides muss überprüft werden.
158
159 Verkauf -> Rechnungen -> Weiter -> Neu erfassen Rechnung gibt einen Zugriffsfehler
160
161 Template Editor funktioniert nicht
162