Einrichtung eines LAMP (Linux, Apache, MySQL, PHP)

Aus HackerWiki

Contents

Einrichtung eines LAMP (Linux, Apache, MySQL, PHP)

Bitmuncher 04:29, 1. Mai 2006 (CEST)

Im folgenden werde ich erläutern, wie man ein LAMP-System auf Basis eines bereits installierten Linux einrichtet. Dabei werden die notwendigen Server-Komponenten aus dem Quelltext installiert um eine schnelle Aktualisierung zu ermöglichen.

Sollten im Folgenden bei Shell-Befehlen Werte in spitzen Klammern '< >' angegeben sein, sind diese durch einen zum System passenden Wert zu ersetzen.

Download der benötigten Software

Zuerst einmal müssen wir natürlich die benötigten Quelltexte besorgen. Wo man diese her bekommt, kann der folgenden Tabelle entnommen werden.

Apache2http://httpd.apache.org/download.cgi
MySQL 4.1http://dev.mysql.com/downloads/mysql/4.1.html
PHP5http://www.php.net/downloads.php

Wir downloaden also die aktuellsten Quelltexte nach /usr/src und haben erstmal alles was wir brauchen. Eventuell benötigte Bibliotheken werden von den gängigen Distributionen mitgeliefert.

Einrichtung der MySQL-Datenbank

Wir wechseln nun in das Verzeichnis /usr/src und entpacken dort zuerst einmal die Quelltexte der MySQL.

bash# cd /usr/src
bash# tar -xzf mysql-4.1.*.tar.gz

Weiter geht es im entpackten Verzeichnis /usr/src/mysql-<version>. Dort konfigurieren wir die Quelltexte und kompilieren sie, um sie dann letztendlich zu installieren.

bash# cd /usr/src/mysql-<version>
bash# ./configure --prefix=/usr/local/mysql --with-blackhole-storage-engine --with-csv-storage-engine \
    --with-archive-storage-engine --with-berkeley-db --with-isam --with-big-tables --with-openssl --with-vio \
    --with-mysqlfs --with-mysqld-user=mysql --with-gnu-ld --enable-assembler --enable-local-infile \
    --enable-thread-safe-client --enable-dependency-tracking --datadir=/home/mysql --sysconfdir=/etc
bash# make
bash# make install

Sollte configure sich beschweren, dass irgendwelche Bibliotheken fehlen, können diese mit dem Paketmanager der Distribution meist problemlos installiert werden (nicht vergessen, dass die *-dev- bzw. *-devel-Pakete notwendig sind).

Jetzt haben wir ein Verzeichnis /usr/local/mysql, das allerdings bisher noch root gehört. Wir legen uns also eine Gruppe und einen Benutzer für MySQL an und sorgen dafür, dass die Rechte richtig gesetzt sind. Ausserdem benötigen wir noch das Daten-Verzeichnis /home/mysql, in dem unsere Datenbanken, die Server-Logs und die Socket-Datei zukünftig abgelegt werden.

bash# groupadd mysql
bash# useradd -g mysql -s /bin/false mysql
bash# mkdir /home/mysql
bash# chown mysql:mysql /home/mysql
bash# chown -R mysql:root /usr/local/mysql

Jetzt sind wir bereit die Default-Datenbanken mysql und test zu installieren.

bash# scripts/mysql_install_db --user=mysql --datadir=/home/mysql/

Damit ist unsere Datenbank fast fertig für den ersten Start. Wir müssen vorher nur noch eine Konfigurationsdatei anlegen, die etwa wie folgt aussehen könnte:

[client]
socket          = /home/mysql/mysql.sock

[mysqld]
datadir=/home/mysql
socket          = /home/mysql/mysql.sock
set-variable    = key_buffer=128M
set-variable    = max_allowed_packet=1M
set-variable    = table_cache=512
set-variable    = sort_buffer=2M
set-variable    = record_buffer=2M
set-variable    = thread_cache=4
set-variable    = myisam_sort_buffer_size=16M
set-variable    = max_connections=300

[safe_mysqld]
err-log=/home/mysql/mysqld.log

[mysqldump]
quick
max_allowed_packet = 16M

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Nun kopieren wir noch das Start-Skript, das den Quelltexten beiliegt nach /etc/init.d/ und unsere Datenbank kann gestartet werden.

bash# cp support-files/mysql.server /etc/init.d

Wir können die MySQL-Datenbank jetzt mit

bash# /etc/init.d/mysql.server start

starten. Sollte die MySQL wider Erwarten nicht starten, sollte man die Log-Dateien in /home/mysql durchforsten und entsprechende Fehler beheben. Wenn alles läuft, verlinken wir nun noch die von MySQL mitgelieferten Programme nach /usr/local/bin und setzen ein Passwort für den root-Benutzer der Datenbank.

bash# ln -s /usr/local/mysql/bin/* /usr/local/bin
bash# mysqladmin -u root password 'geheim'

Damit ist die Einrichtung der Datenbank abgeschlossen und wir können uns nun dem Webserver zuwenden.

Einrichtung des Apache2-Webservers

Natürlich müssen wir auch hier zuerst wieder die Quelltexte entpacken, diese konfigurieren, kompilieren und installieren.

bash# cd /usr/src
bash# tar -xzf httpd-2.*.tar.gz
bash# cd /usr/src/httpd-<version>
bash# ./configure --prefix=/usr/local/apache2 --enable-so --with-ssl --enable-cgi --enable-modules=all \
    --enable-mods-shared=all --enable-ssl
bash# make
bash# make install

Auch für den Webserver benötigen wir einen eigenen Benutzer. Ausserdem können wir die Start-Datei apachectl nach /etc/init.d/ verlinken, da dort alle Start-Skripte des Systems liegen. Um das Verlinken in die Runlevel kümmern wir uns später. Ausserdem richten wir uns das Dokumenten-Verzeichnis /home/www für den Apache ein.

bash# useradd -g users -s /bin/false www
bash# ln -s /usr/local/apache2/bin/apachectl /etc/init.d
bash# ln -s /usr/local/apache2/bin/* /usr/local/bin
bash# mkdir /home/www
bash# chown www:users /home/www
bash# chmod a+rwx /home/www
bash# chmod o-w /home/www

In unser Dokumenten-Verzeichnis kann nun jeder Benutzer Dateien ablegen, der der Gruppe users angehört. Sofern die Gruppe users nicht existiert, muss sie natürlich angelegt werden.

bash# groupadd users

Zu guter Letzt editieren wir die Datei /usr/local/apache2/conf/httpd.conf und passen sie unseren Vorstellungen entsprechend an. Das koennte z.B. wie folgt aussehen:

ServerRoot "/usr/local/apache2"
Listen 80

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule status_module modules/mod_status.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule asis_module modules/mod_asis.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule include_module modules/mod_include.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule setenvif_module modules/mod_setenvif.so

<IfModule !mpm_winnt_module>
<IfModule !mpm_netware_module>
User www
Group users
</IfModule>
</IfModule>

# hier bitte die Email-Adresse des Administrators eintragen
ServerAdmin meine@emailadresse.de

# hier bitte die richtige Domain eintragen
ServerName meinedomain.de:80

DocumentRoot "/home/www"

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

<Directory "/home/www">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
</FilesMatch>

ErrorLog logs/error_log

LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog logs/access_log common
</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/apache2//cgi-bin/"
</IfModule>

<Directory "/home/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

DefaultType text/plain

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

NameVirtualHost *

<VirtualHost *>
   # hier bitte die richtige Email-Adresse des Administrators eintragen
   Serveradmin meine@emailadresse.de
   DocumentRoot /home/www
   # hier bitte die richtige Domain des Servers eintragen
   ServerName meinedomain.de
   ErrorLog /var/log/httpd/error_log
   CustomLog /var/log/httpd/access_log common
   RewriteEngine on
   RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
   RewriteRule .* - [F]
</VirtualHost>

<VirtualHost *>
   # hier bitte die richtige Email-Adresse des Administrators eintragen
   Serveradmin meine@emailadresse.de
   DocumentRoot /home/www
   # hier bitte die richtige Domain des Servers eintragen
   ServerName www.meinedomain.de
   ErrorLog /var/log/httpd/error_log
   CustomLog /var/log/httpd/access_log common
   RewriteEngine on
   RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
   RewriteRule .* - [F]
</VirtualHost>

Einrichtung von PHP5

Nun fehlt uns nur noch PHP5 zu unserem Glück. Auch hier entpacken wir wieder die Quelltexte und machen das bekannte 3-Schritt-Verfahren Konfigurieren->Kompilieren->Installieren.

bash# cd /usr/src
bash# tar -xzf php-5.*.tar.gz
bash# cd php-<version>
bash# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs \
    --with-mysql=/usr/local/mysql/ --sysconfdir=/etc --with-_lib=lib --with-config-file-path=/etc \
    --disable-debug --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path \
    --enable-exif --enable-filepro --enable-force-cgi-redirect --enable-ftp --enable-gd-imgstrttf \
    --enable-gd-native-ttf --enable-inline-optimization --enable-magic-quotes --enable-mbstr-enc-trans \
    --enable-mbstring --enable-mbregex --enable-safe-mode --enable-shmop --enable-sigchild --enable-sysvsem \
    --enable-sysvshm --enable-track-vars --enable-trans-sid --enable-versioning --enable-wddx --enable-yp \
    --with-bz2 --with-dom --with-ftp --with-gettext --with-gmp --with-mcal --with-mcrypt \
    --with-readline --with-ttf --with-xml --with-zlib=yes --with-gd \
    --with-openssl --with-curl --with-iconv --with-mm --with-soap --with-pear --enable-sockets \
    --enable-memory-limit 
bash# make
bash# make install

Sicherlich wird configure hier wieder wegen einigen Bibliotheken meckern, aber da meist recht genau angegeben wird, welche Bibliothek fehlt, sollte das Auffinden der zugehörigen -dev- bzw. -devel-Pakete im Paketmanager der Distribution kein Problem sein.

Nach der Installation benötigen wir noch die Datei /etc/php.ini. Beispiel-Dateien finden wir im Quelltext-Verzeichnis von PHP.

bash# cp /usr/src/php-<version>/php.ini-recommended /etc/php.ini

Damit das PHP-Modul vom Apache auch geladen wird und PHP-Dateien auch mit PHP geparsed werden, müssen wir noch sicherstellen, dass das 'make install' PHP auch richtig in die /usr/local/apache2/conf/httpd.conf eingetragen hat. In dieser müssen nun am Ende zwei Zeilen der folgenden Form zu finden sein:

LoadModule php5_module        modules/libphp5.so
AddType application/x-httpd-php .php

Sind diese 2 Zeilen in der Datei nicht zu finden, tragen wir sie nach und können endlich unseren Webserver starten. Damit wir aber auch überprüfen könenn, ob er auch richtig funktioniert, legen wir uns die Datei /home/www/index.php an und fügen dort folgenden Inhalt ein:

<?
    phpinfo();
?>

Jetzt starten wir den Server mit

bash# /etc/init.d/apachectl start

und sollten nun ziemlich detaillierte Informationen über unseren Server erhalten, wenn wir mit dem Browser die Domain des Servers besuchen. Jetzt müssen wir nur noch mit unserem Lieblings-Init-Editor (rcconf, ksysv o.ä.) dafür sorgen, dass die Skripte /etc/init.d/mysql.server und /etc/init.d/apachectl beim Systemstart gestartet werden und die Einrichtung unseres LAMP ist abgeschlossen. Natürlich kann das Verlinken der Start-Skripte in die richtigen Runlevel auch "per Hand" erfolgen. Ich werde darauf jetzt aber nicht genauer eingehen, da oft verschiedene Default-Runlevel von den Distributionen genutzt werden. Ausserdem gehe ich einfach mal davon aus, dass jemand, der einen Webserver aufsetzt und spaeter verwalten will, die notwendigen Kenntnisse über seine Distribution hat um das Verlinken in die Runlevel problemlos machen zu können.

Persönliche Werkzeuge