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.
| Apache2 | http://httpd.apache.org/download.cgi |
| MySQL 4.1 | http://dev.mysql.com/downloads/mysql/4.1.html |
| PHP5 | http://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.

