首页 > 树莓派+DNSPOD动态域名解析,搭建web服务器

树莓派+DNSPOD动态域名解析,搭建web服务器

2013-03-19   hisenKing

买了树莓派在pi尝试的做了很多东西,上周末利用家里的网络和自己域名,加上DNSPOD的动态域名解析搭建了外网能够访问的服务器。
其中的硬件条件是:TP_LINK的路由器一只,型号TL-R402;树莓派一个;网络是杭州网通(华数);需要DNSPOD的账号,以及自己的域名。


搭建web服务器

首先安装需要安装web服务器的环境,我安装的是lnmp,基本的apt-get即可安装

sudo apt-get install nginx
sudo apt-get install php5
sudo apt-get install php5-mysql  

配置路由器

默认的情况下,因为开启了DHCP,所以局域网内ip地址会在每次开机的时候可能出现与上次ip不一致的情况。需要针对pi的mac地址分配固定的ip。查看pi的mac地址可以在路由设置里面的“DHCP服务器-客户端列表”中查看,名称为“raspber”的就是了。路由器DHCP默认的地址池是192.168.1.100-192.168.1.199,所以你配置的ip在这个范围内即可,如配置成“192.168.1.120”。然后需要修改路由器的默认远端web管理端口号,不能使用80端口(因为apache默认的端口为80,不然就过不来了) 。最后就是将上面的分配的IP地址主机设置成DMZ主机


添加DNSPOD记录

我是用了二级域名pi.laoniangke.com 最后就是设置DNSPOD进行动态域名解析 DNSPOD真的是免费加好用,解析的速度也非常的快。官网有api文档,详细的说明可自行去查看。

这里使用了动态域名解析的功能:
接口地址:
• https://dnsapi.cn/Record.Ddns
提交方法:
• POST
提交参数:
• 公共参数
• domainid 域名ID
• record
id 记录ID
• subdomain – 主机记录, 如 www
• record
line 记录线路,通过API记录线路获得,中文,比如:默认

获得domain_id可以用curl

curl -k https://dnsapi.cn/Domain.List -d "login_email=xxx&login_password=xxx"

获得record_id

curl -k https://dnsapi.cn/Record.List -d "login_email=xxx&login_password=xxx&domain_id=xxx"

官网有一个“动态域名解析脚本for Linux”的Python版本。 地址:https://gist.github.com/chuangbo/833369
解释都已经详细,但是从2013年6月份开始,dnspod的ip解析出现问题了,ip解析的有问题,估计只是华数ip获取有问题。后来通过淘宝的ip接口重写了这个脚本中getip的方法,代码件本文底部。

这里需要设置pi开机的时候自动运行这个脚本 ,在/etc/rc.local中加入一行

# run pypod.py ddns
/usr/bin/python /home/pi/pypod.py

在pi上运行这个脚本,或者重启pi,DNSPOD相当快,我这是即可输入pi.laoniangke.com就成功了 当然你也可以在windows的cmd下,查看dns解析的情况

nslookup pi.laoniangke.com

到此就结束了。


其中这边我在配置路由器的虚拟服务器进行端口ip映射的时候,windows xp下可以,但是pi死活不行不知道为什么,关了iptables也不行(这个问题哪位大侠知道的望指点一二)。华数的网络部分杭州电信的用户访问的速度相当的慢,台州电信倒是还不错,使用阿里测进行了http测试,最快的居然是宁波移动。最后pi的性能确实有限,加上mysql跑wordpress这个性能哎,慢得一塌糊涂。没办法打算就跑静态的了接下来




DNSPOD动态域名解析,ip获取有误修复

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import httplib, urllib
import socket
import time
import json

params = dict(
    login_email="hisen@xx.com", # replace with your email
    login_password="pwd", # replace with your password
    format="json",
    domain_id=xxxxxx, # replace with your domain_od, can get it by API Domain.List
    record_id=xxxxxx, # replace with your record_id, can get it by API Record.List
    sub_domain="pi", # 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():
    url='http://ip.taobao.com/service/getIpInfo.php?ip=myip'
    page=urllib.urlopen(url)
    data=page.read()
    jsondata=json.loads(data)
    ip = jsondata['data']['ip']
    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)

好久没更新了,需要除除草