在Apache下与Django一起提供/var/www中的HTML文件

0 投票
2 回答
3134 浏览
提问于 2025-04-17 08:53

我按照这个链接的步骤成功让我的Apache Mod_WSGI和Django一起工作了,链接是http://blog.stannard.net.au/2010/12/11/installing-django-with-apache-and-mod_wsgi-on-ubuntu-10-04/,不过我稍微改了一下我的000-default网站的内容。

<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /home/nipun/webdev/demo/demo

    <Directory /home/nipun/webdev/demo/demo>
    Order allow,deny
    Allow from all


    WSGIDaemonProcess demo.djangoserver processes=2 threads=15 display-name=%{GROUP}
    WSGIProcessGroup demo.djangoserver

    WSGIScriptAlias / /home/nipun/webdev/demo/demo/apache/django.wsgi
    </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>


通过这个配置,我基本上可以像这样提供我的Django网站,比如说http://localhost/meta,这里的meta会调用相应的视图。

但是现在,当我尝试加载位于/var/www的index.html(里面有一些JavaScript和HTML代码)时,它会试图用我在Django项目的urls.py中指定的URL来匹配这个文件,而我已经把它配置在Apache里了。

我该如何修改设置,以便能够在/var/www下提供脚本,同时也能在localhost上提供Django网站呢?

在尝试了第一个答案中的方法后,我添加了这一行:

Alias / /var/www

在包含以下内容的行上方:

WSGIDaemon...

现在Django网站和我在/var/www中的文件都无法工作了。

解决了,我把000-default文件改成了类似这样的内容:

<VirtualHost *:80>  
ServerAdmin webmaster@localhost
DocumentRoot /var/www
Alias /robots.txt /var/www/robots.txt
Alias /testing.php /var/www/testing.php
Alias /index.html  /var/www/index.html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
DocumentRoot /home/nipun/webdev/demo/demo
WSGIDaemonProcess demo.djangoserver processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup demo.djangoserver
WSGIScriptAlias / /home/nipun/webdev/demo/demo/apache/django.wsgi
<Directory /home/nipun/webdev/demo/demo>
   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




</VirtualHost>


为了让它更智能,可以进行别名匹配,比如:

AliasMatch /([^/]+).html /home/nipun/webdev/application_layer/$1.html

2 个回答

1

请查看以下文档的相关部分:

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

按照该部分最后的说明,使用AddHandler/mod_rewrite/WSGI脚本的修复方法。

使用这个方法后,如果静态文件存在,就会直接提供这个文件;如果没有静态文件,Django实例就会作为备用资源来处理其他所有的URL请求。

1

首先,我不明白你为什么一直提到要“运行”你的HTML文件。其实它并不是一个脚本,即使里面有JavaScript,那也只是给用户浏览器用的。没有什么需要运行的,Apache只需要提供这个文件就可以了。

其次,你显然需要一种方法来区分哪些请求是发给Django的,哪些是直接提供的。最简单的方法就是把它们放在不同的子目录里——要么把WSGIScriptAlias的路径从\改成my_django_site,要么用普通的Alias来设置你静态文件的位置。如果你选择后者,你需要把这个指令放在WSGI部分的上面,这样它才能优先匹配。

撰写回答