LAMPS Tutorial 1.3 (v1.3.6)

Dies ist ein deutschsprachiges Tutorial zum Kompilieren, Installieren und Konfigurieren eines LAMPS Servers. Es wird unter anderem die Installation von Apache, Mod_Perl, PHP, Mod_SSL, MySQL, PostgreSQL und PDFLib in wenigen Schritten und anhand von Beispielen erläutert, sowie die Funktion der Komponenten getestet. Als Betriebssystem dient Linux. Das LAMPS Tutorial richtet sich an Webmaster und/oder Web-Entwickler, die ein Testsystem aufsetzen möchten.

Neuerungen:
Neue Versionen von MySQL, PHP and OpenSSL


1. Inhalt LAMPS Tutorial

1. Inhalt LAMPS Tutorial

2. Die Zutaten und wo man sie bekommt


2. Die Zutaten und wo man sie bekommt


Linux



Es ist grundsätzlich gleichgültig, welche Linux-Distribution verwendet wird. Ich habe das HowTo mit Mandrake 7.2 geschrieben und mit RedHat 7.0, 7.2, 7.3, 8.0, Debian 3.0 und Mandrake 8.0 verifiziert. Eigentlich sollten alle großen Distributionen ab Version 6 problemlos funktionieren.

Die Installation erkläre ich hier nicht, da dies den Rahmen sprengen würde. In den meisten Fällen reicht jedoch einfaches "durchklicken", um zu einem lauffähigen Linux Serversystem zu gelangen. Die Entwicklerpakete müssen auf jedenfall mit installiert werden. Sollte man etwas vergessen haben, kann man das Paket aber später immer noch nachinstallieren.

Linux Distributionen auf Tucows
www.mandrake.com
www.redhat.de
www.suse.de
www.debian.org

Nach oben


Apache 1.3.27



In jedem Fall benötigt wird der Apache Webserver. Zu dem Zeitpunkt als ich dieses Tutorial geschrieben habe, war Version 1.3.27 aktuell. Vermutlich funktioniert es auch mit allen neueren Versionen, zumindest bis zur Version 2.0. Ältere Versionen sollten nicht verwendet werden, da diese bis 1.3.26 eine Sicherheitslücke beinhalten.

Apache Website
Download Apache 1.3.27 (2.2MB)

Nach oben


MySQL 4.0.12



Die MySQL Version, die ich momentan verwende, ist 4.0.12. Sollte eine aktuellere Version verwendet werden, könnte es beim Konfigurieren zu Problemen kommen. Ein Blick in die README oder INSTALL Datei könnte dann weiterhelfen.

Hinweis: Aufgrund der Compilerbugs die wohl erst ab GCC 3.0 ziemlich behoben sind erkäre ich vorerst nur die Installation des Binary-Paketes. Wer möchte kann sich natürlich auch weiterhin von der Mysql-Seite die Sourcen laden und diese compilieren.

MySQL Website
Download MySQL 4.0.12 (Mirror)

Nach oben


PostgreSQL 7.3.1



Anstatt MySQL kann auch z.B. PostgreSQL eingesetzt werden - je nach belieben auch beide. PostgreSQL unterstüzt im Gegensatz zu MySQL Transaktionen, was bei einigen Projekten sehr vorteilhaft sein kann. Es ist allerdings zu beachten, beim Konfigurieren von PHP den entsprechenden Eintrag nicht zu vergessen.

PostgreSQL Website
Download PostgreSQL 7.3.1

Nach oben


PHP 4.3.1



Mit das Wichtigste ist die aktuelle Version von PHP. Seit neustem verfügbar ist die 4.3.1, und die verwenden wir auch.

PHP Website
Download PHP 4.3.1

Nach oben


mod_perl 1.27



Da ich auch auf Perl basierende Seiten im Netz habe, installiere ich das Apache Perl-Modul gleich mit. Voraussetzung hierfür ist, dass Perl installiert ist. Dies wird jedoch meist mit der Distribution automatisch mitinstalliert.

Mod-Perl Website
Download mod_perl 1.27

Nach oben


OpenSSL 0.9.7a



Um Apache mit SSL laufen zu lassen, wird OpenSSL benötigt, damit das mod_ssl Modul kompiliert werden kann. Ich verwende OpenSSL Version 0.9.7a.

OpenSSL Website
Download OpenSSL 0.9.7a

Nach oben


mod_ssl 2.8.13



Wichtig beim mod_ssl Modul ist, dass es zum Apache passt. Falls also eine neuere Version des Apache verwendet wird, muss die passende mod_ssl Version von der mod_ssl-Homepage heruntergeladen werden.

mod_ssl Website
Download mod_ssl 2.8.13 für Apache 1.3.27

Nach oben


PDFLib 4.0.3



PDFLib ermöglicht es, von PHP aus PDF-Dateien dynamisch zu erstellen. Dies ist sehr praktisch um z.B. formatierte Vorlagen oder Belege zum Ausdrucken für einen Kunden zu erzeugen.

PDFLib Homepage
Download pdflib-4.0.3.tar.gz

Nach oben



3. Das Auspacken

Bevor es richtig los geht, müssen alle tar.gz Dateien zunächst einmal entpackt werden. Es ist erforderlich, sich als Root auf dem Rechner einzuloggen und alle Dateien nach /usr/local/src/lamps zu kopieren. Es ist natürlich auch möglich, die Dateien in einen anderen Ordner zu kopieren, aber das Tutorial wird im folgenden nur diesen Pfad verwenden.

cd /usr/local/src/lamps
for i in `ls *.gz`; do tar zxf $i; done;


Die Archiv-Dateien werden nun nicht mehr gebraucht. Ich würde dennoch empfehlen, sie zu speichern oder auf CD zu brennen, eventuell zusammen mit diesem Tutorial als Backup.

Nach oben



4. Das Backen - kompilieren und installieren


MySQL



Die folgenden Zeilen installieren MySQL. Es ist möglich das es den User bzw. die Gruppe Mysql schon gibt. Fehler in den ersten beiden Zeilen diesbezüglich können ignoriert werden. Am Ende starten wir den Server.

cd /usr/local/src/lamps
mkdir /usr/local/mysql
mv mysql-standard-4.0.12-pc-linux-i686/ /usr/local/mysql/4.0.12
cd /usr/local/mysql
ln -s 4.0.12/ current
groupadd mysql
useradd -g mysql mysql
cd current
scripts/mysql_install_db
chown -R root .
chown -R mysql data/
chgrp -R mysql .
bin/safe_mysqld &

Als nächstes legen wir ein paar symbolische Links an und ändern das Root-Passwort. Ich verwende hier geheim als Beispielpasswort.

cd /usr/bin
ln -s /usr/local/mysql/current/bin/mysql mysql
ln -s /usr/local/mysql/current/bin/mysqldump mysqldump
ln -s /usr/local/mysql/current/bin/mysqladmin mysqladmin
ln -s /usr/local/mysql/current/bin/mysql_config mysql_config
mysqladmin -u root password 'geheim'

Mir bereitete auch einmal eine alte my.cnf in /etc/ Probleme, die dann dazu führte, dass mysql_install_db die Datenbank nach /var/lib/mysql/data statt nach /home/myqsl/data installiert hat und MySQL dann auch nicht lief. Sollte dies der Fall sein, ist die my.cnf Datei zu löschen oder umzubennen

Worauf ich zusätzlich immer wieder hereinfalle, ist zu versäumen, die MySQL-Libraries nicht in den Lib-Pfad einzutragen. Das erkennt man daran, wenn beim Start von Apache später eine Fehlermeldung ausgegeben wird, dass die Datei libmysqlclient.so.10 nicht gefunden wurde. Sollte dieses Problem auftreten, ist die Datei /etc/ld.so.conf zu öffnen und am Ende /usr/local/mysql/current/lib einzufügen. Danach ist folgendes auszuführen:

/sbin/ldconfig

Damit MySQL beim Starten des Systems mit hochläuft, fehlen noch die folgenden Zeilen:

cd /usr/local/mysql/current cp support-files/mysql.server /etc/rc.d/init.d
chmod 744 /etc/rc.d/init.d/mysql.server
cd /etc/rc.d/rc2.d
ln -s ../init.d/mysql.server S20mysql.server
ln -s ../init.d/mysql.server K20mysql.server
cd /etc/rc.d/rc3.d
ln -s ../init.d/mysql.server S20mysql.server
ln -s ../init.d/mysql.server K20mysql.server

In der mysql.server Datei sind noch die Pfade anzupassen. Aus /usr/local/mysql wird /usr/local/mysql/current und aus /usr/local/mysql/data /usr/local/mysql/current/data
Hinweis: Eventuell benutzt die verwendete Distribution einen anderen Runlevel als rc2 oder rc3. Den aktuellen Runlevel bekommt man heraus, indem man /sbin/runlevel in der Konsole eingibt.

Tipp: Bei Suse liegen die Startscripte in /etc/init.de anstatt /etc/rc.d/init.d

Tipp: Sollte Webmin verwendet werden, muss in der Modulkonfiguration noch einiges geändert werden, zum Beispiel der Pfad zu den Datenbanken.

Nach oben


PostgreSQL



Falls PostgreSQL nicht installiert werden soll, kann dieser Teil übersprungen werden. Es ist in diesem Falle daran zu denken, beim Kompilieren von PHP --with-pgsql wegzulassen.

Wir kompilieren und installieren nun PostgreSQL. Die Installation ist etwas verzwickter als die von MySQL.

cd /usr/local/src/lamps/postgresql-7.3.1
./configure --prefix=/usr/local/pgsql/7.3.1/
make
make install
ln -s /usr/local/pgsql/7.3.1 /usr/local/pgsql/current
cd /usr/local/pgsql/current
groupadd pgsql
useradd pgsql
mkdir data
chown -R root .
chown -R pgsql data
chgrp -R pgsql .
su - pgsql
cd /usr/local/pgsql/current
bin/initdb -D ./data
exit

Wichtig (wie auch bei MySQL): Der Lib-Pfad muss auf die PostgreSQL Dateien verweisen. Dazu hängen wir (falls noch nicht vorhanden) mit einem Editor unten an die Datei /etc/ld.so.conf eine Zeile mit /usr/local/pgsql/current/lib an und führen danach wieder ldconfig aus.

Wir passen nun das Startskript an und kopieren es an die richtige Stelle.(Bei Suse beachten: /etc/init.d verwenden statt /etc/rc.d/init.d)

cd /usr/local/src/lamps/postgresql-7.3.1
cp contrib/start-scripts/linux /etc/rc.d/init.d/pgsql
chmod 744 /etc/rc.d/init.d/pgsql

Nun wird die Datei noch mit einem Texteditor geöffnet und folgende Zeilen werden angepasst:

# prefix=/usr/local/pgsql ändern in
prefix=/usr/local/pgsql/current

# PGDATA="/usr/local/pgsql/data" ändern in
PGDATA="/usr/local/pgsql/current/data"

# PGUSER=postgres ändern in
PGUSER=pgsql

Danach können wir PostgreSQL starten, eine test Datenbank erzeugen und uns probeweise einloggen.

Hinweis: Aus der Psql-Konsole kommt man mit \q wieder heraus.

/etc/rc.d/init.d/pgsql start
/usr/local/pgsql/current/bin/createdb -U pgsql test
/usr/local/pgsql/current/bin/psql -U pgsql test

Hat dies alles geklappt, ist das Gröbste überstanden. Um psql nicht immer über den Pfad aufrufen zu müssen erzeugen noch einen symbolischen Link.

ln -s /usr/local/pgsql/current/bin/psql /usr/local/bin/psql

Damit PostgreSQL auch beim Serverstart geladen, wird fügen wir noch einige Startlinks hinzu. (Bei Suse wieder beachten das Startscript liegt in /etc/init.d)

cd /etc/rc.d/rc2.d
ln -s ../init.d/pgsql S20psql
ln -s ../init.d/pgsql K20psql

cd /etc/rc.d/rc3.d
ln -s ../init.d/pgsql S20psql
ln -s ../init.d/pgsql K20psql

Hinweis: Sollte Webmin verwendet werden, muss in der Modulkonfiguration noch einiges geändert werden, zum Beispiel der Pfad zu den Datenbanken.

Nach oben


OpenSSL



Die Installation von OpenSSL gestaltet sich relativ einfach. Auch hier wird mit --prefix der Zielordner angegeben und wiederum ein symbolischer Link erzeugt.

cd /usr/local/src/lamps/openssl-0.9.7a
./config --prefix=/usr/local/openssl/0.9.7a
make
make test
make install
ln -s /usr/local/openssl/0.9.7a /usr/local/openssl/current

Hat alles geklappt? Ein kleiner Hinweis am Rande: Zuviel Kaffee ist ungesund. Aber wir haben ja schon etwa ein Drittel geschafft.

Nach oben


Apache und Mod_SSL



Nun bauen wir Apache und Mod_SSL. Dabei wird nun Apache als DSO-Version kompiliert. Das heißt, Module wie PHP etc. können dynamisch geladen werden.

Hinweis am Rande: Wer SUEXEC bei Apache einsetzen will muß PHP als CGI laufen lassen, als Modul funktioniert das zumindest in den 1.x Apaches nicht.

Zuerst einmal müssen die Apache Quellen für Mod_SSL gepatched werden. Im selben Schritt werden die Compiler-Parameter für Apache mitgegeben. Damit sparen wir uns nachher bei Apache das ./configure.

cd /usr/local/src/lamps/mod_ssl-2.8.13-1.3.27
./configure --with-apache=../apache_1.3.27/ \
--with-ssl=../openssl-0.9.7a/ \
--prefix=/usr/local/apache/1.3.27 \
--enable-module=most \
--enable-shared=max \
--enable-module=ssl

Nun wird Apache kompiliert. Sollte make abbrechen und "ndbm.h" erwähnt werden fehlen dir vermutlich noch die db1-Pakete. Bei RedHat sind dies db1-.. und db1-devel..
Ich empfehle dir danach nochmal in den mod_ssl Ordner zu wechseln und configure erneut auszuführen.

cd /usr/local/src/lamps/apache_1.3.27
make

Als nächstes werden die Zertifikate erzeugt. Dabei sollte auf die Fragen analog zu unserem Beispiel unten geantwortet werden. (Natürlich sollte für Firma, Ort, eMail etc. etwas Sinnvolles eingesetzt werden.)

make certificate TYPE=custom

Signature Algorithm: R
Country Name: "DE"
State or Province: "NRW"
Localty Name: "Duesseldorf"
Organization Name: "Meinefirma"
Organizational Unit Name: "CA"
Common Name: "Meinefirma CA"
Email Address: "ca@meinefirma.de"
Certificate Validity: "365"

Certificate Version: 3

Country Name: "DE"
State or Province: "NRW"
Localty Name: "Duesseldorf"
Organization Name: "Meinefirma"
Organizational Unit Name: "Webmaster"

Common Name: "testserver.meinefirma.de"
Email Address: "www@testserver.meinefirma.de"
Certificate Validity: "365"

Certificate Version: 3

Encrypt the private key now: n

Encrypt the private key now: n

Soviel zu OpenSSL. Jetzt können wir Apache installieren.

make install
ln -s /usr/local/apache/1.3.27 /usr/local/apache/current

Damit Apache auch beim Booten startet, kopieren wir noch das Startskript und erstellen die Links für die Runlevel zwei und drei. (Bei Suse wieder an die unterscheidelichen Pfade denken)

cp /usr/local/apache/current/bin/apachectl \
/etc/rc.d/init.d/httpd
chmod 744 /etc/rc.d/init.d/httpd
cd /etc/rc.d/rc2.d
ln -s ../init.d/httpd S20httpd
ln -s ../init.d/httpd K20httpd
cd /etc/rc.d/rc3.d
ln -s ../init.d/httpd S20httpd
ln -s ../init.d/httpd K20httpd

Zum Schluss sollte die Datei /etc/rc.d/init.d/httpd mit einem Texteditor geöffnet und auf der ersten Seite in allen Pfaden 1.3.27 durch current ersetzt werden, damit man beim nächsten Update die apachectl nicht mit der neuen Version überschreiben muss.

Als nächstes machen wir uns daran, die Module zu kompilieren.

Nach oben


PDFLib



Die Installation von PDFLib gestaltet sich auch relativ einfach. Sie besteht nur aus drei Zeilen. Wie oben bereits angemerkt, kann dieser Teil weggelassen werden, falls PDFLib nicht benötigt wird.

cd /usr/local/src/lamps/pdflib-4.0.3/ ./configure --with-shared-pdflib --enable-cxx
make
make test

Die vierte Zeile erzeugt im Ordner test eine Datei namens pdftest.pdf. Existiert diese, funktioniert alles und wir können PDFLib installieren.

make install

PDFLib ist nun installiert. Damit PDFLib auch gefunden wird, fehlt wiederum ein Eintrag in der ld.so.conf-Datei. Deshalb ist diese zu öffnen und, falls noch nicht vorhanden, eine Zeile mit /usr/local/lib hinzuzufügen. Anschliessend wird wieder /sbin/ldconfig ausgeführt.

Nach oben


PHP



Machen wir uns nun daran, PHP zu kompilieren und installieren. Ganz am Schluss wird der Config-Pfad auf /etc/ gelegt. Darin wird nachher auch die php.ini gespeichert.

Wenn PostgreSQL, MySQL oder PDFLib nicht installiert wurden, sind die entsprechenden Zeilen in der configure-Anweisung einfach wegzulassen.

Die letzten Zeilen für GD-Support können ebenfalls weggelassen werden. Allerdings ist das GD-Modul sehr nützlich zur dynamischen Erstellung von Grafiken mit PHP. Dabei ist zu beachten das noch einige zusätzliche Pakete installiert sein müssen. (Bei Redhat z.B.: libjpeg*.rpm, libtiff*.rpm, freetype*.rpm und libpng*.rpm) In den meisten Fällen sollten die Pakete allerdings schon installiert sein. Prüfbar ist dies z.B. mit rpm -qa | grep libjpeg. Nach diesem Befehl sollten zwei Zeilen erscheinen, von denen in einer "devel" steht.

Nun können wir PHP konfigurieren:

cd /usr/local/src/lamps/php-4.3.1
./configure \
--with-apxs=/usr/local/apache/current/bin/apxs \
--with-mysql=/usr/local/mysql/current/ \
--with-pgsql=/usr/local/pgsql/current/ \
--with-pdflib=/usr/local/ \
--with-zlib-dir=/usr/lib/ \
--enable-calendar \
--enable-versioning \
--enable-sockets \
--enable-ftp \
--with-config-file-path=/etc \
--with-gd \
--with-jpeg-dir=/usr/lib \
--with-tiff-dir=/usr/lib \
--with-png-dir=/usr/lib \
--with-freetype-dir=/usr/lib
make
make install

Fast schon zu einfach, oder? Jetzt nur noch die php.ini kopieren und das war's dann schon. Ob allerdings alles geklappt hat sehen wir erst nacher so richtig wenn wir phpinfo im Browser aufrufen.

cp php.ini-dist /etc/php.ini

Nach oben


mod_perl



Mod_Perl zu konfigurieren ist simpel. Voraussetzung ist dabei, dass Perl installiert ist. Dazu genügt die RPM der jeweiligen Distribution. Getestet werden kann dies, indem

perl -v

eingegeben wird. Dabei müsste ein kurzer Text ausgegeben werden. Der Rest ist dann ganz einfach:

cd /usr/local/src/lamps/mod_perl-1.27
perl Makefile.PL \
USE_APXS=1 \
WITH_APXS=/usr/local/apache/current/bin/apxs \
EVERYTHING=1

make
make install

Beim nächsten Neustart von Apache sollte mod_perl nun aktiv sein.

Nach oben


Sonstiges und Konfiguration



Apache

Damit Apache automatisch mit mod_ssl startet, muss das Startskirpt angepasst werden. Dieses ist unter /etc/rc.d/init.d/httpd zu finden. Es ist dort nach der "start)"-Zeile zu suchen und diese wie folgt abzuändern:

start)
if [ $RUNNING -eq 1 ]; then
  echo "$0 $ARG: httpd (pid $PID) already running"
  continue
fi
#Original:
#if $HTTPD ; then
#geaendert, -DSSL eingefuegt:
if $HTTPD -DSSL; then
  echo "$0 $ARG: httpd started"
else
  echo "$0 $ARG: httpd could not be started"
  ERROR=3
fi
;;

Damit PHP funktioniert muss noch in der /usr/local/apache/current/conf/httpd.conf dafür gesorgt werden, dass die PHP-Endungen mit dem Modul verknüpft sind. Früher stand das schon in der Config und man musste es nur auskommentieren. Seit Apache 1.3.23 scheinen diese Zeilen entfernt worden zu sein. Es sollte einfach in der httpd.conf etwas wie folgt zu finden sein:

<IfModule mod_php4.c>
  AddType application/x-httpd-php .php .php3 .php4 .phtml
  AddType application/x-httpd-php-source .phps
</IfModule>

Dies sollte dort am besten dort stehen, wo auch die AddType-Zeilen für .tgz und .php zu finden sind.

Damit als Indexfile nicht nur HTML-Dateien möglich sind, ist nach folgender Zeile zu suchen:

DirectoryIndex index.html

Dieser sind weitere Indexseiten durch Leerzeichen getrennt hinzuzufügen, wie z.B. index.php, index.php4 oder default.htm, je nach Belieben.

Nun kann Apache gestartet werden. Und zwar mit:

/etc/rc.d/init.d/httpd start

Ob alles funktioniert, kann man zum Beispiel mit Lynx testen, falls man diesen installiert hat.

lynx http://localhost

PHP

PHP lässt sich gut testen, wenn man in /home/apache/htdocs z.B. eine info.php mit folgendem Inhalt erzeugt:

<?php
phpinfo();
?>

Ruft man diese über Lynx oder einen anderen Browser auf, sollte man eine Statusseite mit allen Modulen und sonstigen Parametern von PHP angezeigt bekommen. Hier sieht man auch gleich falls das eine oder andere Modul nicht kompiliert wurde.

PDFLib

PDFLib kann man auch relativ einfach mit einem kleinen PHP-Skript testen. Wichtig ist, dass der User Nobody in dem Ordner, in dem das Skript läuft, Schreibrechte hat.

<?PHP
$file = fopen("php.pdf", "w");
$dokument = pdf_open($file);
pdf_begin_page($dokument,200,100);
pdf_set_font($dokument,"Times-Roman",14, "winansi");
pdf_set_text_pos($dokument,20,50);
pdf_show($dokument,"Gratuliere PDFLib funktioniert");
pdf_end_page($dokument);
$dokument = pdf_close($dokument);
fclose($file);
header("location:php.pdf\n\n");
?>

Sonstiges

Zum Abschluss kann noch getestet werden ob SSL läuft, indem man https://localhost über Lynx oder seinen Browser aufruft.

Um mit anderen Distributionen konformer zu sein, erzeuge ich noch einen Ordner /etc/httpd und einen Link zum conf sowie zum logs Ordner von Apache.

mkdir /etc/httpd
ln -s /usr/local/apache/current/conf /etc/httpd/conf
ln -s /usr/local/apache/current/logs /etc/httpd/logs

So, das LAMPS-System ist soweit fertig. Ich möchte noch empfehlen, die Kiste einmal neu zu starten, um zu schauen, ob Apache und MySQL automatisch anlaufen.

Tipp: Sollte zum Beispiel SSL nicht funktionieren, obwohl Apache läuft, kann man versuchen die Firewall herunterzufahren um festzustellen ob eventuell der SSL-Port gesperrt ist.

/etc/rc.d/init.d/ipchains stop

Für iptables gilt das gleiche. Es sollte nicht vergessen werden, die Firewall mit dem Parameter start wieder hochzufahren, sobald der TCP-Port 443 freigeschaltet ist.

Nach oben

Disclaimer









Sämtliche Inhalte dieser Website können im WWW wiedergegeben werden, sofern im unmittelbaren Zusammenhang Angaben zum Copyright erfolgen und ein direkter HTML-Link auf die entsprechende Seite unter lamps.efactory.de gesetzt wird.

eFactory
GmbH & Co. KG
stengel@eFactoryy.de

Goethestraße 75
40237 Düsseldorf

Tel.: 0211 44 03 97-0
Fax: 0211 44 03 97-40