由于对Apache的不熟悉,部署Django项目时遇到了一些问题,经过搜索终于解决了。记录下来,以供参考。
本文的环境为Ubuntu 14.04,Python 3.4,Django 1.7。
文中Django项目名称为
MyProj,主机名为
domain.com,Web文件目录为
/var/www,Django项目根目录为
MyProj,所谓的项目根目录,是指执行
django-admin.py startproject命令创建的以项目名字命名的目录,即该目录下有manage.py文件。
MyProj目录位于
/var/www/domain.com目录下。
安装
以下命令完成Apache与mod_wsgi的安装。
1 2 |
sudo apt-get install apache2 sudo apt-get install libapache2-mod-wsgi-py3 |
创建虚拟主机与WSGI文件:
在Apache上部署Django项目的关键,是让Apache知道根据特定的请求寻找特定的wsgi文件,由wsgi文件告诉mod_wsgi如何处理这个请求。
创建Apache的虚拟主机文件 /etc/apache2/sites-available/domain.com.conf,内容如下:
1 2 3 4 |
<VirtualHost *:80> ServerName domain.com WSGIScriptAlias / /var/www/domain.com/MyProj.wsgi </VirtualHost> |
这个文件告诉了Apache应该将请求转发给mod_wsgi模块。下面将创建wsgi文件告诉mod_wsgi模块如何处理该请求。
wsgi文件位于 /var/www/domain/MyProj.wsgi,内容如下:
1 2 3 4 5 6 7 8 |
import os import sys sys.path.append('/var/www/domain/MyProj/') os.environ['DJANGO_SETTINGS_MODULE'] = 'MyProj.settings' # import django.core.handlers.wsgi # application = django.core.handlers.wsgi.WSGIHandler() from django.core.wsgi import get_wsgi_application application = get_wsgi_application() |
这里要注意被注释掉的两行代码,网上找到的配置的例子都是用的这两句,但是在该版本的Django上报错,替换为后面良好代码后问题解决(见参考链接)。
接下来,在Apache中启用该虚拟主机,并重新加载Apache。命令如下:
1 2 |
sudo a2ensite domain.com sudo /etc/init.d/apache2 reload |
配置Django的静态内容
在虚拟主机的配置文件中添加与Django静态文件目录相关的配置。
1 2 3 4 5 6 7 8 |
<VirtualHost *:80> ServerName domain.com WSGIScriptAlias / /var/www/domain.com/MyProj.wsgi Alias /static/ /var/www/domain.com/static/ <Location "/static"> Options -Indexes </Location> </VirtualHost> |
在Django项目的settings.py中设置相关变量:
1 2 |
MEDIA_ROOT = '/var/www/domain.com/static/' MEDIA_URL = '/static/' |
重新加载Apache服务器使修改生效:
1 |
sudo /etc/init.d/apache2 reload |
至此,在Apache上部署Django项目所需的最基本配置已经完成了。
参考链接
https://www.digitalocean.com/community/tutorials/using-mod_wsgi-to-serve-applications-on-ubuntu-12-04
https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/modwsgi/
http://stackoverflow.com/questions/26083761/django-rest-mod-wsgi-and-apache-integration-problems