Domanda

Ho un'app Rails standard con Nginx e Mongrel in esecuzione http://miodominio.Ho bisogno di gestire un blog Wordpress su http://miodominio.com/blog.La mia preferenza sarebbe quella di ospitare il blog in Apache in esecuzione sullo stesso server o su una casella separata, ma non voglio che l'utente veda un server diverso nell'URL.È possibile e, in caso contrario, cosa consiglieresti per raggiungere l'obiettivo?

È stato utile?

Soluzione

Penso che la soluzione di Joelhardi sia superiore alla seguente.Tuttavia, nella mia applicazione, preferisco mantenere il blog su un VPS separato rispetto al sito Rails (problemi di separazione della memoria).Per fare in modo che l'utente veda lo stesso URL, usi lo stesso trucco proxy che usi normalmente per l'inoltro a un cluster bastardo, tranne che fai proxy alla porta 80 (o qualsiasi altra cosa) su un'altra macchina.Vai tranquillo.Per l'utente è trasparente quanto il tuo proxy su bastardo: "vedono" solo NGINX che risponde sulla porta 80 del tuo dominio.

upstream myBlogVPS {
        server 127.0.0.2:80;  #fix me to point to your blog VPS
}

 server {
    listen       80;


    #You'll have plenty of things for Rails compatibility here

    #Make sure you don't accidentally step on this with the Rails config!

    location /blog {
        proxy_pass         http://myBlogVPS;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

Puoi usare questo trucco per far giocare Rails insieme a QUALSIASI tecnologia server desideri, per inciso.Proxy direttamente al server/porta appropriato e NGINX lo nasconderà dal mondo esterno.Inoltre, poiché gli URL faranno tutti riferimento allo stesso dominio, puoi integrare senza problemi un blog basato su PHP, un sistema di tracciamento basato su Python e un'app Rails, purché scrivi correttamente i tuoi URL.

Altri suggerimenti

In realtà, dal momento che usi Nginx, sei già in ottima forma e non hai bisogno di Apache.

Puoi eseguire PHP tramite fastcgi (ci sono esempi di come farlo nella wiki di Nginx) e utilizza un modello di corrispondenza URL nella configurazione di Nginx per indirizzare alcuni URL a Rails e altri a PHP.

Ecco un esempio di configurazione Nginx per l'esecuzione di un blog WordPress tramite PHP fastcgi (nota che ho anche inserito l'equivalente Nginx di WordPress .htaccess, quindi avrai anche URL fantasiosi già funzionanti con questa configurazione):

server {
    listen       example.com:80;
    server_name  example.com;
    charset      utf-8;
    error_log    /www/example.com/log/error.log;
    access_log   /www/example.com/log/access.log  main;
    root         /www/example.com/htdocs;

    include /www/etc/nginx/fastcgi.conf;
    fastcgi_index index.php;

    # Send *.php to PHP FastCGI on :9001
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9001;
    }

    # You could put another "location" section here to match some URLs and send
    # them to Rails. Or do it the opposite way and have "/blog/*" go to PHP
    # first and then everything else go to Rails. Whatever regexes you feel like
    # putting into "location" sections!

    location / {
        index index.html index.php;
        # URLs that don't exist go to WordPress /index.php PHP FastCGI
        if (!-e $request_filename) {
            rewrite ^.* /index.php break;
            fastcgi_pass 127.0.0.1:9001;
        }

    }
}

Ecco il file fastcgi.conf che includo nella configurazione precedente (l'ho inserito in un file separato in modo che tutti i file di configurazione del mio host virtuale possano includerlo nel posto giusto, ma non sei obbligato a farlo):

# joelhardi fastcgi.conf, see http://wiki.codemongers.com/NginxFcgiExample for source
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;

Mi capita anche di fare ciò che suggerisce il wiki di Nginx e di utilizzare spawn-fcgi da Lighttpd come spawner CGI (Lighttpd è una compilazione piuttosto veloce senza strane dipendenze, quindi una cosa facile e veloce da installare), ma puoi anche utilizzare un breve script Shell/Perl per questo.

Le risposte sopra rispondono abbastanza alla tua domanda.

Un FCGI alternativo sarebbe utilizzare php-fpm.La documentazione è un po' scarsa ma funziona bene.

Nginx adesso fornisce uno script per farlo se ti trovi nell'ambiente EC2/AWS.

Potrebbe essere facilmente adattabile alla tua situazione.È piuttosto utile.

Mi sembra che qualcosa come un manipolatore di riscrittura farebbe quello che vuoi.Mi dispiace, non ho altri dettagli, sto solo pensando ad alta voce :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top