Pregunta

Tengo una aplicación Rails estándar con Nginx y Mongrel ejecutándose en http://midominio.Necesito ejecutar un blog de Wordpress en http://midominio.com/blog.Mi preferencia sería alojar el blog en Apache ejecutándose en el mismo servidor o en un cuadro separado, pero no quiero que el usuario vea un servidor diferente en la URL.¿Es eso posible y, de no ser así, qué recomendaría para lograr el objetivo?

¿Fue útil?

Solución

Creo que la solución de Joelhardi es superior a la siguiente.Sin embargo, en mi propia aplicación, me gusta mantener el blog en un VPS separado del sitio Rails (problemas de separación de memoria).Para que el usuario vea la misma URL, utiliza el mismo truco de proxy que normalmente usa para enviar proxy a un clúster mestizo, excepto que utiliza el puerto 80 (o lo que sea) en otro cuadro.Pan comido.Para el usuario, es tan transparente como el proxy de mestizo: solo "ven" el NGINX respondiendo en el puerto 80 de su 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;
    }

Por cierto, puedes usar este truco para que Rails funcione con CUALQUIER tecnología de servidor que desees.Proxy directamente al servidor/puerto apropiado y NGINX lo ocultará del mundo exterior.Además, dado que todas las URL se referirán al mismo dominio, puede integrar fácilmente un blog basado en PHP, un sistema de seguimiento basado en Python y una aplicación Rails, siempre que escriba sus URL correctamente.

Otros consejos

En realidad, dado que estás usando Nginx, ya estás en excelente forma y no necesitas Apache.

Puedes ejecutar PHP a través de fastcgi (hay ejemplos de cómo hacer esto en la wiki de Nginx) y utilice un patrón de coincidencia de URL en su configuración de Nginx para dirigir algunas URL a Rails y otras a PHP.

Aquí hay un ejemplo de configuración de Nginx para ejecutar un blog de WordPress a través de PHP fastcgi (tenga en cuenta que también puse el equivalente de Nginx de WordPress .htaccess, por lo que también tendrá URL elegantes que ya funcionan con esta configuración):

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;
        }

    }
}

Aquí está el archivo fastcgi.conf que estoy incluyendo en la configuración anterior (lo puse en un archivo separado para que todos mis archivos de configuración de host virtual puedan incluirlo en el lugar correcto, pero no es necesario que haga esto):

# 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;

También hago lo que sugiere la wiki de Nginx y uso spawn-fcgi de Lighttpd como mi generador CGI (Lighttpd es una compilación bastante rápida sin dependencias extrañas, por lo que es rápido y fácil de instalar), pero también puedes use un script corto de Shell/Perl para eso.

Las respuestas anteriores responden bastante a su pregunta.

Una FCGI alternativa sería utilizar php-fpm.Los documentos son un poco escasos pero funciona bien.

Nginx ahora proporciona un script para hacer esto si estás en el entorno EC2/AWS.

Puede adaptarse fácilmente a su situación.Es bastante útil.

Me parece que algo así como un manipulador de reescritura haría lo que quieras.Lo siento, no tengo más detalles, solo estoy pensando en voz alta :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top