无法在子域上运行带有apache的django项目

时间:2015-05-21 08:53:48

标签: django apache dns subdomain

我有一个在线商店,其中包含主页和商店页面。现在这个主页面和商店页面实际上是两个不同的项目,所以为了让它们在线,我必须运行两个django实例。

现在的情况是,我希望在www.setakshop.ir上有主页,在shop.setakshop.ir上有商店。事情是,在设置必要的设置后,shop.setakshop.ir和setakshop.ir都指向主页面!我只能通过setakshop.ir:8000看到商店页面,我希望apache将其代理到shop.setakshop.ir 我自己提供DNS,这是我的DNS设置:

;
; BIND data file for setakshop.ir
;
$TTL    3h
@       IN      SOA     ns1.setakshop.ir. admin.setakshop.ir. (
                          1        ; Serial
                          3h       ; Refresh after 3 hours
                          1h       ; Retry after 1 hour
                          1w       ; Expire after 1 week
                          1h )     ; Negative caching TTL of 1 day
;
@       IN      NS      ns1.setakshop.ir.
@       IN      NS      ns2.setakshop.ir.


setakshop.ir.    IN      MX      10      mail.setakshop.ir.
setakshop.ir.    IN      A       xx.xx.xx.xx
ns1                     IN      A       xx.xx.xx.xx
ns2                     IN      A       xx.xx.xx.xx
www                     IN      CNAME   setakshop.ir.
mail                    IN      A       xx.xx.xx.xx
ftp                     IN      CNAME   setakshop.ir.
shop                     IN     A     xx.xx.xx.xx

并且在运行时

nslookup shop.setakshop.ir

我得到了有效的答复。所以我认为DNS设置实际上很好。

现在我怀疑的另一件事是我的apache设置。我怀疑我没有设置正确的代理设置。这是:

<VirtualHost *:80>
    WSGIDaemonProcess main python-path=/var/www/setak:/var/www/setak/setakenv/lib/python2.7/site-packages
    WSGIProcessGroup main
    WSGIScriptAlias / /var/www/setak/setakenv/main/ashop/ashop/ashop/wsgi.py
    ServerAdmin admin@setakshop.ir
    ServerName www.setakshop.ir
    ProxyPass / http://www.setakshop.ir:8001/
    ProxyPassReverse / http://www.setakshop.ir:8001/

    Alias /media/ /var/www/setak/setakenv/main/ashop/ashop/static/media/
    Alias /static/ /var/www/setak/setakenv/main/ashop/ashop/static/

    <Directory /var/www/setak/setakenv/main/ashop/ashop/static>
        Order allow,deny
        allow from all
    </Directory>

    <Directory /var/www/setak/setakenv/main/ashop/ashop/static/media>
        Order allow,deny
        allow from all
    </Directory>    

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>


<VirtualHost *:8080>
    WSGIDaemonProcess setak python-path=/var/www/setak:/var/www/setak/setakenv/lib/python2.7/site-packages
    WSGIProcessGroup setak
    WSGIScriptAlias / /var/www/setak/setakenv/setakmain/django-oscar/sites/sandbox/wsgi.py
    ServerAdmin admin@setakshop.ir
    ServerName shop.setakshop.ir

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://shop.setakshop.ir:8000
    ProxyPassReverse / http://shop.setakshop.ir:8000

    Alias /robots.txt /var/www/setak/setakenv/setakmain/django-oscar/sites/sandbox/static/robots.txt

    Alias /media/ /var/www/setak/setakenv/setakmain/django-oscar/sites/sandbox/public/media/
    Alias /static/ /var/www/setak/setakenv/setakmain/django-oscar/sites/sandbox/public/static/

    <Directory /var/www/setak/setakenv/setakmain/django-oscar/sites/sandbox/public/static>
        Order allow,deny
        allow from all
    </Directory>

    <Directory /var/www/setak/setakenv/setakmain/django-oscar/sites/sandbox/public/media>
        Order allow,deny
        allow from all
    </Directory>    

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

现在我不知道我在这里做错了什么! 我使用以下命令运行这两个项目:

./manage.py runserver 0.0.0.0:8000
./manage.py runserver 0.0.0.0:8001

有谁能告诉我我做错了什么?

提前感谢。

2 个答案:

答案 0 :(得分:4)

真的不是你通过Apache运行Django应用程序的方式。 runserver不适用于生产;将Apache用作runserver的反向代理是没有意义的。

令人困惑的是,您似乎已为其中一个网站正确设置了WSGIScriptAlias,但您仍在代理它。您需要完全删除代理内容,忘记runserver,并始终使用mod_wsgi。

让Apache在两个域上提供两个站点的方法是使用NamedVirtualHosts。您只需设置两个单独的,每个都具有正确的服务器名称。

答案 1 :(得分:0)

首先,你不应该使用./manage.py runserver和apache,当你将网站转移到生产环境时,你不应该使用./manage.py runserver。 runserver仅用于开发环境,它一次只能处理一个请求。

您应该使用mod_wsgi来使用Apache运行项目。查看文档here

否则gunicorn和nginx可用于运行项目。看看this