ubuntu

Linux 部署服务器手札 (II)

这次记录一下 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)

这段代码上面有四处配置需要改成自己的:

  1. login_email
  2. login_password
  3. domain_id
  4. 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 站的内容了。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/04/linux-deploy-2.html【Linux 部署服务器手札 (II)】

《Linux 部署服务器手札 (II)》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注