树莓派搭建私人服务器

阿里云服务器又涨价了,感受已经负担不起了,可是又想拥有一台本身的私人服务器。某天,忽然发现了树莓派,价格便宜、高可用。心血来潮!!说搞就搞!!javascript

准备工做

  1. 首先固然是有一台树莓派3代B型,淘宝价格¥190 + 周边 = ¥216 能够搞定(两个半月的阿里云ECS,仍是蛮实惠的)
  2. 支持端口映射的路由器(基本如今市面上的路由器都支持端口映射),我用的是小米路由器
  3. 买一个属于本身的域名,如:www.uthinks.com
  4. 具备公网ip的宽带,我家使用的联通20M宽带,很幸运有一个公网的IP。若是没有公网IP,须要借助花生壳来作内网穿透,不只麻烦还有流量限制。

树莓派装机

系统安装

  1. 下载树莓派系统镜像(www.raspberrypi.org/downloads/)
    java

    image

  2. 接着就是把镜像烧入SD卡,windows下须要下载win32diskimager
    (download.csdn.net/detail/long…python

  3. 解压镜像和win32diskimager(绿色版打开便可使用),插入SD卡 --> 打开win32diskimager --> 添加镜像 --> 确认SD卡后点击烧写便可
    json

    image

  4. 烧写结束后,在windows下SD卡会显示只有不到100M,不用担忧,由于这个分区只是Linux 的boot分区,而其余内容做为Linux 的文件系统被挂载为ext4 文件系统,Windows 下识别不了而已windows

  5. 把烧好的SD卡直接插入树莓派SD卡槽中,接上电源等待系统安装完成服务器

系统配置

系统配置过程仍是碰到不少坑,你们有什么问题能够直接联系我,我会补充出来dom

  1. ssh没法登录的问题
    因为树莓派默认没有打开sshd,因此我用HDMI链接上显示器,执行命令sudo raspi-config
    找到ssh而后enable后重启就ok了
    image

    image

动态域名解析(DDNS)

家里办理的联通宽带有公网IP,决定好好利用,可是公网IP不固定,须要动态修改域名解析。ssh

注册域名

  1. 在阿里云上购买本身喜欢的域名(抓紧时间备案,否则网站会被封)
    (wanwang.aliyun.com/domain/com?…)网站

  2. 若是有公网IP配置一条A记录,若是你使用的是花生壳配置一条CNAME记录
    阿里云

    image

如何实现动态域名解析

下面给出的是python主要的核心代码,若是须要完整的环境代码请留言联系我。树莓派系统镜像中自带Python,仍是很方便的

  1. 获取本身的公网出口IP

    import urllib2
    
     def getIp():
         try:
             ip = visit("http://www.ip138.com/ip2city.asp")
         except:
             ip = "failed to get internet ip"
         return ip
    
     def visit(url):
         req = urllib2.Request(url)
         opener = urllib2.urlopen(req)
         result = opener.read()
         return result[result.find('[') + 1: result.find(']')]复制代码
  2. 下载alidns python SDK
    (develop.aliyun.com/sdk/java?sp…)

  3. 解压安装
    sudo python setup.py install

  4. 安装alidns python SDK
    pip install aliyun-python-sdk-alidns

  5. 第1步获取到本身的公网IP后,调用API设置DNS解析

    import json
    
     from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest,DescribeDomainRecordsRequest, \
         DescribeDomainRecordInfoRequest, AddDomainRecordRequest
     from aliyunsdkcore import client
    
     # 更新域名解析
     def updateDns(accessKey, accessKeySecret, hostRecord, dnsType, dnsValue, dnsRecordid, dnsTtl, returnFormat):
         print hostRecord, dnsType, dnsValue, dnsRecordid, dnsTtl, returnFormat
         clt = client.AcsClient(accessKey, accessKeySecret, 'cn-hangzhou')
         request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
         request.set_RR(hostRecord)
         request.set_Type(dnsType)
         request.set_Value(dnsValue)
         request.set_RecordId(dnsRecordid)
         request.set_TTL(dnsTtl)
         request.set_accept_format(returnFormat)
         result = clt.do_action(request)
         return result
    
     # 获取当前的解析IP
     def getDnsIp(accessKey, accessKeySecret, dnsRecordid, returnFormat):
         clt = client.AcsClient(accessKey, accessKeySecret, 'cn-hangzhou')
         request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()
         request.set_accept_format(returnFormat)
         request.set_RecordId(dnsRecordid)
         result = clt.do_action(request)
         result = json.JSONDecoder().decode(result)
         result = result['Value']
         return result复制代码
  6. 路由器端口映射,配置完成记得点击保存而且生效

    image

附:

  1. accessKey、accessKeySecret如何获取
    登陆阿里云控制台(ak-console.aliyun.com/#/accesskey)

  2. 域名解析RecoreId如何获取

    # dns_domain 域名 如uthinks.com
     def check_records(dnsDomain):
         clt = client.AcsClient(accessKeyId, accessKeySecret, 'cn-hangzhou')
         request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
         request.set_DomainName(dnsDomain)
         request.set_accept_format('json')
         result = clt.do_action(request)
         print result
         return result
    
     返回值:
     {
         "PageNumber": 1,
         "TotalCount": 2,
         "PageSize": 20,
         "RequestId": "***",
         "DomainRecords": {
             "Record": [
                 {
                     "RR": "*",
                     "Status": "ENABLE",
                         "Value": "****",
                     "RecordId": "****",
                     "Type": "A",
                     "DomainName": "uthinks.com",
                     "Locked": false,
                     "Line": "default",
                     "TTL": "600"
                 },
            ]
         }
     }复制代码

若是个人文章对你有帮助,或者有什么疑问。欢迎在下方留言,一块儿交流讨论

注:

相关文章
相关标签/搜索