2017-06-14 3 views
0

J'ai un serveur EC2 AWS sur lequel j'aimerais héberger quelques applications Django. Chacune de ces applications a sa propre URL. Par exemple,Servir plusieurs applications WSGI en tant que différents hôtes virtuels sur Apache

example1.com example2.com

par lui-même, example1.com œuvres. Le problème est d'obtenir example2.com de travailler avec elle en même temps.

Lorsque je visite example2.com, je reçois une erreur:

DisallowedHost at/
Invalid HTTP_HOST header: 'example2.com'. You may need to add 'example2.com' to ALLOWED_HOSTS. 
Request Method: GET 
Request URL: http://example2.com 
Django Version: 1.9.13 
Exception Type: DisallowedHost 
Exception Value:  
Invalid HTTP_HOST header: 'example2.com'. You may need to add 'example2.com' to ALLOWED_HOSTS. 
Exception Location: /var/www/vhosts/example1/example1-env/lib/python3.5/site-packages/django/http/request.py in get_host, line 109 
Python Executable: /usr/bin/python3 
Python Version: 3.5.1 
Python Path:  
['/usr/lib64/python3.5', 
'/usr/lib64/python3.5/plat-linux', 
'/usr/lib64/python3.5/lib-dynload', 
'/usr/local/lib64/python3.5/site-packages', 
'/usr/local/lib/python3.5/site-packages', 
'/usr/lib64/python3.5/dist-packages', 
'/usr/lib/python3.5/dist-packages', 
'/var/www/vhosts/example1/', 
'/var/www/vhosts/example1/example1-env/lib/python3.5/site-packages'] 
Server time: Wed, 14 Jun 2017 20:31:27 +0000 

Comme vous pouvez le voir, en quelque sorte Apache tente d'utiliser l'environnement virtuel de example1.com quand il sert example2.com. Comment pourrais-je corriger cela? Chacun devrait être servi avec son propre virtualenv.

Voici le fichier de configuration Apache:

<VirtualHost *:80> 
     # This is name based virtual hosting. So place an appropriate server name 
     # here. Example: django.devsrv.local 
     ServerName example1.com 

     WSGIDaemonProcess example1 python-home=/var/www/vhosts/example1/example1-env 
     WSGIProcessGroup %{GLOBAL} 

     # Insert the full path to the wsgi.py-file here 
     WSGIScriptAlias//var/www/vhosts/example1/example1/wsgi.py 

     <Directory /var/www/vhosts/example1/> 
      Require all granted 
     </Directory> 

     Alias /static/ /var/www/vhosts/example1/static/ 

     <Directory /var/www/vhosts/example1/static/> 
     Order deny,allow 
     Allow from all 
     </Directory> 

     Alias /media/ /var/www/vhosts/example1/media/ 
     <Directory /var/www/vhosts/example1/media/> 
     Order deny,allow 
     Allow from all 
     </Directory> 

    </VirtualHost> 

    <VirtualHost *:80> 
     # This is name based virtual hosting. So place an appropriate server name 
     # here. Example: django.devsrv.local 
     ServerName example2.com 
     WSGIDaemonProcess example2 python-home=/var/www/vhosts/example2/example2-env 
     WSGIProcessGroup %{GLOBAL} 

     # Insert the full path to the wsgi.py-file here 
     WSGIScriptAlias//var/www/vhosts/example2/example2/wsgi.py 

     <Directory /var/www/vhosts/example2/> 
      Require all granted 
     </Directory> 

     Alias /static/ /var/www/vhosts/example2/static/ 

     <Directory /var/www/vhosts/example2/static/> 
     Order deny,allow 
     Allow from all 
     </Directory> 

     Alias /media/ /var/www/vhosts/example2/media/ 
     <Directory /var/www/vhosts/example2/media/> 
     Order deny,allow 
     Allow from all 
     </Directory> 
    </VirtualHost> 

Edit: Après avoir lu quelques suggestions dans les commentaires, je suis venu à ce sujet. Cela ne fonctionne toujours pas.

ServerName example1.com 

WSGIDaemonProcess example1 display-name=%{GROUP} python-path=/var/www/vhosts/example1/ python-home=/var/www/vhosts/example1/example1-env/ 
WSGIApplicationGroup %{GLOBAL} 
WSGIProcessGroup example1 

# Insert the full path to the wsgi.py-file here 
WSGIScriptAlias//var/www/vhosts/example1/example1/wsgi.py process-group=example1 

...

ServerName example2.com 

WSGIDaemonProcess example2 display-name=%{GROUP} python-home=/var/www/vhosts/example2/example2-env/ python-path=/var/www/vhosts/example2/ 
WSGIApplicationGroup %{GLOBAL} 
WSGIProcessGroup example2 

# Insert the full path to the wsgi.py-file here 
WSGIScriptAlias//var/www/vhosts/example2/example2/wsgi.py process-group=example2 
+0

Cette erreur n'a rien à voir avec l'environnement virtuel. Vous devez ajouter example2.com aux hôtes autorisés dans votre settings.py. – giaco

+0

Vous manquez le point. Cela ne le résoudra pas car l'erreur provient d'exemple1 env Python – MadPhysicist

+1

Vous ne définissez pas correctement '' WSGIProcessGroup''. Ce devrait être le nom du groupe de processus démon pour l'hôte virtuel, pas ''% {GLOBAL} ''. Vous vouliez probablement dire '' WSGIApplicationGroup% {GLOBAL} '', ce qui est recommandé, mais vous avez toujours besoin du '' WSGIProcessGroup''. Lire http://blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html –

Répondre

0

La configuration suivante a fonctionné pour moi. En bref, il sert deux applications Django différentes à example1.com et example2.com en utilisant leurs environnements virtuels respectifs.

Comme vous pouvez le voir, l'insertion de la ServerAliasETServerName fait toute la différence, à côté de quelques autres corrections par suggéré par la communauté.

configuration Apache:

<IfModule !wsgi_module> 
LoadModule wsgi_module modules/mod_wsgi.so 
</IfModule> 

<VirtualHost *:80> 

    ServerName www.example1.com 
    ServerAlias example1.com 

    WSGIDaemonProcess example1 display-name=%{GROUP} python-path=/var/www/vhosts/example1/ python-home=/var/www/vhosts/example1/example1-env/ 
    WSGIApplicationGroup %{GLOBAL} 
    WSGIProcessGroup example1 


    # Insert the full path to the wsgi.py-file here 
    WSGIScriptAlias//var/www/vhosts/example1/example1/wsgi.py process-group=example1 

    <Directory /var/www/vhosts/example1/> 
     Require all granted 
    </Directory> 

    Alias /static/ /var/www/vhosts/example1/static/ 

    <Directory /var/www/vhosts/example1/static/> 
    Order deny,allow 
    Allow from all 
    </Directory> 

    Alias /media/ /var/www/vhosts/example1/media/ 
    <Directory /var/www/vhosts/example1/media/> 
    Order deny,allow 
    Allow from all 
    </Directory> 
</VirtualHost> 

<VirtualHost *:80> 

    ServerName www.example2.com 
    ServerAlias example2.com 

    WSGIDaemonProcess example2 display-name=%{GROUP} python-home=/var/www/vhosts/example2/example2-env/ python-path=/var/www/vhosts/example2/ 
    WSGIApplicationGroup %{GLOBAL} 
    WSGIProcessGroup example2 

    # Insert the full path to the wsgi.py-file here 
    WSGIScriptAlias//var/www/vhosts/example2/example2/wsgi.py process-group=example2 

    <Directory /var/www/vhosts/example2/> 
     Require all granted 
    </Directory> 

    Alias /static/ /var/www/vhosts/example2/static/ 

    <Directory /var/www/vhosts/example2/static/> 
    Order deny,allow 
    Allow from all 
    </Directory> 

    Alias /media/ /var/www/vhosts/example2/media/ 
    <Directory /var/www/vhosts/example2/media/> 

</VirtualHost> 
+0

Vous n'avez pas besoin de '' ServerAlias'' pour que les hôtes virtuels fonctionnent. Vous avez seulement besoin du '' ServerAlias'' si vous avez vraiment besoin de lui rendre visite via le nom d'hôte sans '' www''. Le '' WSGIProcessGroup'' est redondant car vous avez l'option '' process-group'' à '' WSGIScriptAlias''.Vous pourriez utiliser l'option '' application-group'' pour '' WSGIScriptAlias'' afin d'éliminer '' WSGIApplicationGroup'', bien que sachez que l'utilisation de ces deux options pour '' WSGIScriptAlias'' activera le préchargement du script WSGI sur le démarrage du processus. –