Projekt: Neuer Server – nginx + php-fpm
Projekt: Neuer Server
Teil 2: Erste Schritte
Teil 3: nginx + php-fpm
Teil 4: MySQL + phpMyAdmin
Teil 5: Postfix + Dovecot
Teil 6: [in Planung]
Teil 7: [in Planung]
Teil 8: Der Abschluss
So, bevor ich jetzt irgendwas an meinem Server kaputt mache (ich hab da definitiv nen Hang zu. Benötige einen Undo-Knopf für sowas) erstelle ich an dieser Stelle ein komplettes Backup.
Bei netcup ist das glücklicherweise ziemlich einfach, ich erstelle das Backup im Verwaltungsbereich für die Server, da brauch ich kein Backuptool oder sonstiges bemühen.
In meinem Tarif habe ich zwei Backups frei, das heißt, ich kann hier und da ein wenig rumspielen und verschiedene Snapshots zurückspielen, falls ich mir bei irgendwelchen Installationen mal nicht ganz so sicher bin *g*.
Das Einzige, was ich nicht kann, ist dem Backup einen Namen oder eine Beschreibung zu geben, was es etwas einfacher machen würde, es dem jeweiligen Stand des Servers zuzuordnen. So muss ich mit einer Uhrzeit leben. Aber wofür habe ich denn ein Blog?! Ich schreib den Namen einfach hier rein, dann weiß ich immer, wo ich ihn finde
Das Backup zum aktuellen Stand hat also nun den Namen 2012.01.05_00:51 und ist 287.03 MB groß.
Wie bereits erwähnt möchte ich nicht mehr wie bisher Apache verwenden sondern gerne umsteigen. Ich habe mich nach kurzer Lektüre für den schlanken Webserver nginx (Gesprochen: En-gin-iX) entschieden. Das hat mehrere Gründe. Dazu hier ein kurzer Vergleich des Indianers, LIGHTTPD und nginx:
+ Open Source
+ unendlich viele Module
+ große Community
+ viele Tutorials
- schlechte Performance
- vglb. geringe Stabilität
- Langsame Entwicklung
- Veraltet und überfüllt
- Keine zufriedenstellende Standard-Konfiguration
+ Open Source
+ unendlich viele Module
+ gute Community
+ unglaublich ressourcenschonend
+ gute Geschwindigkeit
- vglb. geringe Stabilität
- miese Rewrite-Engine
- nicht so schnelle Entwicklung
- ungefixte Memory-Leaks
+ Open Source
+ genügend Module
+ ziemlich ressourcenschonend
+ geniale Geschwindigkeit
+ stabil und ohne bekannte Leaks
+ vernünftige Rewrite-Engine
+ rasante Weiterentwicklung
+ schöne & übersichtliche Konfiguration
- kleine Community
- kein FastCGI, externer fcgi-Spawner erforderlich
Meine Entscheidung fiel hiermit auf nginx, da ich mir viel von der Performance verspreche und keine Lust auf die hässliche Rewrite-Engine vom lighty habe, wenn es darum geht, die Permalinks von WordPress anzupassen.
Für FastCGI-Prozesse werde ich php-fpm nutzen, was gar nicht so kompliziert sein soll. Mal abwarten =/
Also, los gehts!
Wie bereits im ersten Teil angedeutet, holen wir uns die aktuelle Version von nginx aus dem Repository von Dotdeb, da wir hier alles so aktuell bekommen wie wir es benötigen und auf eine aufbereitete, etwas hübschere Standard-Konfiguration von nginx stoßen werden.
Wir installieren uns nginx, php und einige php-Module über apt-get:
# apt-get install nginx # apt-get install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd php5-suhosin php5-curl
Wir wechseln in das nginx Verzeichnis um ein paar Einstellungen vorzunehmen:
# cd /etc/nginx/ # nano nginx.conf
Die nun folgende Konfiguration ist das Beispiel, welches für meine Bedürfnisse passt, für euch ist die Lektüre vom Wiki eventuell interessant, um eure Konfigurationen anzupassen.
index index.php index.htm index.html;
keepalive_timeout 15;
client_max_body_size 20M;
client_body_buffer_size 128k;
##
# Gzip Settings
##
gzip on;
gzip_comp_level 9;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/png image/gif image/jpeg;
gzip_http_version 1.1;
gzip_min_length 1000;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6] \.";
gzip_vary on;
Wir entfernen den Standard-vHost und schreiben uns einen eigenen (der Name ist hier natürlich frei wählbar, der Übersicht halber am besten den Domainnamen verwenden). Dabei natürlich darauf achten, dass ihr eure Domain entsprechend eintragt und den vHost nach euren Bedürfnissen anpasst. Hier sei wieder auf das nginx-Wiki verwiesen:
cd /etc/nginx/sites-enabled rm default nano /etc/nginx/sites-available/bonsailinse.net
server {
server_name bonsailinse.net www.bonsailinse.net;
root /var/www/bonsailinse.net/www;
location / {
try_files $uri $uri/ /index.php /index.html;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 30d;
}
location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}
Da wir keine Lust haben, diesen ganzen Wulst für jeden einzelnen vHost neu einzutragen erstellen wir uns eine Datei, die wir einfach für jede Domain fix includen.
Damit sieht die Include-Datei nun so aus:
# nano /etc/nginx/defaults.inc
location / {
try_files $uri $uri/ /index.php /index.html;
}
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 30d;
}
location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$ {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
Dementsprechend ist unser vHost nun etwas kürzer:
# nano /etc/nginx/sites-available/bonsailinse.net
server {
server_name bonsailinse.net www.bonsailinse.net;
root /var/www/bonsailinse.net/www;
include defaults.inc;
}
Ein neuer Symlink sorgt dafür, dass unser vHost auch aktiv ist:
# ln -s /etc/nginx/sites-available/bonsailinse.net /etc/nginx/sites-enabled/bonsailinse.net
Fröhliches Neustarten:
# /etc/init.d/nginx restart
Und den eben angelegten vHost am besten mit einer phpinfo testen:
# mkdir -p /var/www/bonsailinse.net/{www,tmp}
# chown -R root:www-data /var/www/bonsailinse.net
# chmod -R 0770 /var/www/bonsailinse.net
# cd /var/www/bonsailinse.net/www
# nano info.php
<?php
phpinfo();
?>
Ein Aufruf von http://bonsailinse.net/info.php zeigt mir jetzt meine PHP-Konfiguration an.
Bei euch sollte das nun auch funktionieren.
