Desplegando sitio Django con blog WordPress bajo Nginx.

Hace unos dias se me presento un desafio: Este desafio consistia en hacer funcionar Django y WordPress con Nginx, el blog del sitio tenia que quedar despejado en el la url /blog/ es decir la url del blog quedaria en misitio.com/blog/.

La configuracion del sitio la hice bajo Debian, asi que la instalación y configuración de Nginx, php-fastcgi  pueden hacerla siguiendo la siguiente guia en Linode: https://library.linode.com/web-servers/nginx/php-fastcgi/debian-6-squeeze

Además se da por sentado que  ya tienes un sitio django desplegado con uwsgi y nginx corriendo y funcional.

Ahora bien, resulta que tenemos el sitio Django desplegado, tenemos php funcionando en nuestro servidor tambien con MySQL, ademas de eso instalamos y configuramos nuestro WordPress con los datos de la base de datos correctamente, pero al llegar a este punto, nos topamos con un problema y es que cuando accedemos a la url en este caso misitio.com/blog/ se nos muestra un mensaje en pantalla que dice: “No input file specified”.

Listo, antes de continuar, debo aclarar que el sitio que esta siendo servido por Django esta en el directorio raíz del sitio que en este caso vendria a ser misitio.com y como lo dije antes el blog estaria en misitio.com/blog/, ya que tenemos un poco más claro el panorama de nuestro problema la solucion a nuestro problema la explicaré a continuación.

El mensaje especificado por Nginx “No input file specified” se muestra porque no especificamos la ruta del archivo .php en cuestión correctamente en el archivo .conf, siendo asi, nuestra configuración quedaría de la siguente manera:

# misitio.conf

# Se configura la ruta al socket para que nuestro proyecto django corra correctamente
upstream django {
    server unix:///ruta/al/socket/para/django/misitio.sock;
}

server {
    listen 80;
    server_name localhost;
    charset utf-8;

    root /ruta/al/directorio/raiz/de/wordpress;
    index index.php;

    # max upload size
    client_max_body_size 75M;

    location /media {
        alias /ruta/a/la/carpeta/media/de/nuestro/proyecto/media;
    }

    location /static {
        alias /ruta/a/la/carpeta/static/de/nuestro/proyecto/static;
    }

    # Hacemos que cuando se entre a la url /blog/ se cargue el index.php
    # del directorio raiz de nuestro WordPress
    location /blog/ {
        if (!-e $request_filename){
            rewrite ^(.+)$ /index.php?q=$1 last;
        }
    }
    # Hacemos que cuando se entre a la url /blog/wp-admin/ se cargue el
    # index.php de la carpeta wp-admin
    location /blog/wp-admin/ {
        try_files $uri $uri/ /wp-admin/index.php;
    }

    # Ahora lo que especificamos es que cualquier request que se haga con
    # un archivo terminado con la extencion .php en la url /blog/wp-{cualquier_carpeta_de_wordpress}/ se cargue
    location ~ /blog/wp-.*/.*\.php$ {
        rewrite ^/.*(/wp-.*/.*\.php)$ $1 last;
    }

    # Con la siguiente configuracion se especifica que cualquier request
    # que se haga con una archivo terminado en .php en /blog/ se cargue
    location ~ /blog/.*\.php$ {
        rewrite ^/.*(/.*\.php)$ $1 last;
    }

    # Hacemos el archivo wp-config.php inaccesible, esto porque es el que
    # tiene la configuracion de nuestro wordpress
    location ~ wp-config.php$ {
        deny all;
    }

    # Con lo siguiente hacemos que se carguen los estilos, archivos js,
    # e imagenes en nuestro sitio
    location ~ /wp-.*/.*\.(js|css|png|jpg|gif) {
        rewrite ^/.*(/wp-.*/.*\.(js|css|png|jpg|gif))$ $1 last;
    }

    # Finalmente lo que hacemos con estas lineas es decir la nginx que
    # nos cargue los archivos .php que sean consultado al servidor y
    # que si no los encuentra pues que nos lance un error 404
    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        include /etc/nginx/mime.types;
        fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /ruta/al/directorio/raiz/de/wordpress$fastcgi_script_name;
    }

    # Con lo siguiente lo que se hace es decirle a nginx que la app
    # django sera vista en la raiz del sitio
    location / {
        uwsgi_pass django;
        include /ruta/al/archivo/que/contiene/los/parametros/uwsgi/del/proyecto/django/uwsgi_params;
    }
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s