簡介
HTTPS (Hyper Text Transfer Protocol over SecureSocket Layer)叫超文字傳輸安全協議,是一種透過計算機網路進行安全通訊的傳輸協議。HTTPS 經由 HTTP 進行通訊,但利用 SSL/TLS 來加密資料包。HTTPS 開發的主要目的,是提供對網站伺服器的身份認證,保護交換資料的隱私與完整性。這個協議由網景公司(Netscape)在 1994 年首次提出,隨後擴充套件到網際網路上,目前基本上所有的網站都使用了 HTTPS 協議。下面就圍繞域名,備案,雲伺服器,服務搭建這 4 個方面來從零搭建 HTTPS 服務。
域名域名[1](Domain Name)又叫網域,是由一串用點分隔的名字組成的 Internet 上某一臺計算機或計算機組的名稱,用於在資料傳輸時標識計算機的電子方位。例如, blog.haojunyu.com 是一個域名,可以透過域名名稱系統(Domain Name System)將該域名對映成對應的 IP 地址。該操作可以透過域名解析來實現。
域名註冊和解析域名註冊前,可以透過WHOIS[2] 來查詢該域名是否被註冊過。目前 BAT 都提供域名註冊,如阿里的萬網[3],百度的域名服務[4],騰訊的Dnspod[5]。我的域名 haojunyu.com 是在阿里的萬網註冊的,之前註冊域名的初衷是為了給 github 上面的個人部落格作個性化的域名。並在其中的域名解析中作了設定,這裡並不需要做太多的改動,只需要新增如下圖的解析記錄:
設定完成後,當我們向 https://api.haojunyu.com/* 傳送請求時,DNS 會自動將其解析為對映的 IP 地址(上圖中塗鴉的部分),並向目標伺服器請求對應服務。
備案這裡的備案是針對像個人部落格這類非經營性網站所做的備案,其目的是為了方便網站的管理。因為只有守法的網站才會對促進資訊共享、文化繁榮和社會進步產生積極的作用。
目前網站域名的備案 BAT 都能提供,不過備案這個流程很長,大概要一個月,我的域名 haojunyu.com 是在百度雲備案的,當時是先提交的資料(主要是身份證正反面照片),然後等百度快遞來背景牆,再拍照片上傳核實後才可以備案成功。
雲伺服器伺服器就是一臺可以執行的電腦,可以是自己家裡的電腦,也可以到 BAT 上買雲服務。這裡因為騰訊雲上面有免費8天的試用,所以就試著在雲服務上面搭建個 https 的服務,以方便微信小程式能成功發起 request 請求。如果試用體驗還不錯的話,可以續費(74元/月)。新建雲主機時要選一個作業系統,鑑於對 Ubutnu 的熟悉以及伺服器的需要,所以選擇了 Ubuntu Server 16.04.1 LTS 64 的映象做系統。當新建一個雲主機後,百度雲會提供一個對外的 IP 地址,這個 IP 地址就是域名解析中要填入的記錄值。
服務搭建伺服器的配置主要有三步個,第一步是應用程式的佈置,第二步是Nginx伺服器的配置,第三步是 http 升級為 https 。前兩步的配置是參考這篇博文在Ubuntu上使用Nginx部署Flask應用[6],第三步是參考騰訊雲上Nginx證書安裝[7]。
應用程式考慮到微信小程式主要是用 json 的資料,所以就想伺服器能夠提供 restful 服務,又因為對 python 語言比較喜歡,所以就挑了 python 裡的 Flask 這個輕量級的 Web 框架。伺服器選擇的是 Nginx ,而連線伺服器和應用程式的是 uWSGI。具體的安裝步驟如下:
1.環境配置
sudo apt-get update && sudo apt-get upgrade # 更新所有軟體sudo apt-get install build-essential # 安裝編譯環境sudo apt-get install python python-dev python-setuptools # 安裝python環境sudo easy_install pipsudo apt-get install nginx # 安裝Nginxsudo apt-get install uwsgi uwsgi-plugin-python # 安裝uwsgi及其外掛sudo apt-get install supervisor # 安裝程序管理軟體
2.應用配置
sudo mkdir -p /var/www/flaskApp # 建立應用程式資料夾sudo chown -R ubuntu:ubuntu /var/www/flaskApp # 更改應用程式資料夾所有權sudo pip install virtualenv # 安裝python虛擬環境# 建立python虛擬環境cd /var/www/flaskAppvirtualenv venv. venv/bin/activate # 啟用python虛擬環境venvpip install flask flask-restful # 在虛擬環境中安裝flask Web框架
3.建立api.py程式碼
#!flask/bin/pythonfrom flask import Flask, jsonifyapp = Flask(__name__)tasks = [ { 'id': 1, 'title': u'Buy groceries', 'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 'done': False }, { 'id': 2, 'title': u'Learn Python', 'description': u'Need to find a good Python tutorial on the web', 'done': False }]@app.route('/todo/api/v1.0/tasks', methods=['GET'])def get_tasks(): return jsonify({'tasks': tasks})if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
執行指令碼python api.py後可以透過瀏覽器來訪問 http://主機IP:8080/todo/api/v1.0/tasks,以此來獲取 tasks 資料。
sudo rm /etc/nginx/sites-enabled/default
2.建立新的配置檔案/var/www/flaskApp/config/flaskApp_nginx.conf
server { listen 80; server_name api.haojunyu.com; #此時域名已經對映到主機IP charset utf-8; client_max_body_size 75M; location / { try_files $uri @yourapplication; } location @yourapplication { include uwsgi_params; uwsgi_pass unix:/var/www/flaskApp/config/flaskApp_uwsgi.sock; }}
3.建立配置檔案服務,重啟服務
sudo ln -s /var/www/flaskApp/config/nginx.conf /etc/nginx/conf.d/ #將應用資料夾裡的配置檔案連結到nginx配置檔案處sudo nginx -t # 檢驗nginx配置是否有誤sudo nginx -s reload # 重新載入nginx配置sudo /etc/init.d/nginx restart # 重啟nginx
4.驗證
現在透過瀏覽器來訪問 http://api.haojunyu.com/todo/api/v1.0/tasks ,無法獲取到資料,因為 flaskApp_uwsgi.sock 尚未生成,無法讓 uwsgi 在 Nginx 和 python 應用程式之間構建一座橋。
uWSGI配置1.建立新的配置檔案/var/www/flaskApp/config/flaskApp_uwsgi.ini
[uwsgi]#application's base folderbase = /var/www/flaskApp#python module to importapp = apimodule = %(app)home = %(base)/venvpythonpath = %(base)## 使用virtualenvwrapper管理virtualenv後用下面的兩個引數取代home和pythonpath#chdir = %(base)#virtualenvs = %HOME/.virtualenvs/flaskEnv#socket file's locationsocket = /var/www/flaskApp/%n.sock#permissions for the socket filechmod-socket = 666#the variable that holds a flask application inside the module imported at line #6callable = app#location of log fileslogto = /var/log/uwsgi/%n.log
2.建立uWSGI日誌資料夾,並更改檔案所有權
sudo mkdir -p /var/log/uwsgi # uWSGI日誌資料夾sudo chown -R ubuntu:ubuntu /var/log/uwsgi # 更改uWSGI日誌資料夾所有權uwsgi --ini /var/www/flaskApp/config/flaskApp_uwsgi.ini --plugin python & # 後臺啟動uwsgi
supervisor配置
supervisor 是為了方便管理程序而存在的,因為每次開機後,都得重新執行 uwsgi --ini /var/www/flaskApp/config/flaskApp_uwsgi.ini 命令來啟動 uwsgi ,這個很費神,因為你不可能永遠記得清楚這麼個應用,這麼個配置。所以使用 supervisor 來管理,而我們只需要在開發這個應用時建立一個 flaskApp_supervisor.conf 配置檔案,而重啟機器後啟動 supervisor 服務,即執行 sudo service supervisor start。
1.安裝 supervisor
sudo apt install supervisor
2.建立配置檔案:
[program:flaskApp]# 啟動命令入口command=/usr/local/bin/uwsgi --ini /var/www/flaskApp/flaskApp_uwsgi.ini# 執行命令的使用者名稱user=ubuntuautostart=trueautorestat=true#日誌地址stdout_logfile=/var/log/supervisor/flaskApp_supervisor.log
3.建立配置檔案副本並重啟服務
sudo ln -s /var/www/flaskApp/flaskApp_supervisor.conf /etc/supervisor/conf.d/sudo service supervisor restart
HTTP 升級 HTTPS
升級 HTTP 需要證書的支援,這裡 BAT 都提供這樣的服務,都有相對應的配置安裝說明。我這裡是按照 騰訊雲上Nginx證書安裝[8],主要就是將申請的證書儲存到 config 目錄中,並將 flaskApp_nginx.conf 修改如下:
server { listen 80; server_name api.haojunyu.com; return 301 https://api.haojunyu.com$request_uri;}server { listen 443 ssl; server_name api.haojunyu.com; #此時域名已經對映到主機IP ssl on; ssl_certificate /var/www/flaskApp/1_haojunyu.com_bundle.crt; ssl_certificate_key /var/www/flaskApp/2_haojunyu.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個協議配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個套件配置 ssl_prefer_server_ciphers on; location / { try_files $uri @yourapplication; } location @yourapplication { include uwsgi_params; uwsgi_pass unix:/var/www/flaskApp/config/flaskApp_uwsgi.sock; }}
當時 SSL 的證書有免費的可以用,限制就是一個證書只能幫忙一個二級域名或子域名。如果願意折騰,可以使用 certbot[9] 來自動化來配置 SSL 證書和定時更新。
詳細的安裝配置步驟可以參考官網(需要選擇代理軟體 nginx/apache 等和作業系統 Ubuntu/CentOS/MacOS 等)。
# 安裝命令sudo apt install certbot python-certbot-nginx # cerbot及其外掛# 配置域名 sudo certbot certonly --nginx --cert-name haojunyu.com -d api.haojunyu.com# 刪除配置的域名sudo certbot delete --cert-name haojunyu.com# 檢視配置的域名sudo certbot certificates# 更新證書sudo certbot renew --dry-run
最終效果如下圖所示, 訪問 https://api.haojunyu.com/todo/api/v1.0/tasks 可以獲得對應的資料。
參考文獻1.wiki-域名[10]
2.whois域名查詢[11]
3.萬網[12]
4.百度域名服務[13]
5.Dnspod[14]
6.在Ubuntu上使用Nginx部署Flask應用[15]
7.騰訊雲上Nginx證書安裝[16]
8.certbot[17]
References[1] 域名: https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%90%8D[2] WHOIS: https://who.is/[3] 萬網: https://wanwang.aliyun.com/?spm=5176.8142029.388261.26.C75xLA[4] 域名服務: https://cloud.baidu.com/product/bcd.html[5] Dnspod: https://dnspod.qcloud.com/?from=console[6] 在Ubuntu上使用Nginx部署Flask應用: https://www.oschina.net/translate/serving-flask-with-nginx-on-ubuntu[7] 騰訊雲上Nginx證書安裝: https://www.qcloud.com/document/product/400/4143#2.-nginx-.E8.AF.81.E4.B9.A6.E9.83.A8.E7.BD.B2[8] 騰訊雲上Nginx證書安裝: https://www.qcloud.com/document/product/400/4143#2.-nginx-.E8.AF.81.E4.B9.A6.E9.83.A8.E7.BD.B2[9] certbot: https://certbot.eff.org/[10] wiki-域名: https://zh.wikipedia.org/wiki/%E5%9F%9F%E5%90%8D[11] whois域名查詢: https://who.is/[12] 萬網: https://wanwang.aliyun.com/?spm=5176.8142029.388261.26.C75xLA[13] 百度域名服務: https://cloud.baidu.com/product/bcd.html[14] Dnspod: https://dnspod.qcloud.com/?from=console[15] 在Ubuntu上使用Nginx部署Flask應用: https://www.oschina.net/translate/serving-flask-with-nginx-on-ubuntu[16] 騰訊雲上Nginx證書安裝: https://www.qcloud.com/document/product/400/4143#2.-nginx-.E8.AF.81.E4.B9.A6.E9.83.A8.E7.BD.B2[17] certbot: https://certbot.eff.org/