Z-Push et Nginx

Update : Nouvelle version !

Ayant un serveur de messagerie personnel sous Zimbra, je voulais le synchroniser avec mon téléphone. Pour cela j’ai d’abord utilisé Funambol mais le logiciel tournant sous Java, il me prenait trop de ressources sur mon petit serveur Kimsufi. De plus il faut installer un logiciel supplémentaire sur le téléphone alors que j’ai déjà un logiciel qui permet de synchroniser via activesync.

J’ai donc fait le tour des solutions existantes qui dispose d’un connecteur pour Zimbra et malheureusement il n’y a pas grand chose de disponible à l’heure actuelle. Le projet le plus intéressant et c’est celui que j’ai mis en place est z-push qui fait partie de la solution Zarafa. Via un plug-in développé par la communauté cela me permet de synchroniser mes mails/calendrier/contacts/tâches grâce au logiciel déjà disponible sur mon téléphone.

Ce logiciel tournant sous php il n’était pas difficile de l’ajouter à mon serveur existant sans consommer de ressources supplémentaire. Le plus compliqué c’est que celui-ci tourne sous nginx et qu’il n’y a aucune documentation existante pour faire fonctionner z-push avec nginx. J’ai du pas mal tâtonner avant de réussir à le faire fonctionner correctement.  J’espère que ce tutoriel vous conviendra et qu’il sera fonctionnel pour tout le monde (les mystères de l’informatique sont parfois impénétrables 🙂 )

Votre serveur nginx doit être paramétré pour tourner avec PHP (par ex.  fastcgi php-fmp ). Il est indispensable de faire tourner PHP avec nginx car z-push s’articule entièrement autour de scripts en PHP.

Une fois que tout fonctionne correctement, rendez-vous dans votre répertoire de site web pour installer z-push

[code lang= »bash »]
cd /var/www/
wget http://download.berlios.de/z-push/z-push-1.4.3.tar.gz
wget http://downloads.sourceforge.net/project/zimbrabackend/Release47/zimbra47.tgz
tar xzvf http://download.berlios.de/z-push/z-push-1.4.3.tar.gz
tar xzvf zimbra47.tgz -C z-push/backend/
chmod 740 z-push/state
chown www-data:www-data z-push/state
[/code]

ok une fois que tous est installé on va configurer z-push pour attaquer Zimbra en backend. Pour cela modifiez le fichier le fichier config.php comme suit :

[code]
$BACKEND_PROVIDER = "BackendZimbra";
define(‘MAPI_SERVER’, ‘file:///var/run/zarafa’);
define(‘ZIMBRA_URL’, ‘http://zimbra.domain.com’);
define(‘ZIMBRA_USER_DIR’, ‘zimbra’);
define(‘ZIMBRA_SYNC_CONTACT_PICTURES’, true);
define(‘ZIMBRA_VIRTUAL_CONTACTS’,true);
define(‘ZIMBRA_VIRTUAL_APPOINTMENTS’,true);
define(‘ZIMBRA_VIRTUAL_TASKS’,true);
define(‘ZIMBRA_IGNORE_EMAILED_CONTACTS’,true);
define(‘ZIMBRA_HTML’,false);
define(‘ZIMBRA_ENFORCE_VALID_EMAIL’,true);
define(‘ZIMBRA_NOKIA_MFE_FIX’,true);
define(‘ZIMBRA_NOKIA_MFE_ALWAYS_OVERWRITE’,true);
#Si jamais vous voulez debuger passer l’option suivante a true
define(‘ZIMBRA_DEBUG’,false);
#Et enfin si vous voulez gérer vos appareils mobile depuis une interface web passer l’option suivante
#a true et suivez les instruction que vous trouverez ici :
#http://downloads.sourceforge.net/project/zimbrabackend/Release47/Release%20Notes%20-%20Revision%2047.txt
define(‘PROVISIONING’, false);
[/code]

Comme on utilise nginx avec fastcgi il faut faire quelques modifications afin que les requêtes web soient traité correctement par z-push

Il faut ajouter ces lignes à la fin du fichier compat.php juste avant « ?> »

[code lang= »bash »]
if (!function_exists(‘apache_request_headers’)) {
function apache_request_headers() {
$header = array();
$header[‘Ms-Asprotocolversion’] = $_SERVER[‘HTTP_MS_ASPROTOCOLVERSION’];
$header[‘X-Ms-Policykey’] = $_SERVER[‘HTTP_X_MS_POLICYKEY’];
$header[‘User-Agent’] = $_SERVER[‘HTTP_USER_AGENT’];

return $header;
}

list($_SERVER[‘PHP_AUTH_USER’], $_SERVER[‘PHP_AUTH_PW’]) = explode(‘:’ , base64_decode(substr($_SERVER[‘HTTP_AUTHORIZATION’], 6)));
}
[/code]

et commenter la ligne suivante dans le fichier index.php

[code lang= »bash »]
//header("Content-Length: $len");
[/code]

enfin configurez votre virtualhost

[code language= »bash »]server {
listen 80;
server_name push.domain.com;
access_log  /var/log/nginx/z-push.access.log  combined;
error_log /var/log/nginx/z-push.error.log;

location / {
root   /var/www/z-push;
index  index.php index.html;

if (!-f $request_filename) {
rewrite  ^(.*)$  /index.php?q=$1  last;
break;
}
}

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
proxy_read_timeout 120;
proxy_connect_timeout 120;
fastcgi_pass  127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/z-push/$fastcgi_script_name;
}
}[/code]

Si comme moi vous avez un autre serveur qui fait office de reverse proxy en frontal, n’oubliez pas d’ajouter ces lignes dans votre nginx.conf  sinon votre serveur n’arrivera pas à communiquer avec votre téléphone :

[code lang= »bash »]
##Sert a recuperer l’adresse ip d’origine dans les headers
##Ref : http://wiki.nginx.org/HttpRealIpModule
set_real_ip_from        XX.XX.XX.XX; <= IP du Frontal
real_ip_header          X-Real-IP;[/code]

Et voila il ne reste plus qu’a configurer votre téléphone et le tour est joué.

Références :

http://z-push.sourceforge.net/phpbb/viewtopic.php?f=4&t=1245&p=4762&hilit=apache_request_headers#p4762
http://www.jopa.fr/index.php/2009/08/05/push-mail-sur-serveur-imap-gmail/

22 bis Rue de Trey

2 commentaires

  1. Bon résumé. Ceci dit, ce n’est probablement pas complet vu nginx ne supporte pas la méthode ‘OPTIONS’

    « OPTIONS /Microsoft-Server-ActiveSync?Cmd=OPTIONS&User=r&DeviceId=validate&DeviceType=Android HTTP/1.1 » 405 166 « – » « Android/0.3 »

    -> 405 Method Not Allowed

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.