在Apache下与Django一起提供/var/www中的HTML文件
我按照这个链接的步骤成功让我的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 个回答
请查看以下文档的相关部分:
http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#The_Apache_Alias_Directive
按照该部分最后的说明,使用AddHandler/mod_rewrite/WSGI脚本的修复方法。
使用这个方法后,如果静态文件存在,就会直接提供这个文件;如果没有静态文件,Django实例就会作为备用资源来处理其他所有的URL请求。
首先,我不明白你为什么一直提到要“运行”你的HTML文件。其实它并不是一个脚本,即使里面有JavaScript,那也只是给用户浏览器用的。没有什么需要运行的,Apache只需要提供这个文件就可以了。
其次,你显然需要一种方法来区分哪些请求是发给Django的,哪些是直接提供的。最简单的方法就是把它们放在不同的子目录里——要么把WSGIScriptAlias
的路径从\
改成my_django_site
,要么用普通的Alias
来设置你静态文件的位置。如果你选择后者,你需要把这个指令放在WSGI部分的上面,这样它才能优先匹配。