这次记录一下 Ubuntu 下面部署 django 的过程:
这个过程真的异常艰巨,由于各种组件都有版本兼容问题,然后官方文档又未能明确指示,因此 百度+Google+StackOverflow 找了无数篇文章汇总之后才得到结果,足足用了超过 8 个小时。
这里用的版本是:UbuntuKylin13.10 + python3.3.2 + django1.6.2 + Apache2.4.1
1. 基础环境安装
# 升级
sudo apt-get install update
###### python 及 django ######
# 安装 python3
sudo apt-get install python3
# 安装 pip
sudo apt-get install python3-pip
# 安装 django
sudo pip3 install django
# 验证 django
python3
>>> import django
>>> print(django.VERSION)
到这里,应该就可以正常使用 django 了,可以测试 django project 的调试环境运行:
2. 创建 django 项目
###### 创建 django 项目 ######
# 查找 django-admin.py 的位置
sudo find / -name django-admin.py
# 找到 /usr/local/bin/django-admin.py
# 在项目准备创建的文件夹下面运行(我的是 /var/django)
sudo python3 /usr/local/bin/django-admin.py startproject mysite
# 测试运行
cd mysite
python3 manage.py runserver
这样在本机可以访问 localhost:8000 看到已经运行,但在别的机器不行。
当然,如果要把现有的 django 项目挂在这里,就需要把 django 项目的文件夹拷贝到这里了。
3. 安装服务组件
###### apache ######
# 安装 apache
sudo apt-get install apache2
# 启动 apache
sudo service apache2 start
# 安装 mod_wsgi
sudo apt-get install libapache2-mod-wsgi-py3
# 验证 mod_wsgi 安装
sudo find / -name mod_wsgi.so
另外还应当安装的有 mysql-server 和 phpMyAdmin,这些参照本系列前一篇即可。
4. 应用配置
———– 配置 apache 设置 ———–
在 </VirtualHost>
前面加入:
WSGIScriptAlias / /var/django/mysite/mysite/wsgi.py
# WSGIPythonPath /var/django/mysite
<Directory /var/django/mysite/mysite>
Order deny,allow
Require all granted
</Directory>
根据官方文档配置这些内容,我的 project 目录在 /var/django/mysite/ 下面,但是如果用 WSGIPythonPath 这句会报错:
WSGIPythonPath cannot occur within <virtualhost> section</virtualhost>
这个情况的话需要打开 mysite 项目文件夹里面的 wsgi.py 编辑一下内容:
sys.path.append('/var/django/mysite')
sys.path.append('/var/django/mysite/mysite')
这样手动将路径加到系统路径中就可以运行成功了。
5. 使用虚拟主机
使用虚拟主机的话,在 /etc/apache2/sites-available
里面创建一个 xxx.conf
然后将上面的配置文件内容移到里面,按照我的例子,就是:
listen 8002
<VirtualHost *:8002>
ServerName test.mysite.cn
ServerAdmin webmaster@localhost
DocumentRoot /var/www
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
WSGIScriptAlias / /var/django/ecerp/ecerp/wsgi.py
<Directory /var/django/ecerp/ecerp>
Order deny,allow
Require all granted
</Directory>
</VirtualHost>
注意如果要修改端口的话就需要在前面加上 listen 语句,或者在 /etc/apache2/ports.conf
里面添加(那当然在这里改最好了)。另外绑定的域名就要在 ServerName 里面指定。
然后的话要启用这个虚拟站点,就需要把这个 .conf 文件创建链接到 /etc/apache2/sites-enabled
,使用
a2ensite mysite
可以完成这一步工作,反过来要停用这个虚拟站点,这样就可以了:
a2dissite mysite
然后重启 apache2,就可以访问得到了:
service apache2 restart
6. 配置静态文件的访问
在 django 里面这一块比较独立,参考官方文档。
其实目标是要把 /static/
下面的目录全部直接映射都某个文件夹,只需要在 apache 相应的站点配置文件中 WSGIScriptAlias 之前加入这一段,让 static 请求路径定位到后台的 static 文件夹即可。
Alias /static/ /var/django/ecerp/erp/static/
<Directory /var/django/ecerp/erp/static>
Order deny,allow
Require all granted
</Directory>
7. 使用 dnspod 的 API 做 ddns 动态域名
这个当然不是必须的,但是我做的时候需要把内网机挂到外网上,就要做这一个,花生壳这种傻瓜式的 ddns 已经不适合我了,就用自己的 dnspod 进行绑定,记录一下:
首先得有 dnspod 账号(邮箱)和密码,然后里面得有域名,并且为现在需要的域名设置一个子域名。这次用 erp.easecloud.cn 进行测试。
然后访问 dnspod 的 API 页面去找脚本:(https://support.dnspod.cn/Support/api)[https://support.dnspod.cn/Support/api]
这里有一个脚本,改一下配置直接跑就可以动态绑定 dns:https://gist.github.com/chuangbo/833369
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import httplib, urllib
import socket
import time
params = dict(
login_email="email", # replace with your email
login_password="password", # replace with your password
format="json",
domain_id=100, # replace with your domain_od, can get it by API Domain.List
record_id=100, # replace with your record_id, can get it by API Record.List
sub_domain="www", # replace with your sub_domain
record_line="默认",
)
current_ip = None
def ddns(ip):
params.update(dict(value=ip))
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
conn = httplib.HTTPSConnection("dnsapi.cn")
conn.request("POST", "/Record.Ddns", urllib.urlencode(params), headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()
return response.status == 200
def getip():
sock = socket.create_connection(('ns1.dnspod.net', 6666))
ip = sock.recv(16)
sock.close()
return ip
if __name__ == '__main__':
while True:
try:
ip = getip()
print ip
if current_ip != ip:
if ddns(ip):
current_ip = ip
except Exception, e:
print e
pass
time.sleep(30)
这段代码上面有四处配置需要改成自己的:
- login_email
- login_password
- domain_id
- record_id
其中前两个就是 dnspod 的账号密码,后面两个分别是需要绑定的域名 id 和记录 id(这个记录是在这个域名下面创建好的一条 A 记录)。
然后就要查询 domain_id 和 record_id 了,可以用一下的 curl 直接获取 json 然后在里面找:
curl -X POST https://dnsapi.cn/Domain.List -d 'login_email=<登录邮箱>&login_password=<登录密码>&format=json'
curl -X POST https://dnsapi.cn/Record.List -d 'login_email=<登录邮箱>&login_password=<登录密码>&format=json&domain_id=<第一条查到的 domain_id>'
大功告成:最后,我们按照手札第一篇里面配置好 ftp 和 phpmyadmin 就可以方便地管理好这个 django 站的内容了。
【转载请附】愿以此功德,回向 >>
原文链接:http://www.huangwenchao.com.cn/2014/04/linux-deploy-2.html【Linux 部署服务器手札 (II)】
非常感谢!