成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

CentOS 下使用 Pipenv + Gunicorn + Supervisor 部署 Flask

anyway / 1363人閱讀

摘要:根據(jù)中華人民共和國(guó)信息產(chǎn)業(yè)部第十二次部務(wù)會(huì)議審議通過(guò)的非經(jīng)營(yíng)性互聯(lián)網(wǎng)信息服務(wù)備案管理辦法精神,在中華人民共和國(guó)境內(nèi)提供非經(jīng)營(yíng)性互聯(lián)網(wǎng)信息服務(wù),應(yīng)當(dāng)辦理備案。未經(jīng)備案,不得在中華人民共和國(guó)境內(nèi)從事非經(jīng)營(yíng)性互聯(lián)網(wǎng)信息服務(wù)。

當(dāng)我們開(kāi)發(fā)了一個(gè)簡(jiǎn)單的 Flask 程序,想把項(xiàng)目部署上線(xiàn),我們可以選擇傳統(tǒng)的部署方式或者云部署方式把項(xiàng)目部署上線(xiàn)。在本文中,筆者將使用 阿里云輕量應(yīng)用服務(wù)器 安裝 CentOS 7 系統(tǒng)部署一個(gè)簡(jiǎn)單的 Flask 項(xiàng)目。
1. 購(gòu)買(mǎi)域名、服務(wù)器、SSL 證書(shū)

要部署一個(gè)網(wǎng)站,首先要做的就是購(gòu)買(mǎi)域名和服務(wù)器,市面上主要有阿里云、騰訊云、亞馬遜云等云服務(wù)器供應(yīng)商,你可以自由選擇。除了域名和服務(wù)器外,還需要申請(qǐng) SSL 證書(shū),為開(kāi)啟 HTTPS 訪問(wèn)做準(zhǔn)備。

1.1 域名

對(duì)于還從未購(gòu)買(mǎi)過(guò)域名的用戶(hù),推薦使用阿里云和騰訊云購(gòu)買(mǎi)域名,可以享受一元首購(gòu)優(yōu)惠。

阿里云 域名1元購(gòu)專(zhuān)題

騰訊云 特價(jià)域名1元起,免費(fèi)送SSL證書(shū)

1.2 服務(wù)器

阿里云和騰訊云針對(duì)有專(zhuān)門(mén)針對(duì)學(xué)生的學(xué)生機(jī),價(jià)格非常實(shí)惠。其中阿里云是只要你的年齡 24 歲以下自動(dòng)認(rèn)定為大學(xué)生,可以嘗試一下。

阿里云 云翼計(jì)劃2018

騰訊云 云+校園

1.3 SSL 證書(shū)

SSL證書(shū)是數(shù)字證書(shū)的一種,類(lèi)似于駕駛證、護(hù)照和營(yíng)業(yè)執(zhí)照的電子副本。因?yàn)榕渲迷诜?wù)器上,也稱(chēng)為SSL服務(wù)器證書(shū)。SSL 證書(shū)就是遵守 SSL 協(xié)議,由受信任的數(shù)字證書(shū)頒發(fā)機(jī)構(gòu) CA ,在驗(yàn)證服務(wù)器身份后頒發(fā),具有服務(wù)器身份驗(yàn)證和數(shù)據(jù)傳輸加密功能。

阿里云和騰訊云控制臺(tái)都提供了 SSL 證書(shū)購(gòu)買(mǎi)的功能,對(duì)于需要付費(fèi)的 SSL 證書(shū),你可以直接挑選一個(gè)價(jià)格合適的然后付錢(qián)即可。如果想申請(qǐng)免費(fèi)的 SSL 證書(shū),可以直接參考下方鏈接:

阿里云 阿里云申請(qǐng)免費(fèi)SSL證書(shū)實(shí)現(xiàn)網(wǎng)站HTTPS化

騰訊云 手把手教你申請(qǐng)騰訊云免費(fèi)SSL證書(shū)

2. 網(wǎng)站備案

備案是指向主管機(jī)關(guān)報(bào)告事由存案以備查考。行政法角度看備案,實(shí)踐中主要是《立法法》和《法規(guī)規(guī)章備案條例》的規(guī)定。根據(jù)中華人民共和國(guó)信息產(chǎn)業(yè)部第十二次部務(wù)會(huì)議審議通過(guò)的《非經(jīng)營(yíng)性互聯(lián)網(wǎng)信息服務(wù)備案管理辦法》精神,在中華人民共和國(guó)境內(nèi)提供非經(jīng)營(yíng)性互聯(lián)網(wǎng)信息服務(wù),應(yīng)當(dāng)辦理備案。未經(jīng)備案,不得在中華人民共和國(guó)境內(nèi)從事非經(jīng)營(yíng)性互聯(lián)網(wǎng)信息服務(wù)。而對(duì)于沒(méi)有備案的網(wǎng)站將予以罰款和關(guān)閉。

簡(jiǎn)單來(lái)說(shuō),購(gòu)買(mǎi)了服務(wù)器之后,如果希望通過(guò)域名能正常訪問(wèn)到您的網(wǎng)站,就需要進(jìn)行網(wǎng)站備案。

阿里云網(wǎng)站備案 幫助文檔

騰訊云網(wǎng)站備案 幫助文檔

3. 網(wǎng)站域名解析

這里僅以阿里云服務(wù)器控制臺(tái)為例,其它云服務(wù)器請(qǐng)參考官方說(shuō)明文檔。

首先,選擇服務(wù)器控制臺(tái)中的 站點(diǎn)設(shè)置 > 域名 菜單;然后點(diǎn)擊 添加域名 按鈕,為你的域名同時(shí)添加 "www" 及 "@" 記錄。假設(shè)你購(gòu)買(mǎi)的域名為 demo.com ,則同時(shí)添加的兩條記錄為:

"@" 記錄 :demo.com

"www" 記錄:www.demo.com

這兩個(gè)域名都能訪問(wèn)到你的網(wǎng)站首頁(yè)。

4. SSH 遠(yuǎn)程連接

通過(guò) SSH 遠(yuǎn)程連接服務(wù)器實(shí)例,可以方便的對(duì)服務(wù)器進(jìn)行管理。你可以手動(dòng)輸入命令生成 SSH 密鑰連接服務(wù)器;也可以通過(guò)云服務(wù)器控制臺(tái)自動(dòng)生成密鑰,然后導(dǎo)出密鑰到本地,再使用導(dǎo)出的密鑰連接服務(wù)器。這里推薦通過(guò)云服務(wù)器控制臺(tái)生成密鑰的方式。

相較于傳統(tǒng)的用戶(hù)名和密碼認(rèn)證方式,使用 SSH 密鑰有以下優(yōu)勢(shì):

SSH 密鑰登錄認(rèn)證更為安全可靠,可以杜絕暴力破解威脅。

SSH 密鑰登錄方式更簡(jiǎn)便,只需在控制臺(tái)和本地客戶(hù)端做簡(jiǎn)單配置即可遠(yuǎn)程登錄實(shí)例,再次登錄時(shí)無(wú)需再輸入密碼。

4.1 控制臺(tái)生成 SSH 密鑰方式(推薦)

阿里云 用戶(hù)指南:遠(yuǎn)程連接到Linux操作系統(tǒng)實(shí)例

騰訊云 操作指南:登錄 Linux 實(shí)例

4.2 手動(dòng)生成 SSH 密鑰方式

在客戶(hù)端的 Shell 中執(zhí)行下面命令生成 SSH 密鑰對(duì):

$ ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"

在客戶(hù)端的 Shell 中執(zhí)行下面命令授予 .ssh 文件夾 600 權(quán)限:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorizes_keys

在客戶(hù)端的 Shell 中執(zhí)行下面命令將客戶(hù)端私鑰拷貝到服務(wù)器:

# 執(zhí)行下面的命令會(huì)被要求輸入服務(wù)器對(duì)應(yīng)用戶(hù)的密碼,密碼輸入正確才能成功完成拷貝
# 記得將下面命令中的 root@47.107.132.88 替換成你自己的服務(wù)器的 SSH 地址
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@47.107.132.88

在客戶(hù)端的 Shell 中執(zhí)行下面命令,進(jìn)行 SSH 免密碼登陸測(cè)試:

$ ssh root@47.107.132.88

在客戶(hù)端的 ~/.bashrc 文件中為遠(yuǎn)程連接的命令取個(gè)別名,以后就可以方便的進(jìn)行登陸了:

$ vim ~/.bashrc

在文件中找到下面這一行:

# some more ls aliases

在該行代碼下面再添加一行并保存,內(nèi)容如下:

alias ecs="ssh root@47.107.132.88"

在客戶(hù)端的 Shell 中執(zhí)行下面命令,使剛剛修改文件生效:

$ source ~/.bashrc

在客戶(hù)端的 Shell 中執(zhí)行下面命令,查看你已經(jīng)設(shè)置的別名:

$ alias
5. 使用 MySQL 8 數(shù)據(jù)庫(kù)

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開(kāi)發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開(kāi)放源碼這一特點(diǎn),一般中小型網(wǎng)站的開(kāi)發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。

5.1 安裝與初始化

在 Download MySQL Yum Repository 頁(yè)面獲取 MySQL 8 Community Yum 倉(cāng)庫(kù)文件的鏈接,例如:

https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpm

通過(guò) SSH 遠(yuǎn)程連接服務(wù)器實(shí)例,執(zhí)行下面命令切換到其它擁有 root 權(quán)限的用戶(hù),阿里云服務(wù)器實(shí)例默認(rèn)有一個(gè)擁有 root 權(quán)限的 admin 用戶(hù),這里以切換到 admin 用戶(hù)為例子:

$ su admin

執(zhí)行下面命令,下載 MySQL 8 Community Yum 倉(cāng)庫(kù)文件:

$ wget https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpm

執(zhí)行下面命令,安裝 MySQL 8 Community Yum 倉(cāng)庫(kù)文件:

$ sudo yum localinstall mysql80-community-release-el7-2.noarch.rpm

執(zhí)行下面命令,檢查 MySQL 8 Community Yum 倉(cāng)庫(kù)文件是否正確安裝 :

$ yum repolist enabled | grep "mysql.*-community.*"

執(zhí)行下面命令,安裝 MySQL 8 Community :

$ sudo yum install mysql-community-server

使用 service 命令管理 MySQL 服務(wù):

$ sudo service mysqld start          # 啟動(dòng) MySQL 服務(wù)
$ sudo service mysqld stop           # 停止 MySQL 服務(wù)
$ sudo service mysqld restart        # 重啟 MySQL 服務(wù)
$ sudo service mysqld status         # 查看 MySQL 服務(wù)狀態(tài)

使用 systemctl 命令管理 MySQL 服務(wù):

$ sudo systemctl start mysqld   # 啟動(dòng) MySQL 服務(wù)
$ sudo systemctl stop mysqld    # 停止 MySQL 服務(wù)
$ sudo systemctl restart mysqld # 重啟 MySQL 服務(wù)
$ sudo systemctl status mysqld  # 查看 MySQL 服務(wù)狀態(tài)
$ sudo systemctl enable mysqld  # 設(shè)置 MySQL 服務(wù)開(kāi)機(jī)自啟動(dòng)
$ sudo systemctl disable mysqld # 關(guān)閉 MySQL 服務(wù)開(kāi)機(jī)自啟動(dòng)

首次啟動(dòng) MySQL 服務(wù),會(huì)自動(dòng)初始化數(shù)據(jù)目錄、生成 SSL 證書(shū)和密鑰文件、創(chuàng)建超級(jí)用戶(hù) " root"@"localhost" ,超級(jí)用戶(hù)的密碼被設(shè)置并存儲(chǔ)在錯(cuò)誤日志文件中。可以使用以下命令查詢(xún)臨時(shí)密碼:

$ sudo grep "temporary password" /var/log/mysqld.log

現(xiàn)在你可以用你查詢(xún)到的臨時(shí)密碼連接數(shù)據(jù)庫(kù)服務(wù)器了。

5.2 連接數(shù)據(jù)庫(kù)服務(wù)器

輸入以下命令,根據(jù)提示輸入上一步獲得的臨時(shí)密碼,連接數(shù)據(jù)庫(kù)服務(wù)器:

$ mysql -u root -p
Enter password: (在這里輸入上一步查詢(xún)到的臨時(shí)密碼) 

連接 MySQL 服務(wù)器后,在 MySQL 命令行中為 " root"@"localhost" 設(shè)置新密碼,使臨時(shí)密碼失效:

mysql> ALTER USER "root"@"localhost" IDENTIFIED BY "new_password";

新版 MySQL 的安全策略要求輸入的密碼要包含大寫(xiě)字母、小寫(xiě)字母、數(shù)字、特殊符號(hào),推薦使用密碼管理工具生成隨機(jī)密碼來(lái)作為你的新密碼。

為了更加方便的遠(yuǎn)程連接 MySQL 服務(wù)器,接下來(lái)需要允許 MySQL 的 root 賬戶(hù)在其它地址登陸:

mysql> USE mysql;
mysql> UPDATE user SET host = "%" WHERE host = "root";
# 這里的 host = "%" 中的 % 表示允許在任意地址登陸,你也可以設(shè)置為指定的局域網(wǎng) IP、公網(wǎng) IP、域名等

接下來(lái)你就可以使用 DataGrip、Navicat 等數(shù)據(jù)庫(kù)管理工具方便的管理云服務(wù)器實(shí)例上的 MySQL 了。

6. 編譯安裝 Python 3

Cent OS 預(yù)裝了一個(gè) Python 2,并且系統(tǒng)很多組件都依賴(lài)于 Python 2 ,筆者在安裝和使用 Python 3 時(shí)就因?yàn)檫@些依賴(lài)情況遇到了很多問(wèn)題,最后總結(jié)下來(lái),正確的安裝和使用 Python 3 的過(guò)程如下:

遠(yuǎn)程連接云服務(wù)器實(shí)例,在本示例中將使用 root 用戶(hù)通過(guò)編譯安裝方式全局安裝 Python 3,你也可以選擇多帶帶為某個(gè)用戶(hù)安裝 Python 3 ,步驟上大同小異,詳細(xì)編譯安裝文檔參考 Using Python on Unix platforms 。

使用 Yum 安裝編譯安裝 Python 3 時(shí)依賴(lài)的包:

$ yum -y groupinstall "Development tools"
$ yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

下載 Python 3.6.7 版本的安裝包,其它版本的請(qǐng)自行去 Download Python | Python.org 獲取鏈接:

$ wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz

在當(dāng)前用戶(hù)目錄解壓下載的 Python 安裝包:

$ tar -zxvf Python-3.6.7.tgz

進(jìn)入已解壓的 Python 安裝文件根目錄:

$ cd Python-3.6.7

通過(guò)編譯配置指定 Python 的安裝位置:

$ ./configure --prefix=/usr/local/python3

使用 make 命令開(kāi)始編譯安裝 Python:

$ make && make install

為了和系統(tǒng)自帶的 pythonpip 命令區(qū)分開(kāi)來(lái),給剛剛安裝的 Python 建立軟鏈接,并為其設(shè)置命令別名。分別取名為 python3 、pip3

$ ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
$ ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

測(cè)試 Python 3 是否正確安裝,輸入 python3 命令:

$ python3
Python 3.6.7 (default, Feb  4 2019, 19:05:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

測(cè)試 Pip 3 是否正確安裝,輸入 pip3 命令:

$ pip3 -V
pip 10.0.0 from /usr/local/python3/lib/python3.6/site-packages/pip (python 3.6)

更新 Pip :

$ pip3 install --upgrade pip

7. 使用 Pipenv 管理 Python 虛擬環(huán)境

Pipenv 是 Pipfile 主要倡導(dǎo)者、requests 作者 Kenneth Reitz 寫(xiě)的一個(gè)命令行工具,主要包含了 Pipfile、pip、click、requests 和 virtualenv ,使用 Pipenv 可以方便的管理 Python 虛擬環(huán)境、管理依賴(lài)文件。Pipfile 和 Pipenv本來(lái)都是Kenneth Reitz 的個(gè)人項(xiàng)目,后來(lái)貢獻(xiàn)給了 pypa 組織。Pipfile 是社區(qū)擬定的依賴(lài)管理文件,用于替代過(guò)于簡(jiǎn)陋的 requirements.txt 文件。

執(zhí)行下面命令,安裝 Pipenv :

$ pip3 install pipenv

執(zhí)行下面命令,為 Pipenv 可執(zhí)行文件設(shè)置軟鏈接,之后可以通過(guò) pipenv 命令來(lái)使用 Pipenv :

$ ln -s /usr/local/python3/bin/pipenv /usr/bin/pipenv

切換到一個(gè)擁有 root 權(quán)限的用戶(hù),這里以 admin 用戶(hù)為例:

$ su admin

在用戶(hù)目錄下為你的項(xiàng)目創(chuàng)建一個(gè)目錄,并進(jìn)入項(xiàng)目目錄,項(xiàng)目名稱(chēng)以 FlaskApp 為例:

$ cd ~
$ mkdir FlaskApp
$ cd FlaskApp

執(zhí)行下面命令,為項(xiàng)目創(chuàng)建 Python 虛擬環(huán)境,默認(rèn)將虛擬環(huán)境保存在 ~/.local/share/virtualenvs

$ pipenv install

如果想把虛擬環(huán)境保存至項(xiàng)目根目錄,需要設(shè)置環(huán)境變量 PIPENV_VENV_IN_PROJECT=1 ,再執(zhí)行創(chuàng)建命令:

$ export PIPENV_VENV_IN_PROJECT=1
$ pipenv install

虛擬環(huán)境創(chuàng)建完成后,執(zhí)行下面命令為虛擬環(huán)境安裝 Flask 包:

$ pipenv install flask

在項(xiàng)目根目錄編寫(xiě)一個(gè)簡(jiǎn)單的 Flask Demo 進(jìn)行測(cè)試:

# 新建并打開(kāi)一個(gè)名為 app.py 的文件
$ vim app.py

輸入下面的代碼并保存:

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_flask():
    return "Hello Flask!"

使用 pipenv run 調(diào)用虛擬環(huán)境中的 Python 執(zhí)行 flask run 命令可以運(yùn)行編寫(xiě)的代碼:

$ pipenv run flask run

也可以使用 pipenv shell 命令進(jìn)入虛擬環(huán)境,然后再在虛擬環(huán)境執(zhí)行 flask run 命令運(yùn)行程序:

$ pipenv shell
(venv)$ flask run

Flask 默認(rèn)運(yùn)行的地址和端口為 http://127.0.0.1:5000 ,云服務(wù)器實(shí)例不包含桌面環(huán)境的話(huà),你很難去瀏覽這個(gè)頁(yè)面。你可以設(shè)置 flask 運(yùn)行的地址和端口,然后嘗試從外網(wǎng)訪問(wèn)該頁(yè)面。先執(zhí)行下面命令,讓 flask 允許外網(wǎng)訪問(wèn),并且監(jiān)聽(tīng) 80 端口:

$ pipenv run flask run --host 0.0.0.0 --port 80

然后你可以通過(guò)你的服務(wù)器公網(wǎng) IP 或 域名 直接訪問(wèn)到該頁(yè)面。

8. 使用 Gunicorn 運(yùn)行程序

flask run 命令啟動(dòng)的開(kāi)發(fā)服務(wù)器是由 Werkzeug 提供的。細(xì)分的話(huà), Werkzeug 提供的這個(gè)開(kāi)發(fā)服務(wù)器應(yīng)該被稱(chēng)為 WSGI 服務(wù)器,而不是單純意義上的 Web 服務(wù)器。在生產(chǎn)環(huán)境中,我們需要一個(gè)更強(qiáng)健、性能更高的 WSGI 服務(wù)器。這些 WSGI 服務(wù)器也被稱(chēng)為獨(dú)立 WSGI 容器,因?yàn)樗鼈兛梢猿休d我們編寫(xiě)的 WSGI 程序,然后處理 HTTP 請(qǐng)求和響應(yīng)。這通常有很多選擇,比如 Gunicorn 。 Gunicorn 是 Green Unicorn 的簡(jiǎn)寫(xiě),意為綠色獨(dú)角獸,是一款專(zhuān)為 UNIX 設(shè)計(jì)的 Python WSGI HTTP 服務(wù)器。是一個(gè)Pre-fork 工人模型。Gunicorn 服務(wù)器廣泛兼容各種 web 框架,實(shí)現(xiàn)簡(jiǎn)單,節(jié)省服務(wù)器資源,速度相當(dāng)快。

安裝 Gunicorn :

$ pipenv install gunicorn

使用 Gunicorn 運(yùn)行一個(gè) WSGI 程序:

$ pipenv run gunicorn --workers=4 --bind=0.0.0.0:8000 app:app
# --workers = 4 表示使用 4 worker 進(jìn)程運(yùn)行程序,建議 worker 數(shù)量為 ( CPU 核心數(shù) × 2 ) + 1
# Gunicorn 默認(rèn)只允許從本地 8000 端口訪問(wèn),--bind=0.0.0.0:8000 表示允許使用 8000 端口從外部訪問(wèn)
# app:app 冒號(hào)前面的 app 表示 app.py 文件,冒號(hào)后面的 app 表示 flask 程序的名稱(chēng)

也可以把 --workers 簡(jiǎn)寫(xiě)為 -w--bind 簡(jiǎn)寫(xiě)為 -b ,如下:

# 沒(méi)有 -b 或者 --bind 參數(shù),默認(rèn)監(jiān)聽(tīng) 127.0.0.1:8000
$ pipenv run gunicorn -w 4 app:app

# 指定 -b 0.0.0.0:8000 監(jiān)聽(tīng) 8000 端口的外部請(qǐng)求
$ pipenv run gunicorn -w 4 -b 0.0.0.0:8000 app:app

9. 使用 Nginx 提供反向代理

像 Gunicorn 這類(lèi) WSGI 服務(wù)器內(nèi)置的 Web 服務(wù)器還不夠強(qiáng)健,雖然程序可以正常運(yùn)行,但是更流行的部署方式是使用一個(gè)常規(guī)的 Web 服務(wù)器運(yùn)行在前端,為 WSGI 提供反向代理。比較流行的開(kāi)源 Web 服務(wù)器有 Nginx 、Apache 等,這里選擇使用和 Gunicorn 集成良好的 Nginx 。

訪問(wèn) nginx packages 獲取對(duì)應(yīng)版本 Nginx 的 Yum 倉(cāng)庫(kù)的鏈接,例如:

http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

下載 Nginx Yum 倉(cāng)庫(kù)文件:

$ wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安裝 Nginx Yum 倉(cāng)庫(kù)文件:

$ sudo yum localinstall nginx-release-centos-7-0.el7.ngx.noarch.rpm

安裝 Nginx :

$ sudo yum install nginx

進(jìn)入 Nginx 配置文件目錄:

$ cd /etc/nginx/

創(chuàng)建 cert 目錄,并上傳你的 SSL 證書(shū)到該目錄:

$ mkdir cert

上傳 SSL 證書(shū)到 cert 目錄你可以使用 scp 命令,或者使用 FileZilla 等 SFTP 軟件,我上傳的文件如下:

$ cd cert
$ ls
ssl.key  ssl.pem

進(jìn)入 /etc/nginx/conf.d/ 目錄編輯默認(rèn)的配置文件 default.conf

$ cd /etc/nginx/conf.d/
$ vim default.conf

刪除文件中原有的全部?jī)?nèi)容,新增下面內(nèi)容并保存:

# 監(jiān)聽(tīng) http 請(qǐng)求,強(qiáng)制跳轉(zhuǎn)到 https
server {
    listen      80;
    
    # 這里的 your.domain.com 換成你購(gòu)買(mǎi)的域名
    server_name your.domain.com;
    
    # 這里的 your.domain.com 換成你購(gòu)買(mǎi)的域名
    return 301 https://your.domain.com$request_uri;
}

# 監(jiān)聽(tīng) https 請(qǐng)求
server {
    listen      443;
    
    # 這里的 your.domain.com 換成你購(gòu)買(mǎi)的域名
    server_name your.domain.com;
    
    access_log  /var/log/nginx/host.access.log;
    error_log   /var/log/nginx/host.error.log;

    ssl on;
    
    # 這部分的 ssl.pem ssl.key 換成你上傳的與其對(duì)應(yīng)的文件
    ssl_certificate             cert/ssl.pem;
    ssl_certificate_key         cert/ssl.key;

    ssl_session_cache           shared:SSL:1m;
    ssl_session_timeout         5m;

    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers   on;

    location / {
        # 轉(zhuǎn)發(fā)請(qǐng)求給 Gunicorn
        proxy_pass      http://127.0.0.1:8000;
        proxy_redirect  off;
        
        # 為了能正常運(yùn)行,重寫(xiě)請(qǐng)求頭
        proxy_set_header    Host                $host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
    }
    
    # 處理靜態(tài)文件夾中的靜態(tài)文件
    location /static {
        alias   /home/admin/FlaskApp/static/;
        
        # 設(shè)置靜態(tài)文件緩存過(guò)期時(shí)間為 30 天
        expires  30d;
    }
}

測(cè)試配置正確性:

$ sudo nginx -t

如果出現(xiàn)的提示中沒(méi)有報(bào)錯(cuò),則可以啟動(dòng) nginx 了。

啟動(dòng) nginx :

$ sudo nginx

現(xiàn)在,你可以使用 Gunicorn 不指定 --bind 參數(shù)運(yùn)行 Flask 程序,然后嘗試從外網(wǎng)通過(guò) HTTPS 訪問(wèn),判斷 nginx 反向代理是否設(shè)置成功。

使用 nginx 命令管理 Nginx :

$ sudo nginx            # 啟動(dòng) Nginx 服務(wù)
$ sudo nginx -s stop    # 關(guān)閉 Nginx 服務(wù)
$ sudo nginx -s reload  # 重載 Nginx 服務(wù)
$ sudo nginx -s reopen  # 重啟 Nginx 服務(wù)
$ sudo nginx -s quit    # 退出 Nginx 服務(wù)

使用 service 命令管理 Nginx 服務(wù):

$ sudo service nginx start          # 啟動(dòng) Nginx 服務(wù)
$ sudo service nginx stop           # 停止 Nginx 服務(wù)
$ sudo service nginx restart        # 重啟 Nginx 服務(wù)
$ sudo service nginx status         # 查看 Nginx 服務(wù)狀態(tài)

使用 systemctl 命令管理 Nginx 服務(wù):

$ sudo systemctl start nginx   # 啟動(dòng) Nginx 服務(wù)
$ sudo systemctl stop nginx    # 停止 Nginx 服務(wù)
$ sudo systemctl restart nginx # 重啟 Nginx 服務(wù)
$ sudo systemctl status nginx  # 查看 Nginx 服務(wù)狀態(tài)
$ sudo systemctl enable nginx  # 設(shè)置 Nginx 服務(wù)開(kāi)機(jī)自啟動(dòng)
$ sudo systemctl disable nginx # 關(guān)閉 Nginx 服務(wù)開(kāi)機(jī)自啟動(dòng)

如果 Nginx 已經(jīng)啟動(dòng)卻又被啟動(dòng)了一次,可能會(huì)報(bào)錯(cuò)。比如:找不到 nginx.pid 文件、提示 XX 端口已經(jīng)被使用等等...,解決辦法如下:

# 殺掉占用 80 端口的進(jìn)程
$ sudo fuser -k 80/tcp

# 殺掉占用 443 端口的進(jìn)程
$ sudo fuser -k 443/tcp

# 使用默認(rèn)配置文件重新啟動(dòng) Nginx
$ sudo nginx -c /etc/nginx/nginx.conf

10. 使用 Supervisor 管理進(jìn)程

Supervisor 是用 Python 開(kāi)發(fā)的一套通用的進(jìn)程管理程序,能將一個(gè)普通的命令行進(jìn)程變?yōu)楹笈_(tái) daemon ,并監(jiān)控進(jìn)程狀態(tài),異常退出時(shí)能自動(dòng)重啟。它是通過(guò) fork/exec 的方式把這些被管理的進(jìn)程當(dāng)作 Supervisor 的子進(jìn)程來(lái)啟動(dòng),這樣只要在 Supervisor 的配置文件中把要管理的進(jìn)程的可執(zhí)行文件的路徑寫(xiě)進(jìn)去即可。也實(shí)現(xiàn)當(dāng)子進(jìn)程掛掉的時(shí)候,父進(jìn)程可以準(zhǔn)確獲取子進(jìn)程掛掉的信息的,可以選擇是否自己?jiǎn)?dòng)和報(bào)警。Supervisor 還提供了一個(gè)功能,可以為 supervisord 或者每個(gè)子進(jìn)程設(shè)置一個(gè)非 root 的用戶(hù),這個(gè)用戶(hù)就可以管理它對(duì)應(yīng)的進(jìn)程。

安裝 Supervisor :

$ sudo yum install supervisor

檢查 Supervisor 配置文件:

$ vim /etc/supervisord.conf

找到最后一行,檢查是否是如下內(nèi)容:

[include]
files = supervisord.d/*.ini

如果不是,則修改文件使其跟上面內(nèi)容一致。

進(jìn)入 /etc/supervisord.d/ 目錄, 為項(xiàng)目創(chuàng)建一個(gè) Supervisor 配置文件:

$ cd /etc/supervisord.d/
$ vi FlaskApp.ini

配置文件內(nèi)容為:

[program:app]
; 下面命令中的 app:app 請(qǐng)修改為你實(shí)際部署時(shí)的項(xiàng)目名稱(chēng)
command=pipenv run gunicorn -w 4 app:app

; 下面的路徑請(qǐng)修改為你創(chuàng)建的項(xiàng)目的根目錄
directory=/home/admin/FlaskApp

autostart=true
autorestart=true
stopsignal=QUIT
stopasgroup=true
killasgroup=true

; 下面的用戶(hù)請(qǐng)修改為創(chuàng)建該項(xiàng)目的用戶(hù)
user=admin

redirect_stderr=true

; log 文件的路徑你可以重新自定義
stdout_logfile=/home/admin/FlaskApp/log/supervisor.log

; 解決編碼問(wèn)題
[supervisord]
environment=LC_ALL="en_US.UTF-8",LANG="en_US.UTF-8"

啟動(dòng) Supervisor :

$ supervisord -c /etc/supervisord.conf

使用 service 命令管理 Supervisor 服務(wù):

$ sudo service supervisord start          # 啟動(dòng) Supervisor 服務(wù)
$ sudo service supervisord stop           # 停止 Supervisor 服務(wù)
$ sudo service supervisord restart        # 重啟 Supervisor 服務(wù)
$ sudo service supervisord status         # 查看 Supervisor 服務(wù)狀態(tài)

使用 systemctl 命令管理 Supervisor 服務(wù):

$ sudo systemctl start supervisord   # 啟動(dòng) Supervisor 服務(wù)
$ sudo systemctl stop supervisord    # 停止 Supervisor 服務(wù)
$ sudo systemctl restart supervisord # 重啟 Supervisor 服務(wù)
$ sudo systemctl status supervisord  # 查看 Supervisor 服務(wù)狀態(tài)
$ sudo systemctl enable supervisord  # 設(shè)置 Supervisor 服務(wù)開(kāi)機(jī)自啟動(dòng)
$ sudo systemctl disable supervisord # 關(guān)閉 Supervisor 服務(wù)開(kāi)機(jī)自啟動(dòng)

進(jìn)入 Supervisor 控制臺(tái),管理后臺(tái)進(jìn)程:

$ sudo supervisorctl
app                              RUNNING   pid 2696, uptime 23:46:00
supervisor > help # 輸入 help 命令,查看 supervisor 支持的命令

default commands (type help ):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

使用 status 命令,查看正在運(yùn)行的后臺(tái)進(jìn)程:

supervisor> status
app                              RUNNING   pid 2696, uptime 23:49:37

使用 stop 命令,結(jié)束指定的進(jìn)程:

supervisor> stop app
app: stopped

使用 start 命令,啟動(dòng)指定的進(jìn)程:

supervisor> start app
app: started

測(cè)試,你可以先使用 Supervisor 運(yùn)行進(jìn)程,再通過(guò)外網(wǎng)訪問(wèn)頁(yè)面,檢查是否正常訪問(wèn);再結(jié)束進(jìn)程,看看頁(yè)面是否顯示 502 Bad Gateway

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/43155.html

相關(guān)文章

  • supervisor使用部署說(shuō)明

    摘要:創(chuàng)建文件,加入的進(jìn)程管理中,實(shí)現(xiàn)服務(wù)器后臺(tái)運(yùn)行是在中的進(jìn)程名,隨便取啥上述代碼為使用運(yùn)行。 suopervisor 一、安裝supervisor安裝 注:以下所有操作在CentOS7中進(jìn)行 1.安裝CentOS7擴(kuò)展軟件倉(cāng)庫(kù) sudo yum install -y epel-release 2.安裝supervisor yum install -y supervisor 3.查看安...

    Miracle_lihb 評(píng)論0 收藏0
  • 如何在 virtualenv 環(huán)境搭建 Python Web

    摘要:生產(chǎn)環(huán)境下,自帶的服務(wù)器,無(wú)法滿(mǎn)足性能要求。配置前面我們已經(jīng)在系統(tǒng)環(huán)境下安裝了安裝好的二進(jìn)制文件放在文件夾下,接下來(lái)使用來(lái)管理。參考文章探針安裝部署部署筆記在生產(chǎn)環(huán)境上部署使用詳解本文系工程師編譯整理。 由于字?jǐn)?shù)的限制,其實(shí)本篇文章的全標(biāo)題為 《如何在 virtualenv 環(huán)境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web》...

    roland_reed 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<