zimg est une solution légère et performante conçue pour le stockage et la manipulation d'images. Développé entièrement en langage C, ce système se distingue par sa capacité à gérer de larges volumes d'images tout en offrant des performances élevées.
Caractéristiques Clés de zimg
- Communication via protocole HTTP pour les opérations de téléversement, téléchargement et traitemant d'images.
- Support du stockage d'images distribué, compatible avec des systèmes comme beansDB ou SSDB.
- Gestion concurrentielle des E/S et compression d'images efficace pour des performances optimales.
- Intégration de scripts Lua pour la personnalisation des stratégies de compression.
- Prise en charge de memcached et d'un protcoole révisé pour l'enregistrement d'images sur des infrastructures de stockage distribuées.
- Options de configuration complètes pour une gestion et une maintenance simplifiées.
Architecture de Stockage de zimg
L'architecture de zimg est structurée en trois couches distinctes, toutes optimisées pour la performance grâce à leur implémentation en C :
- La couche frontale de gestion HTTP.
- La couche intermédiaire de traitement d'images.
- La couche dorsale de stockage.
Afin d'éviter les goulots d'étranglement potentiels des bases de données relationnelles, zimg ne s'appuie pas sur des systèmes de gestion de bases de données structurées. La recherche d'images s'effectue exclusivement par des techniques de hachage. La conception d'un serveur d'images est un équilibre délicat entre les opérations d'E/S et les calculs CPU. La stratégie optimale consisterait à distribuer les différentes couches : les couches HTTP et de traitement d'images (intensives en CPU) sur des machines puissantes, la couche de cache (intensive en mémoire) sur des serveurs avec une grande quantité de RAM, et la couche de stockage physique (intensive en E/S) sur des machines équipées de SSD.
Cependant, une telle configuration est souvent coûteuse. zimg propose un compromis entre coût et besoins opérationnels, permettant un déploiement sur une seule machine. Bien que les performances varient considérablement selon le matériel, l'approche de zimg minimise les E/S et privilégie l'utilisation du CPU. Cette stratégie s'est avérée efficace, en particulier sur des machines dont les disques durs sont peu performants. Même avec la généralisation des SSD à l'avenir, la puissance de calcul des CPU augmentera proportionnellement, garantissant la pertinence du modèle de zimg.
Pour un déploiement optimal et simplifié, il est recommandé de séparer zimg du système de stockage backend sur des machines différentes. zimg, étant axé sur la compression d'images, est intensif en calcul, tandis que les systèmes de stockage comme beansdb ou SSDB sont intensifs en E/S. L'activation de memcached sur la machine zimg permet d'exploiter pleinement la mémoire locale, tandis que la mémoire de la machine de stockage est utilisée par beansdb/SSDB, évitant ainsi les conflits de ressources et optimisant l'utilisation globale.
Déploiement de zimg
Installation des dépendances nécessaires
Avant d'installer zimg, plusieurs bibliothèques doivent être configurées. Suivez les étapes ci-dessous pour chaque dépendance.
OpenSSL
curl -LO http://www.openssl.org/source/openssl-1.0.1i.tar.gz
tar -xzf openssl-1.0.1i.tar.gz
cd openssl-1.0.1i
./config shared --prefix=/usr/local --openssldir=/usr/ssl
make
sudo make install
CMake
curl -LO http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.gz
tar -xzf cmake-3.0.1.tar.gz
cd cmake-3.0.1
./bootstrap --prefix=/usr/local
make
sudo make install
Libevent
curl -LO http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar -xzf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local
make
sudo make install
NASM
curl -LO https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.gz --no-check-certificate
tar -xzf nasm-2.15.05.tar.gz
cd nasm-2.15.05
./configure
make
sudo make install
Libjpeg-turbo
curl -LO https://downloads.sourceforge.net/project/libjpeg-turbo/1.3.1/libjpeg-turbo-1.3.1.tar.gz
tar -xzf libjpeg-turbo-1.3.1.tar.gz
cd libjpeg-turbo-1.3.1
./configure --prefix=/usr/local --with-jpeg8
make
sudo make install
WebP
curl -LO http://downloads.webmproject.org/releases/webp/libwebp-0.4.1.tar.gz
tar -xzf libwebp-0.4.1.tar.gz
cd libwebp-0.4.1
./configure
make
sudo make install
ImageMagick
curl -LO http://www.imagemagick.org/download/ImageMagick.tar.gz
tar -xzf ImageMagick.tar.gz
cd ImageMagick-6.9.1-10
./configure --prefix=/usr/local
make
sudo make install
Libmemcached
curl -LO https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -xzf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local
make
sudo make install
Téléchargement et compilation de zimg
git clone https://github.com/buaazp/zimg -b master --depth=1
cd zimg
make
Installation des composants de stockage (optionnel)
Selon vos besoins en stockage, vous pouvez installer l'une des solutions de backend suportées.
Memcached
curl -LO http://www.memcached.org/files/memcached-1.4.19.tar.gz
tar -xzf memcached-1.4.19.tar.gz
cd memcached-1.4.19
./configure --prefix=/usr/local
make
sudo make install
BeansDB
git clone https://github.com/douban/beansdb
cd beansdb
./configure --prefix=/usr/local
make
Beanseye
git clone git@github.com:douban/beanseye.git
cd beanseye
make
SSDB
curl -LO https://github.com/ideawu/ssdb/archive/master.zip --no-check-certificate
unzip master
cd ssdb-master
make
Twemproxy
git clone git@github.com:twitter/twemproxy.git
cd twemproxy
autoreconf -fvi
./configure --enable-debug=log
make
src/nutcracker -h
Configuration de zimg
Le fichier de configuration principal est zimg/bin/conf/zimg.lua. Modifiez les paramètres comme suit :
--zimg server config
--server config
-- Exécution en mode démon (0 = non, 1 = oui)
is_daemon = 1
-- Adresse IP à lier
ip = '0.0.0.0'
-- Numéro de port
port = 4869
-- Nombre de threads du serveur (par défaut : nombre de CPU)
-- thread_num=4
backlog_num = 1024
max_keepalives = 1
retry = 3
system = io.popen('uname -sn'):read('*l')
pwd = io.popen('pwd'):read('*l')
--header config
-- En-têtes HTTP inclus dans la réponse
headers = 'Cache-Control:max-age=7776000'
-- Activation du cache ETag (0 = non, 1 = oui)
etag = 1
--access config
-- Supporte les règles de masque comme 'allow 10.1.121.138/24'
-- NOTE : La suppression de ces règles peut améliorer les performances.
-- Contrôle d'accès IP pour l'interface de téléversement
-- upload_rule = 'allow all'
-- Contrôle d'accès IP pour l'interface de téléchargement
-- download_rule = 'allow all'
-- Contrôle d'accès IP pour l'interface d'administration
admin_rule = 'allow 127.0.0.1'
--cache config
-- Activation du cache Memcached (0 = non, 1 = oui)
cache = 1
-- Adresse IP du serveur Memcached
mc_ip = '127.0.0.1'
-- Port du serveur Memcached
mc_port = 11211
--log config
-- Niveau de journalisation (0=FATAL, 7=DEBUG)
log_level = 6
-- Chemin du fichier de journalisation
log_name = pwd .. '/log/zimg.log'
--htdoc config
-- Chemin du fichier HTML de la page d'accueil par défaut
root_path = pwd .. '/www/index.html'
-- Chemin du fichier HTML de la page d'administration
admin_path = pwd .. '/www/admin.html'
--image process config
-- Désactiver le traitement d'images via URL (0 = non, 1 = oui)
disable_args = 0
-- Désactiver le traitement d'images via script Lua (0 = non, 1 = oui)
disable_type = 0
-- Chemin du script de traitement Lua
script_name = pwd .. '/script/process.lua'
-- Format par défaut pour les nouvelles images ('none' pour l'original, ou nom de format)
format = 'jpeg'
-- Qualité par défaut pour les nouvelles images (1-100, par défaut : 75)
quality = 75
--storage config
-- zimg supporte 3 modes de stockage d'images
-- Type de backend de stockage : 1=disque local, 2=protocole memcached (ex: beansdb), 3=protocole redis (ex: SSDB)
mode = 1
-- Stratégie de sauvegarde des nouveaux fichiers : 0=ne rien sauvegarder, 1=tout sauvegarder, 2=sauvegarder uniquement les types définis dans le script Lua
save_new = 1
-- Limite de taille pour les images téléversées (par défaut : 100 Mo)
max_size = 100*1024*1024
-- Liste des types d'images autorisés à l'upload
allowed_type = {'jpeg', 'jpg', 'png', 'gif', 'webp'}
--mode[1]: local disk mode
-- Chemin de stockage pour le mode disque local
img_path = pwd .. '/img'
--mode[2]: beansdb mode
-- Adresse IP du serveur beansdb
beansdb_ip = '127.0.0.1'
-- Port du serveur beansdb
beansdb_port = 7900
--mode[3]: ssdb mode
-- Adresse IP du serveur SSDB
ssdb_ip = '127.0.0.1'
-- Port du serveur SSDB
ssdb_port = 8888
Démarrage de zimg
cd bin
./zimg conf/zimg.lua
Opérations sur les Images
Téléversement de fichiers
Vous avez deux méthodes pour téléverser des images :
- Via formulaire HTML : Accédez à
http://ip:4869dans votre navigateur pour utiliser l'interface de téléversement intégrée de zimg. Après avoir sélectionné et envoyé une ou plusieurs images, une page de confirmation s'affichera. - Via requête raw-post : Utilisez une approche programmatique pour envoyer des fichiers. Le serveur retournera une réponse JSON contenant la valeur de hachage MD5 unique de l'image. Notez que le téléversement d'un fichier identique ne créera pas de nouvelle entrée de stockage.
Accès aux images
Pour accéder à une image, utilisez l'URL suivante : http://ip:port/code_md5_de_l_image.
Sans paramètres additionnels, zimg renvoie l'image originale avec une qualité de 75% par défaut. Vous pouvez ajouter des paramètres pour effectuer des traitements simples :
| Paramètre | Signification | Notes |
|---|---|---|
w |
Largeur de l'image | Si seule la largeur ou la hauteur est spécifiée, le paramètre p=1 (échelle proportionnelle) est implicitement appliqué. Si les deux sont définis, l'image est redimensionnée aux dimensions exactes. |
h |
Hauteur de l'image | |
g |
Désaturation des couleurs | g=1 convertit l'image en noir et blanc. |
x |
Coordonnée horizontale du point d'ancrage | |
y |
Coordonnée verticale du point d'ancrage | |
r |
Angle de rotation (sens horaire) | |
p |
Niveau de zoom/échelle | p=0 : image originale ; p=1 : échelle proportionnelle ; p=2 : pas de redimensionnement ; p=3 : redimensionnement selon les proportions w et h. |
q |
Qualité de l'image (0-100) | Une valeur plus élevée indique une meilleure qualité. |
f |
Format de retour spécifié | Formats disponibles : 'jpeg', 'jpg', 'png', 'gif', 'webp'. |
Suppression d'images
Pour supprimer une image, envoyez une requête à http://ip:port/admin avec les paramètres md5 de l'image et t=1.
Limitations et Considérations
Bien que zimg offre des fonctionnalités robustes, il convient de prendre en compte certains aspects :
- Le projet n'a pas été mis à jour sur GitHub depuis le 18 octobre 2017. L'absence de maintenance continue pourrait rendre la résolution de problèmes complexes à l'avenir.
- La base de code, principalement en C, rend les développements secondaires ou l'ajout de nouvelles fonctionnalités particulièrement ardus sans une expertise approfondie.
- Le processus de déploiement et de fonctionnement de zimg requiert l'installation d'un grand nombre de dépendances, ce qui peut entraîner des conflits de versions ou des impacts inattendus sur la stabilité du serveur.
- La stabilité du service en production reste à évaluer après un déploiement réel.
- Les informations stockées avec les images sont limitées, sans champs pour des métadonnées essentielles telles que la date de capture ou de téléversement.