Flask 教程 第十七章:Linux上的部署

百度云搜索,搜各種資料:http://bdy.lqkweb.com

搜網(wǎng)盤,搜各種資料:http://www.swpan.cn

本文翻譯自The Flask Mega-Tutorial Part XVII: Deployment on Linux

這是Flask Mega-Tutorial系列的第十七部分,我將把Microblog部署到Linux服務(wù)器。

在本章中,我將談到Microblog應(yīng)用生命周期中的一個里程碑,因?yàn)槲覍⒂懻撊绾螌?yīng)用部署到生產(chǎn)服務(wù)器上,以便真實(shí)用戶可以訪問它。

部署的主題非常廣泛,因此不可能在這里涵蓋所有范疇。 本章致力于探討傳統(tǒng)托管方式,包括Ubuntu發(fā)行版的Linux服務(wù)器和流行的樹莓派微機(jī)。 我將在后面的章節(jié)中介紹其他選項(xiàng),例如云和容器部署。

本章的GitHub鏈接為:Browse, Zip, Diff.

傳統(tǒng)托管

當(dāng)提到“傳統(tǒng)托管”時,意思是應(yīng)用是手動或通過原始服務(wù)器機(jī)器上的腳本安裝部署的。 該過程涉及安裝應(yīng)用程序、其依賴項(xiàng)和生產(chǎn)規(guī)模的Web服務(wù)器,并配置系統(tǒng)以確保其安全。

當(dāng)你要部署自己的項(xiàng)目時,要問的第一個問題是在哪找服務(wù)器。 目前有很多經(jīng)濟(jì)的托管服務(wù)。 只需每月5美元,Digital Ocean,LinodeAmazon Lightsail就可以租借一臺虛擬化Linux服務(wù)器(Linode和Digital Ocean為其入門級服務(wù)器提供1GB RAM,而亞馬遜僅提供512MB)給你運(yùn)行部署實(shí)驗(yàn)。 如果你一分錢都不愿意花,那么VagrantVirtualBox組合而成的工具,可以讓你在自己的計(jì)算機(jī)上創(chuàng)建一個與付費(fèi)服務(wù)器類似的虛擬服務(wù)器。

就技術(shù)角度而言,該應(yīng)用可以部署在任何主流操作系統(tǒng)上,包括各種開放源代碼的Linux和BSD發(fā)行版以及商用的OS X(OS X是一個開源和商業(yè)的混種,因?yàn)樗陂_源BSD衍生產(chǎn)品Darwin)和Microsoft Windows。

由于OS X和Windows是的桌面操作系統(tǒng),不是作為服務(wù)器的最佳選擇,因此不是首選。 Linux或BSD操作系統(tǒng)之間的選擇很大程度上取決于愛好,所以我將選擇其中更受歡迎的Linux。 而Linux發(fā)行版中,我將再次選擇受歡迎的Ubuntu。

創(chuàng)建Ubuntu服務(wù)器

如果你有興趣與我一起部署,那么就需要一臺服務(wù)器才能開始工作。 為你推薦兩種選擇,一種是付費(fèi)的,另一種是免費(fèi)的。 如果你愿意花一點(diǎn)錢,可以在Digital Ocean,Linode或Amazon Lightsail上注冊一個賬戶,并創(chuàng)建一個Ubuntu 16.04鏡像的虛擬服務(wù)器。 你應(yīng)該使用最低配置的服務(wù)器,在我寫這篇文章的時候,三家的最低配置都是每月5美元。 開銷是按照服務(wù)器啟動的小時數(shù)進(jìn)行比例計(jì)算的,因此,如果你創(chuàng)建服務(wù)器后,使用幾個小時然后刪除它,那么有可能你只需支付美分級別的費(fèi)用。

免費(fèi)的方案基于你的計(jì)算機(jī)上可以運(yùn)行虛擬機(jī)。 要使用此選項(xiàng),請?jiān)谀愕臋C(jī)器上安裝VagrantVirtualBox,然后創(chuàng)建一個名為Vagrantfile的文件并用以下內(nèi)容來描述虛擬機(jī)的規(guī)格:

Vagrantfile:Vagrant配置。

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
end

該文件配置了一個帶有1GB RAM的Ubuntu 16.04服務(wù)器,你可以用其IP地址192.168.33.10來訪問該服務(wù)器。 要創(chuàng)建服務(wù)器,請運(yùn)行以下命令:

$ vagrant up

請參閱Vagrant 命令行文檔了解其他管理虛擬服務(wù)器的選項(xiàng)。

使用SSH客戶端

你的服務(wù)器處于后端,所以不需要像個人計(jì)算機(jī)上那樣擁有桌面。 你可以通過SSH客戶端連接到服務(wù)器,并運(yùn)行命令行進(jìn)行交互。 如果你使用的是Linux或Mac OS X,則可能已經(jīng)安裝了OpenSSH。 如果你使用Microsoft Windows,CygwinGitWindows Subsystem for Linux提供OpenSSH,因此你可以安裝這些選項(xiàng)中的任何一個。

如果你正在使用來自第三方提供商的虛擬服務(wù)器,則在創(chuàng)建服務(wù)器時,會為其分配IP地址。 你可以使用以下命令打開終端會話來連接到該服務(wù)器:

$ ssh root@<server-ip-address>

系統(tǒng)會提示你輸入密碼。密碼已在創(chuàng)建服務(wù)器后自動生成并顯示給你,或者你自己指定了密碼。

如果你使用的是Vagrant VM,則可以使用以下命令打開終端會話:

$ vagrant ssh

如果你使用的是Windows并且擁有Vagrant虛擬機(jī),請注意你需要從可以調(diào)用ssh命令的shell運(yùn)行上述命令。

免密登錄

如果你使用的是Vagrant虛擬機(jī),那么可以跳過本節(jié),因?yàn)槟愕奶摂M機(jī)已正確配置為使用名為ubuntu的非root帳戶,Vagrant不用輸入密碼就可以自動登錄。

要是你使用的是虛擬服務(wù)器,則建議創(chuàng)建一個常規(guī)用戶來完成你的部署工作,并配置此帳戶以便在不使用密碼的情況下登錄,這么做最初看起來似乎是一個糟糕的主意, 之后你會發(fā)現(xiàn)它不僅更方便,而且更安全。

我將創(chuàng)建一個名為ubuntu的用戶帳戶(如果你愿意,可以使用其他名稱)。 要創(chuàng)建這個用戶,請使用前一節(jié)中的ssh指令登錄到你的服務(wù)器的root帳戶,然后鍵入以下命令來創(chuàng)建用戶,給它sudo權(quán)限并最終切換到它:

$ adduser --gecos "" ubuntu
$ usermod -aG sudo ubuntu
$ su ubuntu

現(xiàn)在我要配置這個新的ubuntu帳戶來使用public key認(rèn)證,以便你可以免密登錄。

先不管服務(wù)器上打開的終端會話,然后在本地計(jì)算機(jī)上啟動第二個終端。 如果你使用的是Windows,這需要是可以訪問ssh命令的終端,所以它可能是一個bash或者類似的提示符的終端,而不是本地的Windows終端。 在該終端會話中,檢查~/.ssh目錄的內(nèi)容:

$ ls ~/.ssh
id_rsa  id_rsa.pub

如果目錄列表顯示如上所述的名為id_rsaid_rsa.pub的文件,那么你已經(jīng)有一個密鑰。 如果沒有這兩個文件,或者根本沒有~/.ssh目錄,則你需要運(yùn)行以下命令(也是OpenSSH工具集的一部分)來創(chuàng)建SSH密鑰對:

$ ssh-keygen

此應(yīng)用程序?qū)⑻崾灸爿斎胍恍﹥?nèi)容,為此我建議你在所有提示中按Enter以接受默認(rèn)設(shè)置。 你當(dāng)然也可以做一些設(shè)置,如果你知道這么做意味著什么的話。

運(yùn)行此命令后,應(yīng)該有上面列出的兩個文件了。 文件id_rsa.pub是你的公鑰,這是一個你將提供給第三方的文件,用于識別你的身份。 id_rsa文件是你的私鑰,不應(yīng)與任何人共享。

你現(xiàn)在需要將公鑰配置為服務(wù)器中的授權(quán)主機(jī)。 在你自己的計(jì)算機(jī)上打開的終端上,將公鑰打印到屏幕上:

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjw....F8Xv4f/0+7WT miguel@miguelspc

這將是一個非常長的字符序列,顯示時可能跨越多行(但實(shí)際上只有一行)。 你需要將此數(shù)據(jù)復(fù)制到剪貼板,然后切換回遠(yuǎn)程服務(wù)器上的終端,你將在其中運(yùn)行以下命令來存儲公鑰:

$ echo <paste-your-key-here> >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

免密登錄現(xiàn)在應(yīng)該可以工作了。 背后邏輯是,你機(jī)器上的ssh會用私鑰執(zhí)行加密操作來向服務(wù)器標(biāo)識自己。 然后服務(wù)器使用你的公鑰驗(yàn)證操作是否有效。

你現(xiàn)在可以注銷ubuntu會話,然后注銷root會話,然后嘗試直接登錄到ubuntu帳戶:

$ ssh ubuntu@<server-ip-address>

這一次不用輸入密碼就登錄了!

保護(hù)你的服務(wù)器

為了最大限度地降低服務(wù)器受到攻擊的風(fēng)險(xiǎn),你可以采取一些措施來關(guān)閉攻擊者可能訪問的大量潛在漏洞。

我要做的第一個更改是禁用root用戶通過SSH登錄。 你現(xiàn)在可以無密碼地訪問ubuntu帳戶,并且可以通過sudo從該帳戶運(yùn)行管理員命令,因此實(shí)際上不需要暴露root帳戶。 要禁用root登錄,你需要編輯服務(wù)器上的/etc/ssh/sshd_config文件。 你可能在你的服務(wù)器上安裝了vinano文本編輯器,你可以用它來編輯文件(如果你不熟悉這兩種文件編輯器,可以首先嘗試nano)。 由于SSH配置對普通用戶是不可訪問的,所以你需要在編輯器命令前添加sudo(即sudo vi /etc/ssh/sshd_config)。 你需要更改此文件中的單行:

/etc/ssh/sshd_config:禁止root登錄。

PermitRootLogin no

請注意,要進(jìn)行此更改,你需要找到以PermitRootLogin開頭的行(找不到就新建一行)并將該值更改為no。

下一個更改在同一個文件中。 現(xiàn)在我要為所有帳戶禁用密碼登錄。 你有一個無密碼的登錄設(shè)置,所以沒有必要允許密碼。 如果你對完全禁用密碼感到緊張,可以跳過此更改,但對于生產(chǎn)服務(wù)器來說,這是一個非常好的主意,因?yàn)楣粽呓?jīng)常在所有服務(wù)器上嘗試隨機(jī)帳戶名和密碼并希望能中獎。 要禁用密碼登錄,請?jiān)?em>/etc/ssh/sshd_config中更改以下行:

/etc/ssh/sshd_config:禁用密碼登錄。

PasswordAuthentication no

完成編輯SSH配置后,需要重新啟動ssh服務(wù)以使更改生效:

$ sudo service ssh restart

我要做的第三個改變是安裝防火墻。 這是一個阻止在任何未明確啟用的端口上訪問服務(wù)器的軟件:

$ sudo apt-get install -y ufw
$ sudo ufw allow ssh
$ sudo ufw allow http
$ sudo ufw allow 443/tcp
$ sudo ufw --force enable
$ sudo ufw status

這些命令會安裝ufw(簡單防火墻),并將其配置為僅允許端口22(ssh),80(http)和443(https)上的外部通信。 任何其他端口將不被允許。

安裝基礎(chǔ)依賴

如果你遵循了我的建議并配置了Ubuntu 16.04發(fā)行版的服務(wù)器,那么你的系統(tǒng)完全支持Python 3.5,因此這是我將用于部署的Python版本。

基礎(chǔ)的Python解釋器可能已經(jīng)預(yù)先安裝在你的服務(wù)器上,但有一些額外的軟件包可能卻沒有,而且Python之外還有一些其他軟件包可用于創(chuàng)建健壯的生產(chǎn)環(huán)境部署。 對于數(shù)據(jù)庫服務(wù)器,我將從SQLite切換到MySQL。 Postfix包是一個郵件傳輸代理,我將用它來發(fā)送電子郵件。 Supervisor工具將監(jiān)視Flask服務(wù)器進(jìn)程,并在其崩潰時自動重啟,并當(dāng)Supervisor服務(wù)重啟后自動啟動其監(jiān)視的服務(wù)。 Nginx服務(wù)器將接受來自外部世界的所有請求,并將它們轉(zhuǎn)發(fā)給應(yīng)用程序。 最后,我將使用git來從git倉庫下載應(yīng)用程序。

$ sudo apt-get -y update
$ sudo apt-get -y install python3 python3-venv python3-dev
$ sudo apt-get -y install mysql-server postfix supervisor nginx git

這些安裝大部分是無人值守的,但是在運(yùn)行第三條安裝語句到一定進(jìn)度時,系統(tǒng)會提示你為MySQL服務(wù)選擇一個root密碼,并且還會詢問關(guān)于安裝postfix軟件包的一些問題,你可以接受他們的默認(rèn)答案。

請注意,對于此部署,我選擇不安裝Elasticsearch。 這項(xiàng)服務(wù)需要大量的RAM,所以只有擁有超過2GB內(nèi)存的大型服務(wù)器時才可以考慮。 為了避免服務(wù)器內(nèi)存不足的問題,我將停用搜索功能。 如果你有高配的服務(wù)器,可以從Elasticsearch站點(diǎn)下載官方的.deb軟件包,并按照其安裝說明將其添加到你的服務(wù)器。 請注意,Ubuntu 16.04軟件包存儲庫中提供的Elasticsearch軟件包太舊,無法運(yùn)行,你需要6.x或更高版本。

我還注意到,默認(rèn)安裝的postfix可能不足以在生產(chǎn)環(huán)境中發(fā)送電子郵件。 為了避免垃圾郵件和惡意郵件,很多服務(wù)器都要求發(fā)件人服務(wù)器通過安全擴(kuò)展標(biāo)識自己,這意味著至少你必須擁有與你的服務(wù)器相關(guān)聯(lián)的域名。 如果你想了解如何完全配置電子郵件服務(wù)器以使其通過標(biāo)準(zhǔn)安全測試,請參閱以下Digital Ocean的指南:

安裝應(yīng)用

現(xiàn)在我要使用git從我的GitHub代碼庫下載Microblog源代碼。 如果你不熟悉git源碼控制,我建議你閱讀git for beginners。

要將應(yīng)用下載到服務(wù)器,請確保你位于ubuntu用戶的主目錄中,然后運(yùn)行:

$ git clone https://github.com/miguelgrinberg/microblog
$ cd microblog
$ git checkout v0.17

這會將代碼克隆到你的服務(wù)器上,并將其同步到本章的內(nèi)容。 如果你在學(xué)習(xí)本教程的過程中維護(hù)了自己的git代碼庫,則可以將代碼庫URL更改為你的URL,在這種情況下,你可以跳過git checkout命令。

現(xiàn)在我需要創(chuàng)建一個虛擬環(huán)境并使用所有的包依賴項(xiàng)來填充它,在第十五章中,我已將依賴包的列表保存到requirements.txt文件中:

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install -r requirements.txt

除了requirements.txt中的包之外,我還將使用此生產(chǎn)部署指定的兩個包,因此它們不包含在requirements.txt文件中。 gunicorn軟件包是Python應(yīng)用程序的生產(chǎn)Web服務(wù)器。 pymysql軟件包包含MySQL驅(qū)動程序,它使SQLAlchemy能夠與MySQL數(shù)據(jù)庫一起工作:

(venv) $ pip install gunicorn pymysql

我需要創(chuàng)建一個.env文件,其中包含所有需要的環(huán)境變量:

/home/ubuntu/microblog/.env:環(huán)境配置。

SECRET_KEY=52cb883e323b48d78a0a36e8e951ba4a
MAIL_SERVER=localhost
MAIL_PORT=25
DATABASE_URL=mysql+pymysql://microblog:<db-password>@localhost:3306/microblog
MS_TRANSLATOR_KEY=<your-translator-key-here>

這個.env文件與我在第十五章展示的非常類似,但是我為SECRET_KEY使用了一個隨機(jī)字符串。 為了生成這個隨機(jī)字符串,我使用了下面的命令:

python3 -c "import uuid; print(uuid.uuid4().hex)

對于DATABASE_URL變量,我定義了一個MySQL URL。 我將在下一節(jié)中向你介紹如何配置數(shù)據(jù)庫。

我需要將FLASK_APP環(huán)境變量設(shè)置為應(yīng)用程序的入口點(diǎn)以啟用flask命令,但在解析.env文件之前需要此變量,因此需要手動設(shè)置。 為避免每次都設(shè)置它,我把它添加到ubuntu帳戶的~/.profile文件的底部,以便每次登錄時自動設(shè)置它:

$ echo "export FLASK_APP=microblog.py" >> ~/.profile

如果你注銷并重新登錄,現(xiàn)在FLASK_APP就已經(jīng)設(shè)置好了。 你可以通過運(yùn)行flask --help來確認(rèn)它是否已經(jīng)設(shè)置好了。 如果幫助信息顯示應(yīng)用程序已添加的translate命令,那么你就知道應(yīng)用程序已被找到。

現(xiàn)在flask命令是有效的,我可以編譯語言翻譯:

(venv) $ flask translate compile

設(shè)置MySQL

我在開發(fā)過程中使用過的sqlite數(shù)據(jù)庫非常適合簡單的應(yīng)用程序,但是當(dāng)部署可能需要一次處理多個請求的健壯Web服務(wù)器時,最好使用更強(qiáng)大的數(shù)據(jù)庫。 出于這個原因,我要建立一個名為’microblog’的MySQL數(shù)據(jù)庫。

要管理數(shù)據(jù)庫服務(wù)器,我將使用mysql命令,該命令應(yīng)該已經(jīng)安裝在你的服務(wù)器上:

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

請注意,你需要鍵入你在安裝MySQL時選擇的MySQL root密碼才能訪問MySQL命令提示符。

這些是創(chuàng)建名為microblog的新數(shù)據(jù)庫的命令,以及具有完全訪問權(quán)限的同名用戶:

mysql> create database microblog character set utf8 collate utf8_bin;
mysql> create user 'microblog'@'localhost' identified by '<db-password>';
mysql> grant all privileges on microblog.* to 'microblog'@'localhost';
mysql> flush privileges;
mysql> quit;

你將需要用你選擇的密碼來替換<db-password>。 這將是microblog數(shù)據(jù)庫用戶的密碼,所以不要使用你已為root用戶選擇的密碼。 microblog用戶的密碼需要與你包含在.env文件中的DATABASE_URL變量中的密碼相匹配。

如果你的數(shù)據(jù)庫配置是正確的,你現(xiàn)在應(yīng)該能夠運(yùn)行數(shù)據(jù)庫遷移以創(chuàng)建所有的表:

(venv) $ flask db upgrade

繼續(xù)下一步之前,確保上述命令成功完成且不會產(chǎn)生任何錯誤。

設(shè)置Gunicorn和Supervisor

當(dāng)你使用flask run運(yùn)行服務(wù)器時,正在使用的是Flask附帶的Web服務(wù)器。 該服務(wù)器在開發(fā)過程中非常有用,但它不適合用于生產(chǎn)服務(wù)器,因?yàn)樗豢紤]性能和穩(wěn)健性。 取而代之,我決定使用gunicorn,它是一個純粹的Python Web服務(wù)器,但與Flask不同,它是一個支持高并發(fā)的強(qiáng)大生產(chǎn)服務(wù)器,同時它也非常容易使用。

要在gunicorn下啟動Microblog,你可以使用以下命令:

(venv) $ gunicorn -b localhost:8000 -w 4 microblog:app

-b選項(xiàng)告訴gunicorn在哪里監(jiān)聽請求,我在8000端口上監(jiān)聽了內(nèi)部網(wǎng)絡(luò)接口。 在沒有外部訪問的情況下運(yùn)行Python Web應(yīng)用程序通常是一個好主意,然后還需要一個非??焖俚腤eb服務(wù)器,它可以優(yōu)化來自客戶端的所有靜態(tài)文件的請求。 這個快速的Web服務(wù)器將直接提供靜態(tài)文件,并將用于應(yīng)用程序的任何請求轉(zhuǎn)發(fā)到內(nèi)部服務(wù)器。 我將在下一節(jié)中向你展示如何將nginx設(shè)置為面向公眾的服務(wù)器。

-w選項(xiàng)配置gunicorn將運(yùn)行多少worker。 擁有四個進(jìn)程可以讓應(yīng)用程序同時處理多達(dá)四個客戶端,這對于Web應(yīng)用程序通常足以處理大量客戶端請求,因?yàn)椴⒎撬锌蛻舳硕荚诓粩嗾埱髢?nèi)容。 根據(jù)服務(wù)器的RAM大小,你可能需要調(diào)整worker數(shù)量,以免內(nèi)存不足。

microblog:app參數(shù)告訴gunicorn如何加載應(yīng)用程序?qū)嵗?冒號前的名稱是包含應(yīng)用程序的模塊,冒號后面的名稱是此應(yīng)用程序的名稱。

雖然gunicorn的設(shè)置非常簡單,但從命令行運(yùn)行服務(wù)器在生產(chǎn)服務(wù)器實(shí)際上不是一個恰當(dāng)?shù)姆桨浮?我想要做的是讓服務(wù)器在后臺運(yùn)行,并持續(xù)監(jiān)視,因?yàn)槿绻捎谀撤N原因?qū)е路?wù)器崩潰并退出,我想確保新的服務(wù)器自動啟動以取代它。 而且我還想確保如果機(jī)器重新啟動,服務(wù)器在啟動時自動運(yùn)行,而無需人工登錄和啟動。 我將使用上面安裝的supervisor包來執(zhí)行此操作。

Supervisor使用配置文件定義它要監(jiān)視什么程序以及如何在必要時重新啟動它們。 配置文件必須存儲在/etc/supervisor/conf.d中。 這是Microblog的配置文件,我將其稱為microblog.conf

/etc/supervisor/conf.d/microblog.conf:Supervisor配置。

[program:microblog]
command=/home/ubuntu/microblog/venv/bin/gunicorn -b localhost:8000 -w 4 microblog:app
directory=/home/ubuntu/microblog
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

command,directoryuser設(shè)置告訴supervisor如何運(yùn)行應(yīng)用程序。 如果計(jì)算機(jī)啟動或崩潰,autostartautorestart設(shè)置會使microblog自動重新啟動。 stopasgroupkillasgroup選項(xiàng)確保當(dāng)supervisor需要停止應(yīng)用程序來重新啟動它時,它仍然會調(diào)度成頂級gunicorn進(jìn)程的子進(jìn)程。

編寫此配置文件后,必須重載supervisor服務(wù)的配置才能導(dǎo)入它:

$ sudo supervisorctl reload

像這樣,這個gunicorn web服務(wù)器就已經(jīng)啟動和運(yùn)行,并處于監(jiān)控之中!

設(shè)置Nginx

由gunicorn啟動的microblog應(yīng)用服務(wù)器現(xiàn)在運(yùn)行在本地端口8000。 我現(xiàn)在需要做的是將應(yīng)用程序暴露給外部世界,為了使面向公眾的web服務(wù)器能夠被訪問,我在防火墻上打開了兩個端口(80和443)來處理應(yīng)用程序的Web通信。

我希望這是一個安全的部署,所以我要配置端口80將所有流量轉(zhuǎn)發(fā)到將要加密的端口443。 我將首先創(chuàng)建一個SSL證書。創(chuàng)建一個自簽名SSL證書,這對于測試是可以的,但對于真正的部署不太好,因?yàn)閃eb瀏覽器會警告用戶,證書不是由可信證書頒發(fā)機(jī)構(gòu)頒發(fā)的。 創(chuàng)建microblog的SSL證書的命令是:

$ mkdir certs
$ openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
  -keyout certs/key.pem -out certs/cert.pem

該命令將要求你提供關(guān)于應(yīng)用程序和你自己的一些信息。 這些信息將包含在SSL證書中,如果用戶請求查看它,Web瀏覽器則會向用戶顯示它們。上述命令的結(jié)果將是名為key.pemcert.pem的兩個文件,我將其放置在Microblog根目錄的certs子目錄中。

要有一個由nginx服務(wù)的網(wǎng)站,你需要為它編寫配置文件。 在大多數(shù)nginx安裝中,這個文件需要位于/etc/nginx/sites-enabled目錄中。Nginx在這個位置安裝了一個我不需要的測試站點(diǎn),所以我將首先刪除它:

$ sudo rm /etc/nginx/sites-enabled/default

下面你可以看到Microblog的nginx配置文件,它在/etc/nginx/sites-enabled/microblog中:

/etc/nginx/sites-enabled/microblog:Nginx配置。

server {
    # listen on port 80 (http)
    listen 80;
    server_name _;
    location / {
        # redirect any requests to the same URL but on https
        return 301 https://$host$request_uri;
    }
}
server {
    # listen on port 443 (https)
    listen 443 ssl;
    server_name _;

    # location of the self-signed SSL certificate
    ssl_certificate /home/ubuntu/microblog/certs/cert.pem;
    ssl_certificate_key /home/ubuntu/microblog/certs/key.pem;

    # write access and error logs to /var/log
    access_log /var/log/microblog_access.log;
    error_log /var/log/microblog_error.log;

    location / {
        # forward application requests to the gunicorn server
        proxy_pass http://localhost:8000;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static {
        # handle static files directly, without forwarding to the application
        alias /home/ubuntu/microblog/static;
        expires 30d;
    }
}

Nginx的配置不易理解,但我添加了一些注釋,至少你可以知道每個部分的功能。 如果你想獲得關(guān)于特定指令的信息,請參閱nginx官方文檔。

添加此文件后,你需要告訴nginx重新加載配置以激活它:

$ sudo service nginx reload

現(xiàn)在應(yīng)用程序應(yīng)該部署成功了。 在你的Web瀏覽器中,可以鍵入服務(wù)器的IP地址(如果使用的是Vagrant VM,則為192.168.33.10),然后該服務(wù)器將連接到應(yīng)用程序。 由于你使用的是自簽名證書,因此將收到來自Web瀏覽器的警告,你必須解除該警告。

使用上述說明為自己的項(xiàng)目完成部署之后,我強(qiáng)烈建議你將自簽名證書替換為真實(shí)的證書,以便瀏覽器不會在用戶訪問你的網(wǎng)站時發(fā)出警告。 為此,你首先需要購買域名并將其配置為指向你的服務(wù)器的IP地址。 一旦你有一個域名,你可以申請一個免費(fèi)的Let’s Encrypt SSL證書。 我在博客上寫了一篇關(guān)于如何通過HTTPS運(yùn)行你的Flask應(yīng)用程序的詳細(xì)文章。

部署應(yīng)用更新

我想討論的基于Linux的部署的最后一個主題是如何處理應(yīng)用程序升級。 應(yīng)用程序源代碼通過git安裝在服務(wù)器中,因此,無論何時想要將應(yīng)用程序升級到最新版本,都可以運(yùn)行git pull來下載自上次部署以來的新提交。

當(dāng)然,下載新版本的代碼不會導(dǎo)致升級。 當(dāng)前正在運(yùn)行的服務(wù)器進(jìn)程將繼續(xù)運(yùn)行,舊代碼已被讀取并存儲在內(nèi)存中。 要觸發(fā)升級,你必須停止當(dāng)前的服務(wù)器并啟動一個新的服務(wù)器,以強(qiáng)制重新讀取所有代碼。

進(jìn)行升級通常比重新啟動服務(wù)器更為復(fù)雜。 你可能需要應(yīng)用數(shù)據(jù)庫遷移或編譯新的語言翻譯,因此實(shí)際上,執(zhí)行升級的過程涉及一系列命令:

(venv) $ git pull                              # download the new version
(venv) $ sudo supervisorctl stop microblog     # stop the current server
(venv) $ flask db upgrade                      # upgrade the database
(venv) $ flask translate compile               # upgrade the translations
(venv) $ sudo supervisorctl start microblog    # start a new server

樹莓派托管

樹莓派是一款革命性低成本的小型Linux計(jì)算機(jī),功耗非常低,因此它是托管家庭在線服務(wù)器的理想設(shè)備,可以全天候在線而無需捆綁你的臺式電腦或筆記本電腦。 有幾個Linux發(fā)行版可以在樹莓派上運(yùn)行。 我的選擇是Raspbian,這是樹莓派基金會的官方發(fā)行版。

為了準(zhǔn)備樹莓派的環(huán)境,我要安裝一個新的Raspbian版本。 我將使用2017年9月版的Raspbian Stretch Lite,但在閱讀本文時,可能會有更新的版本,請查看官方下載頁面獲得最新版本。

Raspbian鏡像需要安裝在SD卡上,然后插入樹莓派,以便它啟動時可以識別到。 在樹莓派站點(diǎn)上可以查看到從Windows,Mac OS X和Linux將Raspbian鏡像復(fù)制到SD卡的方法。

當(dāng)你第一次啟動樹莓派時,請?jiān)谶B接到鍵盤和顯示器時進(jìn)行操作,以便你可以進(jìn)行設(shè)置。 至少應(yīng)該啟用SSH,以便你可以從計(jì)算機(jī)登錄并方便地執(zhí)行部署任務(wù)。

和Ubuntu一樣,Raspbian也是Debian的衍生產(chǎn)品,所以上面針對的Ubuntu Linux的說明,大部分都可以在樹莓派上生效。 但是,如果你計(jì)劃在家庭網(wǎng)絡(luò)上運(yùn)行小型應(yīng)用程序而無需外部訪問時,則可以跳過某些步驟。 例如,你可能不需要防火墻或無密碼登錄。 你可能想在這樣一臺小型的計(jì)算機(jī)上使用SQLite而不是MySQL。 你可以選擇不使用nginx,并且讓gunicorn服務(wù)器直接監(jiān)聽來自客戶端的請求。 你可能只想要一個gunicorn worker進(jìn)程。 Supervisor服務(wù)對于確保應(yīng)用程序始終處于運(yùn)行狀態(tài)非常有用,因此我建議你仍然在樹莓派上使用它。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容