Qual é a melhor maneira de executar Wordpress no mesmo domínio como uma aplicação Rails?
-
01-07-2019 - |
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?
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:)