Pergunta

Eu tenho um aplicativo padrão Rails com Nginx e Mongrel correndo em http: // mydomain . Eu preciso executar um blog Wordpress em http://mydomain.com/blog . Minha preferência seria para hospedar o blog em Apache rodando em ambos o mesmo servidor ou uma caixa separada, mas eu não quero que o usuário ver um servidor diferente no URL. Isso é possível e se não, o que você recomendaria para cumprir a meta?

Foi útil?

Solução

Eu acho que a solução da joelhardi é superior ao seguinte. No entanto, em meu próprio aplicativo, eu gostaria de manter o blog em um VPS separados do que o site Rails (separação de problemas de memória). Para fazer com que o usuário vê o mesmo URL, você usa o mesmo truque de proxy que você normalmente usa para proxy a um cluster de raça indefinida, exceto que você proxy para a porta 80 (ou qualquer outro) na outra caixa. Mole-mole. Para o usuário, é tão transparente quanto você proxy para mongrel -. Eles só "ver" o NGINX respondendo na porta 80 em seu domínio

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

Você pode usar esse truque para ter Rails jogo junto com qualquer tecnologia de servidor que deseja, aliás. Proxy diretamente ao servidor / porta apropriada e NGINX vai escondê-lo do mundo exterior. Além disso, uma vez que as URLs serão todos se referem ao mesmo domínio, você pode seemlessly integrar um blog baseado em PHP, Python sistema de rastreamento baseado, e Rails app -. Contanto que você escrever seus URLs corretamente

Outras dicas

Na verdade, desde que você está usando Nginx, você já está em grande forma e não precisa Apache.

Você pode executar PHP através fastcgi (há exemplos de como fazer isso no Nginx wiki ), e usar um padrão de URL de correspondência na sua configuração Nginx para dirigir algumas URLs para Rails e outros para PHP.

Aqui está um exemplo de configuração Nginx para a execução de um blog WordPress através PHP FastCGI (note que eu também colocar no equivalente Nginx do .htaccess WordPress, então você também terá URLs extravagantes que já trabalham com este config):

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

    }
}

Aqui está o arquivo fastcgi.conf estou incluindo na configuração acima (eu colocá-lo em um arquivo separado para todos os meus arquivos de configuração de host virtuais podem incluí-lo no lugar certo, mas você não tem que fazer isso ):

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

Eu também acontecerá a fazer o que o wiki Nginx sugere, eo uso de desova-fcgi de Lighttpd como meu CGI-spawner (Lighttpd é uma compilação muito rápido w / o dependências estranhos, então uma coisa rápida e fácil de instalar), mas você também pode usar uma pequena shell / script Perl para isso.

As respostas acima endereços bonitas sua pergunta.

Um FCGI alternativa seria a utilização php-fpm. Docs são uma escassa pouco mas funciona bem.

Nginx agora fornece um script para fazer isso se você estiver no EC2 / ambiente AWS.

Pode ser facilmente adaptável à sua situação. É muito útil.

Parece-me que algo como um manipulador reescrita iria fazer o que quiser. Desculpe, eu não tenho mais detalhes - só de pensar em voz alta:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top