樹莓派服務器搭建


阿里雲服務器又漲價了,感覺已經負擔不起了,但是又想擁有一台自己的私人服務器。某天,突然發現了樹莓派,價格便宜、高可用。心血來潮!!說搞就搞!!

原文地址:http://www.uthinks.com/wordpress/2017/12/30/raspberrypi-init/
相關文章:
1.《基於Hexo + Git + Nginx的博客發布》http://www.uthinks.com/wordpress/2017/12/31/基於hexo-git-nginx的博客發布/

准備工作

  1. 首先當然是有一台樹莓派3代B型,淘寶價格¥190 + 周邊 = ¥216 可以搞定(兩個半月的阿里雲ECS,還是蠻實惠的)
  2. 支持端口映射的路由器(基本現在市面上的路由器都支持端口映射),我用的是小米路由器
  3. 買一個屬於自己的域名,如:www.uthinks.com
  4. 具有公網ip的寬帶,我家使用的聯通20M寬帶,很幸運有一個公網的IP。如果沒有公網IP,需要借助花生殼來做內網穿透,不僅麻煩還有流量限制。

樹莓派裝機

系統安裝

  1. 下載樹莓派系統鏡像(https://www.raspberrypi.org/downloads/)
    image

  2. 接着就是把鏡像燒入SD卡,windows下需要下載win32diskimager
    (http://download.csdn.net/detail/longerzone/7574047)。

  3. 解壓鏡像和win32diskimager(綠色版打開即可使用),插入SD卡 --> 打開win32diskimager --> 添加鏡像 --> 確認SD卡后點擊燒寫即可
    image

  4. 燒寫結束后,在windows下SD卡會顯示只有不到100M,不用擔心,因為這個分區只是Linux 的boot分區,而其他內容作為Linux 的文件系統被掛載為ext4 文件系統,Windows 下識別不了而已

  5. 把燒好的SD卡直接插入樹莓派SD卡槽中,接上電源等待系統安裝完成

系統配置

系統配置過程還是碰到很多坑,大家有什么問題可以直接聯系我,我會補充出來

  1. ssh無法登陸的問題
    由於樹莓派默認沒有打開sshd,所以我用HDMI連接上顯示器,執行命令sudo raspi-config
    找到ssh然后enable后重啟就ok了
    image
    image

動態域名解析(DDNS)

家里辦理的聯通寬帶有公網IP,決定好好利用,但是公網IP不固定,需要動態修改域名解析。

注冊域名

  1. 在阿里雲上購買自己喜歡的域名(抓緊時間備案,不然網站會被封)
    (https://wanwang.aliyun.com/domain/com?spm=5176.8142029.388261.128.anTrkC)

  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
    (https://develop.aliyun.com/sdk/java?spm=5176.doc29772.416540.246.rjauTQ)

  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

  7. 最后一步把動態解析腳本配置到crontab中定時執行

    */1 * * * * /usr/bin/python /home/bill/basic/BasicTask.py

附:

  1. accessKey、accessKeySecret如何獲取
    登錄阿里雲控制台(https://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"
         		},
            ]
     	}
     }
    

如果我的文章對你有幫助,或者有什么疑問。歡迎在下方留言,一起交流討論

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM