ISPConfig: apache durch nginx ersetzen 7


In dieser Anleitung zeige ich, wie man Apache durch nginx mit ISPConfig 3.0.5.4 ersetzen kann. Ich habe verschiedene Seite mit Joomla 2.x, Joomla 3.x, WordPress und eigener Codes migriert.

Ich verwende dazu ISPConfig 3.0.5.4.p6 installiert nach dem Perfect Server Howto von howtoforge.com.

Es gibt ein paar Unterschieder zwischen Apache und nginx, die vor der Umstellung beachtet werden müssen:
nginx unterstützt keine .htaccess
nginx verwendet eigene rewrites und kein mod_rewrite-Modul wie Apache

Für beides gibt es verschieden Online-Konverter wie www.anilcetin.com. Dabei muss aber immer daran gedacht werden, dass der Erfolg nicht garantiert werden kann und jede Seite nach der Umstellung getestet werden sollte.

Sobald der Webserver in ISPConfig von Apache auf nginx umgestellt ist, sind die Apache-Direktiven nicht mehr über das Interface ersichtlich. Man kann entweder vorher alle Direktiven kopieren oder aber (und das geht auch nach der Umstellung), die Direktiven aus der Datenbank in mysql oder mit phpMyAdmin auslesen.
SELECT domain, apache_directives FROM web_domain WHERE apache_directives != '';

DIe vorhandenen .htaccess Files lassen sich mit find /var/www/clients/ -name .htaccess -not -path "*/stats/*" finden.

1. nginx installieren
apt-get install nginx

2. php-fpm installieren
apt-get install php5-fpm
und in /etc/php5/fpm/php.ini zwei Werte überprüfen:

cgi.fix_pathinfo=0
date.timezone=”Europe/Berlin”

php-fpm durch /etc/init.d/php5-fpm reload neu laden.

Ab dieser Stelle ist zwar nginx installiert, der aktive Webserver ist aber weiterhin Apache.

3. Wartungsmodus aktivieren
In ISPConfig unter System / Systemkonfiguration im Reiter Diverses den Wartungsmodus aktivieren, damit während der Umstellung keine weiteren Änderungen geschrieben werden

4. ISPConfig auf nginx umstellen
Die folgenden EInstellungen werden direkt in der Datenbank (dbispconfig) vorgenommen.
Die Tabelle server auswählen und server editieren:

Nach unten bis config scrollen und die Zeile [global] finden. In der folgenden Zeile dann

webserver=apache

durch

webserver=nginx

ersetzen.

Danach die Zeile [web] finden und darunter

server_type=apache

durch

server_type=nginx

ersetzen.
nginx03

6. Damit das Web-Interface von ISPConfig über nginx erreichbar ist, die entsprechende ispconfig.vhost unter /etc/nginx/sites-available anlegen:
vi /etc/nginx/sites-avaliable/ispconfig.vhost
und einen der folgenden Inhalte einfügen:

mit SSL:

server {
    listen 8080;
        ssl on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt
        ssl_certificate_key /usr/local/ispconfig/interface/ssl/ispserver.key;
    server_name _;

    root /usr/local/ispconfig/interface/web/;

    client_max_body_size 20M;

    location / {
        index index.php index.html;
    }

# serve static files directly
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
        access_log off;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/lib/php5-fpm/ispconfig.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ /\. {
        deny all;
    }
}

ohne SSL:

server {
    listen 8080;
        ssl off;
    server_name _;

    root /usr/local/ispconfig/interface/web/;

    client_max_body_size 20M;

    location / {
        index index.php index.html;
    }

# serve static files directly
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
        access_log off;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/lib/php5-fpm/ispconfig.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ /\. {
        deny all;
    }
}

und den symlink durch
ln -s /etc/nginx/sites-available/ispconfig.vhost /etc/nginx/sites-enabled/000-ispconfig.vhost
erstellen.

7. Webseiten anpassen
Den Wartungsmodus deaktivieren und evtl. vorhandenen .htaccess-Dateien und Apache-Direktiven umwandeln und In ISPConfig für die jeweilige Webseite eintragen.

Falls nicht alle Webseiten angepasst werden mussten: unter Tools den Resync für alle Webseiten aufrufen.

8. Apache deaktivieren und nginx startern
/etc/init.d/apache2 stop
update-rc.d -f apache2 remove
/etc/init.d/nginx start

Done

Soll doch wieder Apache verwendet werden, reicht es die Schritt aus 4. und 8. rückgängig zu machen.


Kommentar erstellen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

7 Gedanken zu “ISPConfig: apache durch nginx ersetzen

  • Ben

    Thanks for putting this together, Florian! I noticed a syntax error/typo that threw me. The semicolon is missing at the end of this line, in the first NGINX vhost example (for TLS/SSL):

    ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt #<— missing semicolon at the end

    Thanks again for this most helpful how-to!

  • Vikram

    Hi Florian,

    Could you please post a vice-versa tutorial i.e. nginx to apache on ISPC 3 ?
    Thanks a lot for your helpful tutorial.

    Regards,
    Vikram

    • Florian Schaal Beitragsautor

      Seems you have problem with php-fpm. Did you install php-fpm? You can find additional infos in your logs (nginx, php-fpm). You can also try to use php-fpm for the site without the php-socket-file (webdomain / options).

      • s

        yes, fpm is installed.
        i noticed this error in the logs
        connect() to unix:/var/run/ispconfig.sock failed (2: No such file or directory) while connecting to upstream
        when i change it to 127.0.0.1:9000, i get the following error (which seems to be permissions more than anything)
        PHP Fatal error: require_once(): Failed opening required ‘../lib/config.inc.php’ (include_path=’.:/usr/share/php:/usr/share/pear’) in /usr/local/ispconfig/interface/web/index.php on line 31

        but permissions did not change, do I need to set them differently?

        fyi i did find this post on stackoverflow which caused me to add the answer from xander… as I was running into this problem earlier. http://stackoverflow.com/questions/23443398/nginx-error-connect-to-php5-fpm-sock-failed-13-permission-denied

        • Florian Schaal Beitragsautor

          I never used this on the server that runs the interface (i installed is with nginx aleady running). You may need to update ISPConfig with reconfigure services. This should update the configs for the interface, too.