Apache 2 mit fcgid, suEXEC und vHosts unter Ubuntu 14.04

Kleine Anleitung wie man unter Ubuntu 14.04 fcgid (fast CGI) und suEXEC installiert und einen virtuellen Host einrichtet. Ausgangspunkt ist hier schon ein lauffähiger Apache 2 mit MySQL und PHP. Sollte dies noch nicht der Fall sein, so findest du hier die passende Anleitung "Apache 2 + MySQL + PHP + etc. installieren und einrichten"

Installation der benötigten Pakete

Zuerst müssen wir die benötigten Module installieren, am Besten zuvor als root anmelden, damit man nicht immer sudo schreiben muss (sudo su)

apt-get install libapache2-mod-fcgid php5-cgi apache2 apache2-mpm-worker apache2-suexec

und auch im Apache aktivieren. fcgid wurde bei mir wohl direkt nach der Installation aktviert, aber suEXEC musste ich manuell aktivieren.

a2enmod fcgid
a2enmod suexec

Nun noch den Apache Dienst neustarten

service apache2 restart

Benutzer anlegen

Wir benötigen für unsere Webaccounts bzw. Websites noch User, unter denen dann später PHP läuft. Wir legen also einen Nutzer mit

adduser USERNAME

an und packen ihn die die www-data Gruppe.

adduser www-data USERNAME

Verzeichnisse anlegen

Bei den Verzeichnissen halte ich mich mal an den Aufbau, wie ich es durch Plesk, bei meinen anderen Servern, gewöhnt bin

mkdir /var/www/vhosts
mkdir /var/www/vhosts/domain.tld
mkdir /var/www/vhosts/domain.tld/conf
mkdir /var/www/vhosts/domain.tld/htdocs
mkdir /var/www/vhosts/domain.tld/logs
mkdir /var/www/vhosts/domain.tld/tmp
mkdir /var/www/vhosts/domain.tld/cgi-bin
mkdir /var/www/vhosts/domain.tld/cgi-bin/php5-default

Rechte vergeben

chown -R USERNAME:USERNAME /var/www/vhosts/domain.tld
chmod -R 750 /var/www/vhosts/domain.tld
chmod 550 /var/www/vhosts/domain.tld/conf

Zur Info: USERNAME:USERNAME ist eigentlich USERNAME:GROUPNAME

Virtuellen Host anlegen

Hier DOMAIN.TLD durch eure Domain ersetzen. USERNAME durch euren zuvor angelegten Nutzernamen ersetzen.

cat > /etc/apache2/sites-available/DOMAIN.TLD.conf << EOF
<VirtualHost *:80>
     DocumentRoot /var/www/vhosts/DOMAIN.TLD/htdocs
     ServerName DOMAIN.TLD
     SuexecUserGroup USERNAME USERNAME
     Options -FollowSymLinks
     <FilesMatch ".ph(p3?|tml)$">
          SetHandler fcgid-script
     </FilesMatch>
     <IfModule mod_fcgid.c>
          php_admin_flag engine off
          AddHandler fcgid-script .php
          AddHandler fcgid-script .php5
          FcgidConnectTimeout 20
          FCGIWrapper /var/www/vhosts/DOMAIN.TLD/cgi-bin/php5-default/php-fcgi-wrapper .php
     </IfModule>
     <Directory "/var/www/vhosts/DOMAIN.TLD/htdocs">
          allow from all
          AllowOverride All
          Require all granted
          Options -Indexes +ExecCGI +FollowSymLinks +MultiViews
     </Directory>
     ErrorLog /var/www/vhosts/DOMAIN.TLD/logs/error.log
     LogLevel warn
     CustomLog /var/www/vhosts/DOMAIN.TLD/logs/access.log "combined"
</VirtualHost>
EOF

php.ini kopieren, Rechte vergeben und anpassen

cp /etc/php5/cgi/php.ini /var/www/vhosts/DOMAIN.TLD/conf/
chown USERNAME:USERNAME /var/www/vhosts/DOMAIN.TLD/conf/php.ini
chmod 440 /var/www/vhosts/DOMAIN.TLD/conf/php.ini
nano /var/www/vhosts/DOMAIN.TLD/conf/php.ini

Für uns interessant sind

upload_tmp_dir = "/var/www/vhosts/DOMAIN.TLD/tmp"

Des Weiteren sollte auch noch

memory_limit = 512M

upload_max_filesize = 1024M

angepasst werden, hängt aber von deiner Server Leistung ab und was du vor hast. Für Drupal habe ich jedenfalls immer das Memory Limit auf 512 MB stehen. Für OwnCloud die upload filesite auf 1GB

Weitere Erweiterungen

Diese werden einfach am Ende der php.ini angefügt. Einfach die benötigten aktivieren.

extension=/usr/lib/php5/20121212/curl.so
extension=/usr/lib/php5/20121212/gd.so
extension=/usr/lib/php5/20121212/imagick.so
extension=/usr/lib/php5/20121212/imap.so
extension=/usr/lib/php5/20121212/intl.so
extension=/usr/lib/php5/20121212/json.so
extension=/usr/lib/php5/20121212/mcrypt.so
extension=/usr/lib/php5/20121212/memcache.so
extension=/usr/lib/php5/20121212/ming.so
extension=/usr/lib/php5/20121212/mysqli.so
extension=/usr/lib/php5/20121212/mysql.so
extension=/usr/lib/php5/20121212/opcache.so
extension=/usr/lib/php5/20121212/pdo_mysql.so
extension=/usr/lib/php5/20121212/pdo.so
extension=/usr/lib/php5/20121212/pdo_sqlite.so
extension=/usr/lib/php5/20121212/pspell.so
extension=/usr/lib/php5/20121212/ps.so
extension=/usr/lib/php5/20121212/readline.so
extension=/usr/lib/php5/20121212/recode.so
extension=/usr/lib/php5/20121212/snmp.so
extension=/usr/lib/php5/20121212/sqlite3.so
extension=/usr/lib/php5/20121212/tidy.so
extension=/usr/lib/php5/20121212/xcache.so
extension=/usr/lib/php5/20121212/xmlrpc.so
extension=/usr/lib/php5/20121212/xsl.so

Script für fcgi anlegen

Hier auch wieder DOMAIN.TLD durch deine Daten ersetzen

cat > /var/www/vhosts/DOMAIN.TLD/cgi-bin/php5-default/php-fcgi-wrapper << EOF
#!/bin/sh
PHP_INI_SCAN_DIR=/var/www/vhosts/DOMAIN.TLD/conf
export PHP_INI_SCAN_DIR
export PHPRC=/var/www/vhosts/DOMAIN.TLD/conf
export PHP_FCGI_CHILDREN=1
export PHP_FCGI_MAX_REQUESTS=5000
exec /usr/bin/php5-cgi
EOF

Das fcgi Script dem erstellen Nutzer zuweisen und ausführbar machen

chown USERNAME:USERNAME /var/www/vhosts/DOMAIN.TLD/cgi-bin/php5-default/php-fcgi-wrapper

chmod 750 /var/www/vhosts/DOMAIN.TLD/php-fcgi/cgi-bin/php5-default/php-fcgi-wrapper

und Änderungen durch den Nutzer verbieten

chattr +i -V /var/www/vhosts/DOMAIN.TLD/cgi-bin/php5-default/php-fcgi-wrapper

Jetzt noch dem Apache 2 die Seite bekannt machen

a2ensite DOMAIN.TLD

und eine info.php zum Testen erstellen

cat > /var/www/vhosts/DOMAIN.TLD/htdocs/info.php << EOF
<?php
print phpinfo();
?>
EOF

phpinfo FCGID


Kommentare

Hallo Julian,

vielen Dank für den Artikel! Mir ist etwas aufgefallen: Wenn ich in Ubuntu "adduser www-data USERNAME" ausführe, dann wird nicht wie Du schreibst, der User in die Gruppe www-data gepackt, sondern umgekehrt wird der User www-data in die Gruppe des Users gepackt. Was hattest Du genau gemeint: Sollte der User in die www-data-Gruppe oder der www-data-User in die Usergruppe?

Danke und viele Grüße,
Thilo

Neuen Kommentar schreiben

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.
By submitting this form, you accept the Mollom privacy policy.