Compiler Nginx pour Diazo et Multi-language Switcher

Diazo est

  • un serveur proxy qui applique un XSLT à un site pour refaire le thème
  • un ensemble d’outils pour produire le XSLT depuis des templates (X)HTML et des règles

Le concept de D

Le diagramme ci-dessous montre le concept de Diazo

Il s’avère que pour ce faire, il convient d’avoir un interpreteur XSLT permissif pour ce faire. J’écris « permissif » car HTML source n’est pas toujours XML valide. Les options sont décrit sur le site: Apache, Varnish (c’est quoi?), Nginx, WSGI, Plone. Pour faire fonctionner Diazo en Nginx avec HTML possiblement non-valide, il faut malheuresement appliquer un patch. Je décris dans cette article comment j’ai appliqué un patch et ai compilé à la main les dernières source Nginx stables.

Il y a aussi un multi-language switcher qui détecte le langage du navigateur et permets de rediriger en fonction. Je me suis permis de rediriger vers l’anglais ou le français (éventuellement le chinois).

Le patch

Il convient d’augmenter le module natif xslt-html-parser avec le http_xslt_parser module, ce qui permet l’application des transformations xslt sur html au lieu de xhtml.

  1. Télé-décharger le code source de Nginx disponible ici http://nginx.org/en/download.html. J’ai pris http://nginx.org/download/nginx-1.6.1.zip. Décompresser dans le dossier de compillation (dans le serveur Linux pour moi)
  2. Télécharger le patch disponible ici : $ wget https://github.com/jcu-eresearch/nginx-custom-build/blob/master/nginx-xslt-html-parser.patch et le mettre dans le dossier de compillation (au même niveau que ./src). [Je viensd’être informé que le patch actuel se trouve ici : https://bitbucket.org/lrowe/nginx-xslt-html-parser]
  3. Appliquer le patch comme suite $ patch src/http/modules/ngx_http_xslt_filter_module.c nginx-xslt-html-parser.patch

Si vous voulez compiler maintenant, il s’agirait de la commande ./configure –with-http_xslt_module

Le module Nginx accept language

Ensuite il s’agit du module accept language de Nginx

  1. Télécharge le module ici : https://github.com/giom/nginx_accept_language_module depuis ce lien :https://github.com/giom/nginx_accept_language_module/archive/master.zip
  2. Décompresser dans un dossier tel que /home/[username]/hacks/nginx_accept_language_module-master

La compilation

Pour compiler Nginx pour Diazo et le bascule de langage:

  1. Se mettre dans le dossier source et executer la ligne de ./configure (remplacer le chemins avec les chemins sur votre système) ./configure –with-http_xslt_module –with-http_stub_status_module –add-module=/home/[username[/hacks/nginx_accept_language_module-master –with-ipv6 –with-http_ssl_module –with-cc-opt=-Wno-error –prefix=/home/[username]/opt/nginxslt
  2. make
  3. make install

Configuration de Nginx with Diazo et Multi-language

Voici brutalement des extraits de mon /home/[username]/nginxslt/conf/nginx.conf. Global variables

# in http { context
# Augmented head size allocations
proxy_headers_hash_bucket_size 128;
proxy_headers_hash_max_size 1024;


# Set up a map for available languages for the websites
map $http_accept_language $lang {
    default en;
    ~fr fr;
}

The main server was just putting a theme around XHTML content in a folder.

# in http { context
server {
    listen       30742;
    server_name  example.com www.example.com;
    server_name_in_redirect on; # Not sure if this part is necessary
    location / {
        xslt_stylesheet /home/username/webapps/diazoman/theme.xsl
            path='$uri'
            ;
        xslt_html_parser on;
        xslt_types text/html;
        # rewrite / $1/$lang;
        rewrite ^/?$ $scheme://$host/$lang/;
        #rewrite ^/raw(.*)$ $1;
        root   /home/username/webapps/diazoman/html;
        index  index.html index.htm;
    }
    location /blog {
        xslt_stylesheet /home/username/webapps/diazoman/theme.xsl
            path='$uri'
            ;
        xslt_html_parser on;
        xslt_types text/html;
        proxy_headers_hash_max_size 51200;
        proxy_pass http://wordpress.example.com/;
        proxy_set_header Host wordpress.example.com;
        #rewrite ^/blog/(.*)+$ /blog/index.php?$1;
        rewrite ^/blog/(.*)$ /$1 break;
        #proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Diazo "true";
        proxy_set_header Accept-Encoding "";
    }

I had some fun theming a friend’s server in Chinese.

# In http context
server {
    listen 30742;
    server_name joomla.example.com;
    root /home/username/webapps/diazoman/html;

    location / {
    # rewrite /example/example /example;
    xslt_stylesheet /home/username/webapps/diazoman/theme.xsl
        path='$uri'
        ;
    xslt_html_parser on;
    xslt_types text/html;
    proxy_pass http://landdu.com/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Diazo "true";
    proxy_set_header Accept-Encoding "";
    }

    location /css/ {}
    location /favicon.ico {}
    location /images/images/ {}
}

Démarrage et arrêt de Nginx

Démarrage: /home/username/opt/nginxslt/sbin/nginx Arrêt: kill cat /home/username/opt/nginxslt/logs/nginx.pid Création d’executable start script dans/home/username/opt/nginxslt/bin/start Création d’executable stop script dans/home/username/opt/nginxslt/bin/stop Edition de crontab avec $ crontab -e avec l’ajout de cette ligne. /5 * * * $HOME/opt/nginxslt/bin/start