Ein Webserver, wie er bei einem Hoster steht! (ISP-like Webserver)

Es gibt mittlerweile viele Wege um einen Webserver aufzusetzen und ihn anschließend optimal zu konfigurieren. Ich zeige euch heute eine der leichtesten und zugleich effektivsten. 

Die meisten Admins versuchen das Problem mit den Sicherheitsfeatures von PHP zu erschlagen, und spielen mit Konfigurationen wie open_basedir oder safe_mode rum, andere versuchen PHP - mit Hilfe des Paketes suphp - als den jeweiligen User auszuführen. 
Meine Methode geht direkt auf den Apache los, dort wo es wohl am schlauesten ist. Mit dem Paket apache2-mpm-itk von Ubuntu bzw. Debian ist es möglich jeden VHost als einen separaten User auszuführen.

Ich habe mich momentan für den Ubuntu 10.04 LTS Server entschieden, da hier alle benötigten Pakete in einer aktuellen Version vorhanden sind. Für die Installation benötigt ihr folgende Befehle:

# Superuser rechte erlangen sudo su # Apache / PHP / Mysql / PureFTPD aptitude install apache2-mpm-itk 
aptitude install php5 php5-curl php5-gd php5-imagick php5-imap php5-mcrypt php5-mysql 
aptitude install mysql-server 
aptitude install pure-ftpd # Editor aptitude install vim-nox

Falls bei eurer Installation kein aptitude vorhanden ist müsst ihr es vorher mit "apt-get install aptitude" installieren.

Konfiguration des FTP-Servers:

PureFTPD ist sehr sicher und leicht zu konfigurieren. Für einen reibungslosen Betrieb Schlage ich folgende Parameter vor:

   cd /etc/pure-ftpd/conf
   echo yes > BrokenClientsCompatibility
   echo yes > ChrootEveryone
   echo yes > DontResolve
   echo 4 > MaxClientsPerIP
   echo 50 > MaxClientsNumber

danach müsst ihr den FTP Server neustarten "/etc/init.d/pure-ftpd restart"

Da PureFTPD und apache2-mpm-itk auf Unixbenutzer geht, müssen wir normale Benutzer anlegen. Natürlich wollen wir nicht dass diese Benutzer einen Shell-Zugang auf unseren Server bekommen. Deshalb fügen wir /dev/null zu den shells hinzu - was dazu führt, dass User den FTP-Dienst benutzen können, jedoch keine Shell auf dem Server aufrufen dürfen.
Mithilfe von "echo /dev/null >> /etc/shells" fügt ihr /dev/null an das Ende der Datei hinzu.

Einen Benutzer anlegen:
 
   mkdir /var/www/www.example.com
   mkdir /var/www/www.example.com/www
   useradd -d /var/www/www.example.com/ -s /dev/null user1
   passwd user1
   chown user1.user1 /var/www/www.example.com -R
   mkdir /var/www/www.example.com/logs

Es ist gewollt, dass der Ordner logs als User root angelegt wird - der ftp-Nutzer sollte keine Erlaubnis haben Log-Dateien zu löschen, sondern nur anzusehen.
An diesem Punkt könnt ihr euch zum ersten mal auf eurem Server via ftp einloggen.

Konfiguration von Apache:

In der Standardkonfiguration ist das rewrite modul, welches von vielen cms'en wie Joomla oder Typo3 gerne verwendet wird deaktiviert. Mit dem Befehl "a2enmod rewrite" könnt ihr dieses Modul aktivieren. Nach jeder Änderung müsst ihr den Webserver neustarten "/etc/init.d/apache2 restart"
Der restliche Zauber findet in der VHost datei statt. Hier ein Beispiel wie sie bei mir aussieht:

   vi /etc/apache2/sites-available/www.example.com
   <VirtualHost *:80>
           ServerAdmin me@example.com
           ServerName www.example.com
           ServerAlias example.com
   
       php_admin_value open_basedir "/var/www/www.example.com:/tmp"
   
           DocumentRoot /var/www/www.example.com/www
           <Directory />
                   Options FollowSymLinks
                   AllowOverride None
           </Directory>
           <Directory /var/www/www.example.com/www/>
                   Options FollowSymLinks MultiViews -Indexes
                   AllowOverride All
                   Order allow,deny
                   allow from all
           </Directory>
   
           ErrorLog /var/www/www.example.com/logs/error.log
           LogLevel warn
           CustomLog /var/www/www.example.com/logs/access.log combined
           <IfModule mpm_itk_module>
                   AssignUserId user1 user1
           </IfModule>
   </VirtualHost>


Zum Schluss die default Seite deaktivieren und die neu erstellte Seite aktivieren und anschließend den Webserver reloaden.

   a2dissite default
   a2ensite www.example.com
   /etc/init.d/apache2 reload

Logrotate konfigurieren:

Ich habe zusätzlich noch Logrotate so konfiguriert, dass die Apache Logs ein Jahr aufgehalten werden. Eine neue Datei "vi /etc/logrotate.d/www.example.com" mit folgendem Inhalt anlegen:

   /var/www/www.example.com/logs/*.log {
           weekly
           missingok
           rotate 52
           compress
           delaycompress
           notifempty
           create 640 root adm
           sharedscripts
           postrotate
                   if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
                           /etc/init.d/apache2 reload > /dev/null
                   fi
           endscript
   }


Der Server sollte somit fertig sein. Falls ihr Anregungen bzw Verbesserungsvorschläge habt, würde ich mich freuen wenn ihr mir eine Nachricht hinterlasst.