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
Kommentare
User in Gruppe
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