¿Cuál es la mejor manera de ejecutar Wordpress en el mismo dominio que una aplicación Rails?
-
01-07-2019 - |
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?
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 :)