Comment définir individuellement LD_LIBRARY_PATH pour les sites Web django avec Apache et mod_wsgi

Je déploie mes sites web Django sur Apache2 avec mod_wsgi sur ubuntu.

Dans mes vues Django, j’importe un module qui requirejs un chemin spécifique défini dans LD_LIBRARY_PATH.

Lorsque je définis LD_LIBRARY_PATH dans / etc / apache2 / envvars comme:

export LD_LIBRARY_PATH=/home/user/target_libdir:$LD_LIBRARY_PATH 

Ça marche.

Cependant, sur mon serveur, je lance plusieurs sites Web django, chacun dans une entrée VirtualHost indépendante, avec des scripts wsgi indépendants.

Le problème est que les sites Web doivent utiliser différentes versions de LD_LIBRARY_PATH.

Alors, comment puis-je définir LD_LIBRARY_PATH individuellement pour chaque site Web de Django?

Vous ne pouvez pas le faire. LD_LIBRARY_PATH n’est lu qu’une seule fois au démarrage initial du processus. Il ne peut pas être défini une fois que le processus est en cours et que vous ne pouvez plus le configurer avant un fork. Vous pouvez le définir avant un exec, mais les processus du démon mod_wsgi ne sont que des fork et non un exec.

Mettre à jour

Ce qui suit ne semble pas fonctionner. Le laisser ici comme un avertissement aux autres.


Peut fonctionner si vous définissez dans votre fichier .wsgi . En supposant que vous avez quelque chose comme:

 import os,sys sys.path.append('/path/to/django') os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' os.environ['LD_LIBRARY_PATH'] = '/path/to/library' import django.core.handlers.wsgi _application = django.core.handlers.wsgi.WSGIHandler() def application(environ,start_response): return _application(environ,start_response) 

Eh bien, il existe des situations où vous ne pouvez simplement pas définir la variable LD_LIBRARY_PATH avant l’exécution du script et que vous souhaitez toujours importer une ou deux bibliothèques personnalisées. , ou le personnaliser pour chaque site comme dans la question ci-dessus.

Dans ces cas où toutes les solutions sensibles ne sont pas disponibles, vous pouvez charger les bibliothèques en utilisant ctypes et importer le module qui les utilise. Il est simple d’adopter cette idée pour charger toutes les bibliothèques à partir d’un dossier personnalisé pour chaque site, comme dans la question ci-dessus.

Donc, pour le problème que j’avais avec libpuzzle avec une dépendance, j’ai fini par faire:

 from ctypes import * lib1 = cdll.LoadLibrary('/home/username/lib/libpuzzle.so') lib2 = cdll.LoadLibrary('/home/username/lib/libgd.so') import pypuzzle