2012-12-22 9 views
11

Ich habe ein bestimmtes URI-Schema, das mir einige Probleme bereitet. Ich brauche NodeJS laufen folgendes zu dienen:nginx + nodejs + php

domain.com 
var.domain.com 
var.domain.com/foo/ 

Ich habe diese Arbeit kein Problem mit express.vhost() die Sub-Domains zu dienen. Ich brauche aber statische Inhalte und PHP dienen, wenn die URI des folgenden ähnelt:

var.domain.com/foo/bar 
var.domain.com/foo/bar/index.php 

Hier /bar/ einig Verzeichnis auf meinem Server ist. Alles von dieser URL abwärts (sagen wir /bar/images/favicon.ico) würde wie Ihr typisches Verzeichnisschema dienen. Normalerweise würde ich den typischen proxy_pass zum Knoten ausführen, der auf einem Port läuft, aber wie Sie hier sehen können, brauche ich nodejs als primary handler auf Port 80 und lasse die Anfrage an nginx weiterleiten, das auf einem anderen Port läuft es ist möglich/einfacher andersherum?).

Ist diese Art von Schema mit einer (nginx/php)/nodejs-Konfiguration möglich?

+0

Es macht jetzt Sinn, ich versuche dies, wenn ich zurück zu meinem Computer. Ich habe einen 403-Fehler erhalten und versucht, auf Expressjs-Routen zuzugreifen. Und ich denke, 'Break' Aussage erklärt alles. –

Antwort

19

Nginx ermöglicht sehr flexibles Anforderungs-Routing. Ich werde dir einen Weg zeigen

  • eine Standardroute
  • eine andere Route zu einem php-fpm Backend übergeben an einen node.js Backend übergeben einzurichten
  • alternative Route zu einem typischen Apache weitergegeben + mod_php Backend
  • Hast du js, Bilder, CSS und andere Dateien auf der Nginx-Maschine? sich den schnellsten Weg direkt von nginx dienen

Ich mag, und ich denke, das ist das Standard-Setup-Layout für die meisten Distributionen, conf.d und vhosts.d Verzeichnisse mit active und available Ordnern zu haben. So kann ich einfach einen vhost oder eine Konfigurationsdatei deaktivieren, indem ich einfach den Symlink lösche.

/etc 
    nginx.conf 
    vhosts.d/ 
      active 
      available 
    conf.d/ 
      active 
      available 

/etc/nginx.conf

# should be 1 per CPU core  
worker_processes  2;       

error_log    /var/log/nginx/error.log; 

# I have this off because in our case traffic is not monitored with nginx and I don't want disks to be flooded with google bot requests :) 
access_log    off; 
pid      /var/run/nginx.pid; 

events { 
     # max clients = worker_processes * worker_connections 
     worker_connections  1024; 
     # depends on your architecture, see http://wiki.nginx.org/EventsModule#use 
     use      epoll; 
} 

http { 

     client_max_body_size 15m; 

     include     mime.types; 
     default_type   text/html; 
     sendfile    on; 
     keepalive_timeout  15; 

     # enable gzip compression 
     gzip     on; 
     gzip_comp_level   6; 
     gzip_types    text/plain text/css text/xml application/x-javascript application/atom+xml application/rss+xml application/json; 
     gzip_http_version  1.0; 


     # Include conf.d files 
     include conf.d/active/*.conf; 

     # include vhost.d files 
     include vhosts.d/active/*.conf; 
} 

/etc/nginx/vhosts.d/available/default.conf

Sagen Sie unsere Document-Root für statische Dateien /srv/www/vhosts/static/htdocs

server { 
    server_name _; 
    listen  80; 

    root  /srv/www/vhosts/static/htdocs; 

    # if a file does not exist in the specified root and nothing else is definded, we want to serve the request via node.js 
    try_files $uri @nodejs;   

    # may want to specify some additional configuration for static files 
    location ~ \.(js|css|png|gif|jpg) 
    { 
     expires 30d; 
    } 

    location @nodejs 
    { 
     # say node.js is listening on port 1234, same host   
     proxy_pass 127.0.0.1:1234; 
     break; 
    } 

    # just for fun or because this is another application, we serve a subdirectory via apache on another server, also on the other server it's not /phpmyadmin but /tools/phpMyAdmin 
    location /phpmyadmin { 
     rewrite /phpmyadmin(.*)$ /tools/phpMyAdmin$1; 
     proxy_pass     10.0.1.21:80; 
     break; 
    } 

    # files with .php extension should be passed to the php-fpm backend, socket connection because it's on the same and we can save up the whole tcp overhead 
    location ~\.php$ 
    { 
     fastcgi_pass unix:/var/run/php-fpm.sock; 
     include /etc/nginx/fastcgi_params; 
     break; 
    } 
} 

einen Symlink erstellen die Standard-vhost aktiv

ln -s /etc/nginx/vhosts.d/available/default.conf /etc/nginx/vhosts.d/active/. 
/etc/init.d/nginx restart 

Sehen Sie, wie einfach und intuitiv die nginx Konfiguration Sprache ist zu machen? Ich muss es einfach lieben :)

+0

Sehr hilfreich und informativ! Danke für die vielen Beispiele. Ich beginne zu sehen, wie flexibel Nginx wirklich ist! Schöne Ferien! – grep