Nov 13

Apache und Glassfish mit “mod_jk” verbinden (Ubuntu)

1 Einleitung

In diesem Tutorial geht es darum, wie man Apache und einen Glassfish Server miteinander verbinden kann, so dass der Apache “vor” dem Glassfish Server sitzt und alle Anfragen an den Glassfish weiterleitet. Dies funktioniert mit dem Apache-Modul “mod_jk”.

2 Voraussetzungen

Für dieses Tutorial habe ich folgende Umgebung und Versionen verwendet:

  • Ubuntu 8.04.4 LTS
  • Apache 2.2.8
  • Glassfish 3.1.1
  • mod_jk 1.2.32

Aber das Tutorial dürfte sich leicht auf eine andere Umgebung übertragen lassen…

3 “mod_jk” kompilieren

Leider gab es für meine Umgebung kein vorkompiliertes “mod_jk”, das bedeutet also: selbst kompilieren! Auf http://tomcat.apache.org/download-connectors.cgi gibt es die Source Releases, bei mir war die aktuellste Version 1.2.32. Dann den Download auspacken, im Archiv gibt es eine BUILD.txt, die den Kompiliervorgang beschreibt. Auszug (kann man so noch nicht verwenden):

$> cd native
$> ./configure --with-apxs=/usr/sbin/apxs (or where ever the apxs/apxs2 is)
$> make
$> su -c 'make install'

Ich habe über apt (oder synaptic) das Paket “build-essential” installiert, mit dem fast alle Voraussetzugen für diesen Kompilier-Vorgang erfüllt sind. Lediglich apxs (bzw. apxs2) fehlt, was man offensichtlich für das “configure” benötigt, wie oben zu sehen. Hier habe ich in synaptic nach apxs gesucht und so zwei Apache-Pakete gefunden. Für eines von beiden muss man sich entscheiden, ich habe das “threaded”-Paket gewählt. Ob es mit dem anderen Paket auch funktioniert, habe ich nicht getestet (für Feedback bin ich dankbar!). Danach liegt apxs bei mir unter folgendem Pfad (ein “find” sollte die Datei ausfindig machen):

/usr/bin/apxs2

Damit können wir also den Kompilier-Vorgang folgendermaßen durchführen:

$> cd native
$> ./configure --with-apxs=/usr/bin/apxs2
$> make
$> su -c 'make install'

Das Kompilieren sollte nun ohne Fehler durchlaufen. Falls configure oder make doch noch etwas anmeckert, dann sind es oft Header-Dateien, die in den entsprechenden “dev”-Paketen enthalten sind, die man leicht mit synaptic finden und nachinstallieren kann.

4 “mod_jk” konfigurieren

Wenn “mod_jk” fertig kompiliert und installiert ist, muss es noch über zwei Konfigurations-Dateien konfiguriert werden.

Die erste ist die workers.properties. Also eine Datei workers.properties anlegen, egal wo, aber am besten unter /etc/apache2/ mit folgendem Inhalt:

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

Wir müssen diese Datei später noch erweitern, aber für den Anfang reicht es so.

Dann muss die Apache-Konfigurations-Datei /etc/apache2/httpd.conf angepasst werden (war bei mir anfangs leer). Einige Eigenschaften verweisen auf Pfade, die natürlich stimmen müssen, d. h. die mod_jk.so-Datei vorher mit “find” ausfindig machen und den richtigen Pfad hier einsetzen. Das gleiche gilt für die log-Dateien und ganz wichtig: die zuvor angelegte workers.properties:

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /etc/apache2/mod_jk.log
JkLogLevel debug
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /yourWebApp/* worker1
JkMountCopy All

Die vorletzte Zeile (JkMount) gibt an, dass alle Anfragen von /yourWebApp/* zu dem Alias “worker1″ aus der workers.properties-Konfigurations-Datei weitergeleitet werden. Von da geht es dann zu dem dort konfigurierten Host und Port (bei mir localhost:8009) weiter.

ACHTUNG: Wenn man für JkMount /yourWebApp/* konfiguriert, dann darf in der Anfrage das abschließende Slash (“/”) nicht fehlen. Darauf bei eventuellen Weiterleitungen achten! Folgende Anfrage würde funktionieren:

http://yourdomain.com/yourWebApp/

Folgende Anfrage würde NICHT funktionieren:

http://yourdomain.com/yourWebApp

Die letzte Zeile in workers.properties (JkMountCopy All) vererbt die JkMount-Konfiguration auf alle eventuellen VirtualHosts.

Mit JkLogLevel debug fallen sehr viel log-Daten an, ich fahre aktuell ganz gut mit JkLogLevel info.

5 Glassfish konfigurieren

Die Konfiguration des Glassfish erweist sich als denkbar einfach. Über zwei Kommandos muss der jk-connector des Glassfish aktiviert werden:

asadmin create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server jk-connector
asadmin set configs.config.server-config.network-config.network-listeners.network-listener.jk-connector.jk-enabled=true

6 Glassfish-Bug beheben

An dieser Stelle kann nach einem Neustart von Apache und Glassfish ein erster Verbindungs-Test vorgenommen werden, d. h. einfach mit einem Browser folgende URL besuchen:

http://yourdomain.com/yourWebApp/

Ohne die soeben vorgenommenen Schritte hätten wir mit Sicherheit eine 404-Seite erhalten, jetzt würden wir aber die Startseite der WebApp erwarten. Dummerweise erschien bei mir nur eine weiße Seite. Immerhin kein 404, was bedeutet, dass Konfiguration zumindest ansatzweise gefruchtet hat. Nach einiger Log-File und Internet-Recherche bin ich auf folgenden Thread gestoßen, der einen Glassfish-Bug behandelt: http://forums.java.net/node/821526.
Der Fix besteht darin, eine Datei im Glassfish auszutauschen, und zwar

grizzly-utils.jar

Diese Datei kann man in dem Thread downloaden. Danach Glassfish neu starten und die Startseite der WebApp sollte erscheinen.

7 Verbindungsprobleme

Einfache WebApps sollten mit dieser Einstellung zumindest grundlegend laufen. Sobald aber ein wenig mehr Last anliegt, dürften bei dieser Konfiguration die ersten Verbindungsprobleme auftreten. Mit Firefox und zugehörigem Plugin “Firebug” kann man sehen, dass manchmal auf eine bestimmte Resource (Bilder, css oder JavaScript-Dateien, manchmal die Seite selbst) sehr lange gewartet wird. Irgendwann (nach ein paar Minuten) wird die Resource aber dann doch noch ausgeliefert. So lange wird ein User natürlich nicht warten.

Anfangs spekulierte ich auf einen Bug in mod_jk, nach einiger Recherche bin ich dann allerdings auf diese Website gestoßen: http://community.jboss.org/wiki/OptimalModjk12Configuration. Dort ist erklärt, dass die Standard-Konfiguration von Apache und mod_jk ungeeignet für den produktiven Betrieb sind. Hauptsächlich geht es um ungünstige Defaults von Timeouts, die entweder viel zu hoch angesetzt sind oder überhaupt nicht greifen.

Die Erklärung auf dieser Seite ist allerdings nicht für Glassfish, sondern für Tomcat. Man kann aber trotzdem einen Großteil der Vorschläge dort umsetzen. In Glassfish selbst ist es ohnehin nur eine Einstellung, und zwar die max-thread-pool-size, die man leicht mit folgendem Kommando auf 200 setzen kann (Default ist 5):

asadmin set configs.config.server-config.thread-pools.thread-pool.http-thread-pool.max-thread-pool-size=200

Die restlichen Konfigurationen für workers.properties und Apache bitte dem Link entnehmen.

Posted in Administration | Tagged , , , , , , , , , | 2 Comments
Nov 12

Programmieren lernen – Teil 3 (Die Programmiersprache)

In diesem Artikel geht es darum, was eine Programmiersprache ist. Wir werden erfahren, dass es mehr als eine Programmiersprache gibt, welche Beziehung die Programmiersprachen zueinander haben, und welche wir verwenden.

Was ist eine Programmiersprache?

Das Thema der Programmiersprache bedarf einer etwas ausführlicheren Erklärung:

Wenn wir uns die Sprache der Menschen ansehen, so wissen wir, dass sie sich erst über Jahrtausende hinweg entwickeln musste, bis wir so kommunizieren konnten, wie wir es heute tun. Als Steinzeitmenschen haben wir vielleicht auch schon kommuniziert. Aber vielmehr als “Mammut, happa happa!” wird es wohl nicht gewesen sein.

So ähnlich kann man sich auch die Entwicklung der Programmiersprachen vorstellen. Auch hier gibt es eine Art Ur-Sprache, auf der alle anderen Sprachen aufbauen. Diese Ur-Sprache wird Maschinensprache genannt. Die allerersten Programme überhaupt mussten mit dieser Maschinensprache erstellt werden, einfach aus dem Grund, weil es noch keine anderen Programmiersprachen gab. Auch heute noch gibt es einige Anwendungsgebiete, zu denen diese “urtümlichste” aller Sprachen eingesetzt wird. Im normalen Entwickler-Alltag ist sie aber nur noch äußerst selten anzutreffen.

Folgendes ist wissenswert: Die angesprochene Ur-Programmiersprache, die Maschinensprache, ist die einzige Sprache, die der Computer in seinem Inneren wirklich versteht. Das Herzstück eines jeden Computers, der Prozessor, spricht nur diese Sprache. Jetzt ist es so, dass es nur deswegen hunderte von weiteren Programmiersprachen geben kann, weil diese wieder zu Maschinensprache zurückübersetzt werden. Das kann man sich ungefähr so vorstellen, dass man im Restaurant beim Ober ein “Steak” bestellt, weil man “Hunger” hat. Egal in welcher Sprache man das zum Ausdruck bringt, im Inneren des Gehirns läuft trotzdem immer noch “Mammut, happa happa!” ab.

Welche Programmiersprache sollst du verwenden?

Die Wahl der Programmiersprache ist eine der ersten Hürden, die man als angehender Programmierer nehmen muss. Und dafür gibt es leider keine Faustregel, die Internetforen sind voll von Diskussionsbeiträgen zu diesem Thema. Eines kann ich aber mit Sicherheit sagen: Noch nie hat jemand eine einstimmige Antwort auf diese Frage erhalten.

Die “beste” Programmiersprache gibt es nicht. Eine Sprache ist leichter zu erlernen als manch andere und gilt daher vielleicht als “Einsteiger”-Programmiersprache. Mit einer anderen Programmiersprache hat man wiederum mehr Möglichkeiten als mit wieder einer anderen. Alle Sprachen haben aus einem bestimmten Grund ihre Daseinsberechtigung.
Vielmehr geht es beim Programmieren darum, dass man die grundlegenden Konzepte und Vorgehensweisen verstanden hat. In diesem Fall kann man mit verschiedenen Sprachen umgehen.

Wir werden in dieser Anleitung mit der Sprache “Java” beginnen. Sie ist in den letzten Jahren zu einer der beliebtesten und weit verbreitetesten Sprachen überhaupt geworden. Aus gutem Grund: Java ist modern und gut strukturiert, man kann sie für sehr viele Anwendungszwecke verwenden und im Internet gibt es eine große Anhängerschaft, bei der man Unterstützung bekommen kann.

Fazit

Wir haben folgendes gelernt: Es gibt eine Ur-Programmiersprache und viele weitere Sprachen, die auf dieser aufbauen. Eine dieser Sprachen heißt Java, welche wir auch verwenden.

Posted in Programmieren lernen | Tagged , , , , | Leave a comment
Nov 11

Programmieren lernen – Teil 2 (Programmieren)

In diesem Artikel soll es darum gehen, was Programmieren eigentlich ist, wie es grundsätzlich funktioniert, und was man alles damit machen kann.

Was ist Programmieren?

Programmieren ist, ganz einfach ausgedrückt, die Tätigkeit Programme zu erstellen. Auf deinem Computer gibt es schon viele Programme: Vielleicht ein Zeichenprogramm, einen Taschenrechner und einen Internet-Browser (Internet Explorer, Firefox, etc.). Ein neues Programm zu erstellen, oder auch ein schon bestehendes Programm zu verändern, nennt man “programmieren”. Wenn man programmiert, dann darf man sich einen “Programmierer” nennen. Nun denn, Willkommen im Club!
Programme, oder allgemeiner ausgedrückt, Software, gibt es nicht nur auf einem PC, sondern auch an vielen anderen Orten. Auf Handys und Smartphones laufen Programme für Kalender und Spiele, auch hinter Internet-Seiten, besonders wenn diese dynamisch aufgebaut sind, laufen Programme um die Seiten zusammen zu bauen. Sogar in modernen Haushaltsgeräten und Autos wird Software ausgeführt, um die Funktionen dieser Geräte zu steuern. All diese vielfältigen Möglichkeiten stehen einem mit der Programmierung zur Verfügung.
Ein weiteres Wort für “programmieren” ist auch “entwickeln”, somit ist ein Synonym für “Programmierer” auch “Entwickler”, oder “Software-Entwickler”, da Programme ja Software sind.

Wie programmiert man?

Wie gerade gehört muss man programmieren, um ein Programm zu erhalten. Nur wie genau geht das? Wie programmiert oder entwickelt man Software? Die Antwort: Man muss dem Computer ganz genau erklären, was in dem Programm, dass man erstellen möchte, geschehen soll. Genauer ausgedrückt: Man erteilt dem Computer Befehle. Der Computer führt diese Befehle aus. Ein Programm besteht aus einer Vielzahl von solchen Befehlen. Ein kleines, langweiliges Beispiel: Stellen wir uns vor, wir möchten einen Taschenrechner programmieren. Als Programmierer gebe ich dem Computer den Befehl, dass im Textfeld oben im Taschenrechner die “3″ erscheinen soll, wenn der Benutzer des Taschenrechners auf die Taste “3″ drückt. Solche Befehle erteile ich auch noch für alle anderen Nummerntasten. Dann soll der Benutzer des Taschenrechners auch noch die Tasten “Plus”, “Minus”, “Mal” und “Geteilt” drücken können. Dabei soll jedesmal das entsprechende Rechenzeichen im Textfeld des Taschenrechners oben erscheinen. Wenn ich dem Computer nicht den genauen Befehl erteilen würde, was passieren soll, wenn die Tasten gedrückt werden, dann würde auch nichts passieren. Aber ich erteile diese Befehle, ich programmiere…

Ein weiterer Befehl wäre beispielsweise, dass der Computer die Rechenaufgabe, die der Benutzer durch Drücken der genannten Tasten eingegeben hat, ausrechnen, und das Ergebnis dann in das Textfeld des Taschenrechners schreiben soll. So ergibt sich mit der Zeit eine Sammlung von Befehlen, die genau beschreiben, wie das Programm, der Taschenrechner, funktioniert.

Sehen wir uns einmal folgenden Befehl an:

"Computer, ich befehle dir, wenn der Benutzer die
Taste "3" drückt, soll die Zahl "3" im Textfeld
des Taschenrechners erscheinen."

Unglücklicherweise versteht der Computer diesen Befehl nicht. Er kann diesen menschlichen Satz nicht interpretieren, weil er die Menschen-Sprache nicht versteht. Und selbst wenn der Computer fähig wäre, diesen Befehl zu verstehen… Wo hättest du diesen Satz hinschreiben sollen?

Aber wie funktioniert es denn nun? Wie bringen wir den Computer dazu, uns zu verstehen? Das Geheimnis ist: Die Programmiersprache! Wie bereits erklärt, können wir einem Computer keine menschlichen Befehle geben. Wir müssen ihm Computer-Befehle geben. Wenn wir wollen, dass der Computer Befehle ausführt, müssen wir ihm diese auch so formulieren, wie er sie verstehen kann. Und zwar in einer Programmiersprache, die wir erlernen müssen.

Geht das nicht einfacher?

Der Text hat bis zu diesem Zeitpunkt vermutlich schon deutlich gemacht, dass die Erstellung eines Programms ein technischer Vorgang ist. Zur Beruhigung sei aber gesagt: Computer, sowie auch die Programmiersprachen sind von Menschen gemacht, und deshalb darauf ausgelegt, auch von Menschen verstanden zu werden. Ein wenig logischen Verstand vorausgesetzt …

Womit fangen wir an?

Lasst uns einen Blick nach vorne werfen. Was soll das erste Programm sein, das wir erstellen? In dieser Anleitung beginnen wir mit der Erstellung eines kleinen Computerspiels. Es wird ein kleines aber feines Abenteuer-Spiel werden, ganz ähnlich den Spielbüchern (Wikipedia – Spielbuch), nur dass dies logischerweise kein echtes Buch wird, sondern die Computer-Programm-Variante davon.
In einem Spielbuch beginnt der Leser wie gewöhnlich am Anfang des Buches. Er gelangt dann aber an eine Stelle, an der er sich entscheiden muss, auf welcher Seite er weiter lesen möchte. Meist kann er zwischen zwei oder drei Möglichkeiten auswählen. Beispiel:

"Du kommst an eine Weggabelung.
Möchtest du nach links gehen, dann lies weiter auf Seite 54,
möchtest du nach rechts gehen, lies weiter auf Seite 117."

So hangelt sich der Leser (oder Spieler) dieses Buches durch eine Geschichte, die nicht von Vornherein festgelegt, sondern recht dynamisch ist, fast wie ein Computerspiel.

Die Hauptfigur in unserem Spiel ist ein Abenteurer. Man kann an verschiedene Ort reisen und sich entscheiden, was man dort tun möchte. Mithilfe einer Programmiersprache stehen uns natürlich deutlich mehr Möglichkeiten für die Erstellung dieses Spiels zur Verfügung, als in einem herkömmlichen Spielbuch. Wir werden unsere Spielfigur nicht nur von einem Ort zum anderen reisen lassen, sondern können sie auch Gegenstände in eine virtuelle Tasche stecken und sie Kämpfe austragen lassen. Noch vieles Mehr ist möglich, dieses verbesserte, interaktive Buch ist nur der Anfang. Der Fantasie sind keine Grenzen gesetzt!

P. S.
Eines möchte ich noch erwähnen: Dieses Abenteuer-Spiel wird nicht das allererste Programm sein, das wir erstellen. Kurz vorher werden wir uns noch einer Programmierer-Tradition beugen. Diese besagt, dass das erste Programm immer das “Hallo Welt!”-Programm sein muss, dazu aber später mehr!

Fazit

In diesem Artikel haben wir gelernt, das Programmieren die Tätigkeit ist, dem Computer Befehle zu erteilen, die ganz genau ausdrücken, was der Computer machen soll, und dass man dies auch Software-Entwicklung nennt. Dies geschieht in einer Sprache, die der Computer versteht, der Programmiersprache. Wir werden diese Erkenntnis einsetzen, um erst ein “Hallo Welt!”-Programm, und dann ein kleines Computerspiel zu erstellen.

Posted in Programmieren lernen | Tagged , , , , , , | Leave a comment
Nov 11

Programmieren lernen – Teil 1 (Einleitung)

Herzlich Willkommen zur Artikel-Serie “Programmieren lernen”!
Dieser Artikel ist die Einleitung, eine Erklärung, worum es überhaupt geht.

Wie lernt man Programmieren?

Du möchtest also wissen, wie man Programmieren lernt… Vielleicht hast du ja schon ein bisschen im Internet herum gesucht, aber keine passende und einfache Antwort gefunden. Oder die Antworten waren zu ausführlich und voll mit Fachbegriffen, auf die du dir keinen Reim machen konntest. Alle Erklärungen, die Du gefunden hast, setzten schon Grundlagen voraus, klangen kompliziert oder aufwendig. Vielleicht kennst Du ja das Wort “programmieren”, vielleicht auch “Programmiersprache”. Du weißt aber nicht, was das genau ist, oder was man damit macht? Eventuell bist du sogar über Begriffe wie “C”, “C++”, “Java” oder “Basic” gestolpert, nur was das alles bedeutet und was man damit anfangen soll, ist dir nicht klar…

Das macht alles nichts: Hier bist du hier genau richtig!

Was kannst du von dieser Anleitung erwarten?

Dies ist eine Anleitung, wie du programmieren lernen kannst. Das Besondere daran: Für diese Anleitung sind keinerlei Vorkenntnisse nötig! Alles was du wissen musst, werde ich von Grund auf, Stück für Stück erklären.
Um Programmieren zu lernen, musst du keine jahrelangen Anstrengungen auf dich nehmen, bevor du die ersten Ergebnisse erzielst. Programmieren macht Spaß, und schon nach den ersten Stunden wirst du Erfolgserlebnisse erzielen. Lies einfach diese Anleitung, hier erkläre ich dir alles haarklein und ganz genau.

Wie fängst du an?

Tatsächlich fällt der Einstieg in die Programmierung ohne eine genaue Anleitung recht schwer. Deswegen habe ich mich auch dazu entschlossen, diese Anleitung zu schreiben. Man muss allerdings wissen: Die Schwierigkeit liegt weniger im Thema an sich. Programmieren ist nicht kompliziert. Aber Programmierung besteht aus einigen Teilgebieten. Und gerade am Anfang ist es schwer, einen Überblick über diese Teilgebiete zu bekommen und zu verstehen, wie man diese benutzt, und welche man vielleicht anfangs gar nicht benötigt. Auch gibt es für die gleiche Zielsetzung oft eine Vielzahl von unterschiedlichen Lösungsmöglichkeiten. So ist es schlicht unmöglich, ohne Irrwege einen guten Einstieg zu finden.

Aber damit ist jetzt Schluss: Sieh diese Anleitung als eine Karte durch den Dschungel, um von Grund auf Programmieren zu lernen. Der Dschungel ist riesig und es gibt unendlich viele Wege zum Ziel, aber unendlich viele Wege mehr, die nirgendwo hin führen. Der Weg mit dieser Anleitung führt auf jeden Fall zum Ziel, und ich werde dich bei jedem Schritt begleiten.

Was ist, wenn du etwas nicht verstehst?

Es können immer Fragen auftauchen, die in dieser Anleitung noch nicht behandelt werden. Bitte zögere nicht, Kontakt mit mir aufzunehmen! Ich werde versuchen, die betreffende Stelle im Text zu verbessern oder zu erweitern. Jede noch so kleine Anregung oder Verbesserungsvorschlag ist wichtig, um diesen Text immer besser werden zu lassen.

Kostet es Geld?

Nein! Alles was du benötigst, um diese Anleitung durch zu arbeiten, ist kostenlos verfügbar.

Was brauchst du?

Lediglich ein PC mit Windows, Linux oder MacOS wird vorausgesetzt.

Was sind die Voraussetzungen?

Wie weiter oben versprochen, sind für diese Anleitung keinerlei Vorkenntnisse nötig. Lediglich grundsätzliche Computerkenntnisse, wie beispielsweise das Anlegen und Verwalten von Dateien und Ordnern, wird vorausgesetzt.

Fazit

Nach diesem Einleitungs-Artikel ist dir hoffentlich klar, worum es genau in der Artikel-Serie “Programmieren lernen” geht. Ich hoffe, du findest die Artikel-Serie “Programmieren lernen” hilfreich und ich kann dir einen Teil meiner grenzenlosen Faszination für das Programmieren weitergeben.

Posted in Programmieren lernen | Tagged , , , , , , , , | Leave a comment