Power up the engine X – nginx

Immer wieder nutze ich private Projekte, um ein wenig mit (für mich) neuer Technologie rumzuspielen. Aktuell arbeite ich am Backend für eine Webanwendung (zu gegebener Zeit gibt’s sicher auch dazu was zu lesen 🙂 ). Da ich den Sprung zu Linux noch nicht ganz geschafft habe, entwickle ich noch unter Windows (Vista/Win7).

Der bequemste Weg einen lokalen Server einzurichten, wäre sicher XAMPP zu entpacken und einfach loszulegen. Ein paar Kollegen haben mir aber den Tipp gegeben es mal mit nginx zu probieren. Das Ding ist wohl eine schlanke Alternative zum Apachen und erfreut sich immer größerer Beliebtheit.
Nun denn…

Im Folgenden zeige ich, wie ich nginx & Co. auf meinem System installiert und konfiguriert habe. Kein großes Ding, aber falls ich das zukünftig nochmal machen muss, weiß ich wenigstens wo ich nachschauen kann 😉

Für den Anfang sollen die wichtigsten Komponenten installiert werden. Das sind meiner Ansicht nach nginx selbst, PHP 5.3 und MySQL (auch wenn ich mit dem Gedanken gespielt habe mich mal mit den ganzen NoSQL-Alternativen auseinander zu setzen). Für etwas mehr Komfort gibts dann noch MySQL Workbench und phpMyAdmin. Weitere Komponenten können mit der Zeit sicher hinzukommen. Dann werde ich diese Serie hier ergänzen.

Doctrine 2.0 klingt für mich zum Beispiel sehr interessant. Ich denke, dass hier in naher Zukunft etwas darüber zu lesen sein wird.

Und wenn eine stabile Version von PHP-FPM für PHP 5.3 verfügbar ist, werde ich auch das mal ausprobieren.

Download

nginx

Installation

Hier gibt es nicht viel zu installieren. Einfach das Zip-File in einen beliebigen Ordner entpacken und schon kann es losgehen. Ich habe nginx hier examplarisch in den Ordner D:AlexProgrammenginx entpackt. Die nachfolgenden Pfade beziehen sich immer darauf.

Ich starte und beende nginx & Co. über eine Batch von der Kommandozeile (als Administrator). Für wen das nichts ist, der kann nginx als Windows Service einrichten.

  1. @ECHO OFF
  2. ECHO Starting PHP FastCGI...
  3. start "PHP" /b D:AlexProgrammePHPphp-cgi.exe -b 127.0.0.1:9000
  4. ECHO Starting nginx...
  5. start "NGINX" /b D:AlexProgrammenginxnginx.exe
  6. ECHO Starting MySQL...
  7. net start MySQL

In Zeile 3 ist zu beachten, dass die IP und der Port, auf dem PHP lauscht mit den Angaben in der nginx.conf übereinstimmen (siehe weiter unten).

  1. @ECHO OFF
  2. ECHO Stopping MySQL...
  3. net stop MySQL
  4. ECHO Stopping nginx...
  5. taskkill /F /IM nginx.exe
  6. ECHO Stopping PHP FastCGI...
  7. taskkill /F /IM php-cgi.exe

Konfiguration

Bevor es aber losgehen kann, müssen wir unseren Server ein wenig konfigurieren. Das ist keine große Sache und erinnert etwas an den Apachen (vhost). In der Konfigurationsdatei kann man beliebig weitere Server einrichten. Aus Gründen der Übersichtlichkeit belasse ich es jedoch bei einem (localhost).

Ich habe die geänderten Zeilen zur leichteren Orientierung hervorgehoben.

  1. #user  nobody;
  2. worker_processes  1;
  3.  
  4. #error_log  logs/error.log;
  5. #error_log  logs/error.log  notice;
  6. #error_log  logs/error.log  info;
  7.  
  8. #pid        logs/nginx.pid;
  9.  
  10. events {
  11.     worker_connections  1024;
  12. }
  13.  
  14. http {
  15.     include       mime.types;
  16.     default_type  application/octet-stream;
  17.  
  18.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  19.     #                  '$status $body_bytes_sent "$http_referer" '
  20.     #                  '"$http_user_agent" "$http_x_forwarded_for"';
  21.  
  22.     #access_log  logs/access.log  main;
  23.  
  24.     sendfile        on;
  25.     #tcp_nopush     on;
  26.  
  27.     #keepalive_timeout  0;
  28.     keepalive_timeout  65;
  29.  
  30.     #gzip  on;
  31.  
  32.     server {
  33.         listen       80;
  34.         server_name  localhost;
  35.  
  36.         #charset koi8-r;
  37.  
  38.         #access_log  logs/host.access.log  main;
  39.  
  40.         location / {
  41.             root   html;
  42.             index  index index.php index.html index.htm;
  43.         }
  44.  
  45.         #error_page  404              /404.html;
  46.  
  47.         # redirect server error pages to the static page /50x.html
  48.         #
  49.         error_page   500 502 503 504  /50x.html;
  50.         location = /50x.html {
  51.             root   html;
  52.         }
  53.  
  54.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  55.         #
  56.         #location ~ .php$ {
  57.         #    proxy_pass   http://127.0.0.1;
  58.         #}
  59.  
  60.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  61.         #
  62.     location ~ .php$ {
  63.         try_files $uri @404;
  64.             root           html;
  65.             fastcgi_pass   127.0.0.1:9000;
  66.             fastcgi_index  index.php;
  67.             include        fastcgi_params;
  68.         fastcgi_param  SCRIPT_FILENAME  D:/Alex/Programme/nginx/html/$fastcgi_script_name;
  69.         }
  70.  
  71.     # not Found
  72.     location @404 {
  73.         return 404;
  74.         break;
  75.     }
  76.  
  77.         # deny access to .htaccess files, if Apache's document root
  78.         # concurs with nginx's one
  79.         #
  80.         #location ~ /.ht {
  81.         #    deny  all;
  82.         #}
  83.     }
  84.  
  85.     # another virtual host using mix of IP-, name-, and port-based configuration
  86.     #
  87.     #server {
  88.     #    listen       8000;
  89.     #    listen       somename:8080;
  90.     #    server_name  somename  alias  another.alias;
  91.  
  92.     #    location / {
  93.     #        root   html;
  94.     #        index  index.html index.htm;
  95.     #    }
  96.     #}
  97.  
  98.     # HTTPS server
  99.     #
  100.     #server {
  101.     #    listen       443;
  102.     #    server_name  localhost;
  103.  
  104.     #    ssl                  on;
  105.     #    ssl_certificate      cert.pem;
  106.     #    ssl_certificate_key  cert.key;
  107.  
  108.     #    ssl_session_timeout  5m;
  109.  
  110.     #    ssl_protocols  SSLv2 SSLv3 TLSv1;
  111.     #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  112.     #    ssl_prefer_server_ciphers   on;
  113.  
  114.     #    location / {
  115.     #        root   html;
  116.     #        index  index.html index.htm;
  117.     #    }
  118.     #}
  119.  
  120. }

Ein Unterordner von nginx ist html. Dieser kann im Wesentlichen mit dem htdocs-Ordner von Apache gleichgesetzt werden. Man kann hier für root auch jeden anderen Ordner angeben, wichtig sind dabei die Slashes! Außerdem ist zu beachten, dass man den Pfad relativ zu dem Pfad von nginx angeben muss!
Wenn man als Ausgabe nur erhält „No input file specified“, dann sollte man die Pfadangaben inklusive Slashes auf Richtigkeit überprüfen (PHP konnte in diesem Fall nämlich die Datei nicht finden).

Als Servername haben wir hier erstmal localhost stehen gelassen. Man kann jedoch auch beliebige andere Namen wählen, muss sie dann jedoch in der nginx.conf und in der hosts-Datei unter C:WindowsSystem32driversetc eintragen. Ich möchte hier gleich noch erwähnen, dass MySQL im Moment noch nichts mit IPv6 anfangen kann, weshalb ich diese Adresse gleich auskommentiert habe.

hosts   
127.0.0.1       localhost
# MySQL kann noch nicht mit IPv6 umgehen!
#::1        localhost

Für einfache Anwendungsfälle war es das auch schon! Wenn man im Browser nun auf localhost surft, sollte man eine Willkommensnachricht von nginx sehen.

Weiter geht es nun mit PHP.

EDIT:

Damit man später zum Beispiel auch das Zend Framework in Verbindung mit dem nginx-Server nutzen kann, ist noch folgendes in die nginx.conf im server-Block einzufügen:

  1. if (!-e $request_filename) {
  2.     rewrite ^(.*)$ /index.php?q=$1 last;
  3.     break;
  4. }

Schreibe einen Kommentar

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