2012-12-22 15 views
11

Ho un particolare schema URI che mi crea qualche problema. Ho bisogno di eseguire nodejs per servire il seguente:nginx + nodejs + php

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

ho questo lavoro nessun problema ad utilizzare express.vhost() per servire i sottodomini. Tuttavia, ho bisogno di servire contenuti statici e php una volta l'URI simile al seguente:

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

Qui, /bar/ è una directory sul mio server. Tutto da quella url down (ad esempio /bar/images/favicon.ico) dovrebbe essere simile allo schema di directory tipico. Normalmente farei il tipico proxy_pass al nodo che gira su qualche porta, ma come puoi vedere qui, ho bisogno che nodejs sia il gestore principale sulla porta 80, e che passi la richiesta su nginx in esecuzione su qualche altra porta (o è possibile/più semplice il contrario?).

Questo tipo di schema è possibile con una configurazione (nginx/php)/nodejs?

+0

Ha senso ora, provo questo quando torno al mio computer. Stavo ricevendo un errore 403, cercando di accedere alle rotte expressjs. E suppongo che la frase "pausa" spieghi tutto. –

risposta

19

Nginx consente un routing delle richieste molto flessibile. vi mostrerò un modo per impostare

  • un percorso predefinito passato a una node.js backend
  • un'altra strada passato a un backend php-fpm
  • percorso alternativo passa ad un apache tipica + mod_php backend
  • hai js, immagini, css e altri file sulla macchina nginx? servire loro il modo più veloce direttamente da nginx

mi piace, e penso che sia il layout di configurazione di default per la maggior parte delle distribuzioni, per avere conf.d e vhosts.d directory con active e available cartelle. Quindi posso facilmente disabilitare un vhost o un file di configurazione semplicemente cancellando il link simbolico.

/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

dire che il nostro principale documento per i file statici è /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; 
    } 
} 

creare un link simbolico per rendere il vhost predefinito attiva

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

Vedere come semplice ed intuitivo il linguaggio di configurazione nginx è? Devo solo amarlo :)

+0

Molto utile e informativo! Grazie per i molteplici esempi. Sto iniziando a vedere quanto sia flessibile Nginx! Buone vacanze! – grep