2009-10-12 15 views
53

que desea alojar varios sitios con bajo el mismo servidor que utiliza Debian 5, decir que tengo site1, site2 y site3, y asumo mi ip es 155.55.55.1:sitios Django múltiples con Apache y mod_wsgi

site1: 155.55.55.1:80 , script at /opt/django/site1/ 
site2: 155.55.55.1:8080, script at /opt/django/site2/ 
site3: 155.55.55.1:8090, script at /opt/django/site3/ 

Aquí es mi defecto Apache:

<VirtualHost *:80> 
    ServerName/
    ServerAlias */ 
    DocumentRoot /opt/django/site1/ 
    LogLevel warn 
    WSGIScriptAlias//opt/django/site1/apache/django.wsgi 
    Alias /media /opt/django/site1/media/statics 
    Alias /admin_media /home/myuser/Django-1.1/django/contrib/admin/media 
</VirtualHost> 

<VirtualHost *:80> 
    DocumentRoot "/usr/share/phpmyadmin" 
    ServerName /phpmyadmin 
    Alias /phpmyadmin /usr/share/phpmyadmin 
    <Directory /usr/share/phpmyadmin> 
     Options Indexes FollowSymLinks 
     AllowOverride None 
     Order Deny,Allow 
     Allow from all 
    </Directory> 
</VirtualHost> 

Y aquí está mi config wsgi para site1, en /opt/django/site1/apache/django.wsgi:

import os, sys 
import django.core.handlers.wsgi 

sys.path.append('/opt/django') 
sys.path.append('/opt/django/site1') 

os.environ['DJANGO_SETTINGS_MODULE'] = 'site1.settings' 
application = django.core.handlers.wsgi.WSGIHandler() 

¿Cómo puedo agregar site2 y site3, que son sitios basados ​​en Django y se mostrarán como site1?

+0

¿Cuál es tu pregunta? –

+0

He editado mi pregunta, lo siento, olvidé :) – Hellnar

Respuesta

97

Sus directivas ServerName/ServerAlias ​​son incorrectas. ServerName debe ser el nombre de host. Probablemente deberías simplemente eliminar ServerAlias.

Luego haga las directivas VirtualHost/Listen obvias y duplicadas, simplemente cambie el número de puerto y las ubicaciones de los scripts en el sistema de archivos.

Por último, no configure DocumentRoot para que esté donde está su código Django, ya que hace que sea más fácil exponer accidentalmente su código fuente para descargar si rellena la configuración de Apache. Por lo tanto, simplemente elimine la directiva DocumentRoot de VirtualHost para los sitios de Django.

Listen 80 

<VirtualHost *:80> 
ServerName www.example.com 
WSGIScriptAlias//opt/django/site1/apache/django.wsgi 
Alias /media /opt/django/site1/media/statics 
Alias /admin_media /home/myuser/Django-1.1/django/contrib/admin/media 

<Directory opt/django/site1/apache> 
Order allow,deny 
Allow from all 
</Directory> 

<Directory /home/myuser/Django-1.1/django/contrib/admin/media> 
Order allow,deny 
Allow from all 
</Directory> 
</VirtualHost> 

Listen 8080 

<VirtualHost *:8080> 
ServerName www.example.com 
WSGIScriptAlias//opt/django/site2/apache/django.wsgi 
Alias /media /opt/django/site2/media/statics 
Alias /admin_media /home/myuser/Django-1.1/django/contrib/admin/media 

<Directory opt/django/site2/apache> 
Order allow,deny 
Allow from all 
</Directory> 

<Directory /home/myuser/Django-1.1/django/contrib/admin/media> 
Order allow,deny 
Allow from all 
</Directory> 
</VirtualHost> 

Listen 8090 

<VirtualHost *:8090> 
ServerName www.example.com 
WSGIScriptAlias//opt/django/site3/apache/django.wsgi 
Alias /media /opt/django/site3/media/statics 
Alias /admin_media /home/myuser/Django-1.1/django/contrib/admin/media 

<Directory opt/django/site3/apache> 
Order allow,deny 
Allow from all 
</Directory> 

<Directory /home/myuser/Django-1.1/django/contrib/admin/media> 
Order allow,deny 
Allow from all 
</Directory> 
</VirtualHost> 

También he añadido la directiva del directorio faltante para permitir el acceso a archivos estáticos. Sin embargo, debes revisar las rutas.

asegúrese de leer:

http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

para más información.


ACTUALIZA 1

Por cierto, dado que está utilizando PHP en Apache misma, que sería mucho mejor usar el modo mod_wsgi demonio y empujar cada instancia de Django a cabo en su propio proceso separado. Eso permite que esos procesos sean multiproceso, a pesar de que los procesos principales de Apache están forzados a ser de un solo hilo debido a PHP. El resultado final será que se utilizará mucha menos memoria que si se ejecutaran múltiples instancias de Django en cada proceso en modo integrado con prefork MPM. Tu código de Django solo necesita ser seguro para subprocesos. La configuración además de la anterior sería agregar WSGIDaemonProcess/WSGIProcessGroup a cada Django VirtualHost, donde el nombre del grupo de procesos del daemon es diferente para cada VirtualHost.

<VirtualHost *:80> 
WSGIDaemonProcess site1 display-name=%{GROUP} 
WSGIProcessGroup site1 
... existing stuff 
</VirtualHost> 

<VirtualHost *:8080> 
WSGIDaemonProcess site2 display-name=%{GROUP} 
WSGIProcessGroup site2 
... existing stuff 
</VirtualHost> 

<VirtualHost *:8090> 
WSGIDaemonProcess site3 display-name=%{GROUP} 
WSGIProcessGroup site3 
... existing stuff 
</VirtualHost> 

Esto también le permite reiniciar más fácilmente cada instancia de Django sin reiniciar todo Apache. Leer:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

+1

wow gracias por su amable y detallada explicación Graham! Estoy ejecutando mis sitios internamente para mi empresa, por lo que no tiene dominio sino un DNS interno y solo se puede acceder localmente a través de http: // mysite /, en este caso, ¿debo cambiar ServerName www.example.com a ServerName mysite? – Hellnar

+0

Sí. Eso debería funcionar. – mlissner

+1

También me gusta agregar python-path a la línea WSGIDaemonProcess para aprovechar virtualenv y localizar mis paquetes de sitio python en algún lugar inteligente – mogga

2

Poner toda la configuración del host virtual en un solo lugar funciona bien, pero Debian tiene su propio concepto separándolas en un archivo para cada sitio en/etc/apache2/sites-available, que son activado al enlazarlos simbólicamente en ../sites- habilitados. De esta forma, un administrador de servidor también podría asignar derechos de acceso separados al archivo de configuración para cada usuario de administrador de sitio, los scripts pueden verificar si un sitio está activo, etc.

Básicamente sería bueno tener uno howto central para las instalaciones de Django-Admin, la actual multitud de documentos, enlaces y artículos de blog no es realmente útil para la proliferación de Django.

Cuestiones relacionadas