樹莓派搭建私人服務器

阿里雲服務器又漲價了,感受已經負擔不起了,可是又想擁有一臺本身的私人服務器。某天,忽然發現了樹莓派,價格便宜、高可用。心血來潮!!說搞就搞!!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"
                 },
            ]
         }
     }複製代碼

若是個人文章對你有幫助,或者有什麼疑問。歡迎在下方留言,一塊兒交流討論

注:

相關文章
相關標籤/搜索