摘要:根據(jù)中華人民共和國信息產(chǎn)業(yè)部第十二次部務(wù)會議審議通過的非經(jīng)營性互聯(lián)網(wǎng)信息服務(wù)備案管理辦法精神,在中華人民共和國境內(nèi)提供非經(jīng)營性互聯(lián)網(wǎng)信息服務(wù),應(yīng)當辦理備案。未經(jīng)備案,不得在中華人民共和國境內(nèi)從事非經(jīng)營性互聯(lián)網(wǎng)信息服務(wù)。
當我們開發(fā)了一個簡單的 Flask 程序,想把項目部署上線,我們可以選擇傳統(tǒng)的部署方式或者云部署方式把項目部署上線。在本文中,筆者將使用 阿里云輕量應(yīng)用服務(wù)器 安裝 CentOS 7 系統(tǒng)部署一個簡單的 Flask 項目。1. 購買域名、服務(wù)器、SSL 證書
要部署一個網(wǎng)站,首先要做的就是購買域名和服務(wù)器,市面上主要有阿里云、騰訊云、亞馬遜云等云服務(wù)器供應(yīng)商,你可以自由選擇。除了域名和服務(wù)器外,還需要申請 SSL 證書,為開啟 HTTPS 訪問做準備。
1.1 域名對于還從未購買過域名的用戶,推薦使用阿里云和騰訊云購買域名,可以享受一元首購優(yōu)惠。
阿里云 域名1元購專題
騰訊云 特價域名1元起,免費送SSL證書
1.2 服務(wù)器阿里云和騰訊云針對有專門針對學(xué)生的學(xué)生機,價格非常實惠。其中阿里云是只要你的年齡 24 歲以下自動認定為大學(xué)生,可以嘗試一下。
阿里云 云翼計劃2018
騰訊云 云+校園
1.3 SSL 證書SSL證書是數(shù)字證書的一種,類似于駕駛證、護照和營業(yè)執(zhí)照的電子副本。因為配置在服務(wù)器上,也稱為SSL服務(wù)器證書。SSL 證書就是遵守 SSL 協(xié)議,由受信任的數(shù)字證書頒發(fā)機構(gòu) CA ,在驗證服務(wù)器身份后頒發(fā),具有服務(wù)器身份驗證和數(shù)據(jù)傳輸加密功能。
阿里云和騰訊云控制臺都提供了 SSL 證書購買的功能,對于需要付費的 SSL 證書,你可以直接挑選一個價格合適的然后付錢即可。如果想申請免費的 SSL 證書,可以直接參考下方鏈接:
阿里云 阿里云申請免費SSL證書實現(xiàn)網(wǎng)站HTTPS化
騰訊云 手把手教你申請騰訊云免費SSL證書
2. 網(wǎng)站備案備案是指向主管機關(guān)報告事由存案以備查考。行政法角度看備案,實踐中主要是《立法法》和《法規(guī)規(guī)章備案條例》的規(guī)定。根據(jù)中華人民共和國信息產(chǎn)業(yè)部第十二次部務(wù)會議審議通過的《非經(jīng)營性互聯(lián)網(wǎng)信息服務(wù)備案管理辦法》精神,在中華人民共和國境內(nèi)提供非經(jīng)營性互聯(lián)網(wǎng)信息服務(wù),應(yīng)當辦理備案。未經(jīng)備案,不得在中華人民共和國境內(nèi)從事非經(jīng)營性互聯(lián)網(wǎng)信息服務(wù)。而對于沒有備案的網(wǎng)站將予以罰款和關(guān)閉。
簡單來說,購買了服務(wù)器之后,如果希望通過域名能正常訪問到您的網(wǎng)站,就需要進行網(wǎng)站備案。
阿里云網(wǎng)站備案 幫助文檔
騰訊云網(wǎng)站備案 幫助文檔
3. 網(wǎng)站域名解析這里僅以阿里云服務(wù)器控制臺為例,其它云服務(wù)器請參考官方說明文檔。
首先,選擇服務(wù)器控制臺中的 站點設(shè)置 > 域名 菜單;然后點擊 添加域名 按鈕,為你的域名同時添加 "www" 及 "@" 記錄。假設(shè)你購買的域名為 demo.com ,則同時添加的兩條記錄為:
"@" 記錄 :demo.com
"www" 記錄:www.demo.com
這兩個域名都能訪問到你的網(wǎng)站首頁。
4. SSH 遠程連接通過 SSH 遠程連接服務(wù)器實例,可以方便的對服務(wù)器進行管理。你可以手動輸入命令生成 SSH 密鑰連接服務(wù)器;也可以通過云服務(wù)器控制臺自動生成密鑰,然后導(dǎo)出密鑰到本地,再使用導(dǎo)出的密鑰連接服務(wù)器。這里推薦通過云服務(wù)器控制臺生成密鑰的方式。
相較于傳統(tǒng)的用戶名和密碼認證方式,使用 SSH 密鑰有以下優(yōu)勢:
SSH 密鑰登錄認證更為安全可靠,可以杜絕暴力破解威脅。
SSH 密鑰登錄方式更簡便,只需在控制臺和本地客戶端做簡單配置即可遠程登錄實例,再次登錄時無需再輸入密碼。
4.1 控制臺生成 SSH 密鑰方式(推薦)阿里云 用戶指南:遠程連接到Linux操作系統(tǒng)實例
騰訊云 操作指南:登錄 Linux 實例
4.2 手動生成 SSH 密鑰方式在客戶端的 Shell 中執(zhí)行下面命令生成 SSH 密鑰對:
$ ssh-keygen -t rsa -b 4096 -C "[email protected]"
在客戶端的 Shell 中執(zhí)行下面命令授予 .ssh 文件夾 600 權(quán)限:
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorizes_keys
在客戶端的 Shell 中執(zhí)行下面命令將客戶端私鑰拷貝到服務(wù)器:
# 執(zhí)行下面的命令會被要求輸入服務(wù)器對應(yīng)用戶的密碼,密碼輸入正確才能成功完成拷貝 # 記得將下面命令中的 [email protected] 替換成你自己的服務(wù)器的 SSH 地址 $ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
在客戶端的 Shell 中執(zhí)行下面命令,進行 SSH 免密碼登陸測試:
$ ssh [email protected]
在客戶端的 ~/.bashrc 文件中為遠程連接的命令取個別名,以后就可以方便的進行登陸了:
$ vim ~/.bashrc
在文件中找到下面這一行:
# some more ls aliases
在該行代碼下面再添加一行并保存,內(nèi)容如下:
alias ecs="ssh [email protected]"
在客戶端的 Shell 中執(zhí)行下面命令,使剛剛修改文件生效:
$ source ~/.bashrc
在客戶端的 Shell 中執(zhí)行下面命令,查看你已經(jīng)設(shè)置的別名:
$ alias5. 使用 MySQL 8 數(shù)據(jù)庫
MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。
5.1 安裝與初始化
在 Download MySQL Yum Repository 頁面獲取 MySQL 8 Community Yum 倉庫文件的鏈接,例如:
https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpm
通過 SSH 遠程連接服務(wù)器實例,執(zhí)行下面命令切換到其它擁有 root 權(quán)限的用戶,阿里云服務(wù)器實例默認有一個擁有 root 權(quán)限的 admin 用戶,這里以切換到 admin 用戶為例子:
$ su admin
執(zhí)行下面命令,下載 MySQL 8 Community Yum 倉庫文件:
$ wget https://repo.mysql.com//mysql80-community-release-el7-2.noarch.rpm
執(zhí)行下面命令,安裝 MySQL 8 Community Yum 倉庫文件:
$ sudo yum localinstall mysql80-community-release-el7-2.noarch.rpm
執(zhí)行下面命令,檢查 MySQL 8 Community Yum 倉庫文件是否正確安裝 :
$ yum repolist enabled | grep "mysql.*-community.*"
執(zhí)行下面命令,安裝 MySQL 8 Community :
$ sudo yum install mysql-community-server
使用 service 命令管理 MySQL 服務(wù):
$ sudo service mysqld start # 啟動 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 # 啟動 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ù)開機自啟動 $ sudo systemctl disable mysqld # 關(guān)閉 MySQL 服務(wù)開機自啟動
首次啟動 MySQL 服務(wù),會自動初始化數(shù)據(jù)目錄、生成 SSL 證書和密鑰文件、創(chuàng)建超級用戶 " root"@"localhost" ,超級用戶的密碼被設(shè)置并存儲在錯誤日志文件中??梢允褂靡韵旅畈樵兣R時密碼:
$ sudo grep "temporary password" /var/log/mysqld.log
現(xiàn)在你可以用你查詢到的臨時密碼連接數(shù)據(jù)庫服務(wù)器了。
5.2 連接數(shù)據(jù)庫服務(wù)器
輸入以下命令,根據(jù)提示輸入上一步獲得的臨時密碼,連接數(shù)據(jù)庫服務(wù)器:
$ mysql -u root -p Enter password: (在這里輸入上一步查詢到的臨時密碼)
連接 MySQL 服務(wù)器后,在 MySQL 命令行中為 " root"@"localhost" 設(shè)置新密碼,使臨時密碼失效:
mysql> ALTER USER "root"@"localhost" IDENTIFIED BY "new_password";
新版 MySQL 的安全策略要求輸入的密碼要包含大寫字母、小寫字母、數(shù)字、特殊符號,推薦使用密碼管理工具生成隨機密碼來作為你的新密碼。
為了更加方便的遠程連接 MySQL 服務(wù)器,接下來需要允許 MySQL 的 root 賬戶在其它地址登陸:
mysql> USE mysql; mysql> UPDATE user SET host = "%" WHERE host = "root"; # 這里的 host = "%" 中的 % 表示允許在任意地址登陸,你也可以設(shè)置為指定的局域網(wǎng) IP、公網(wǎng) IP、域名等
接下來你就可以使用 DataGrip、Navicat 等數(shù)據(jù)庫管理工具方便的管理云服務(wù)器實例上的 MySQL 了。
6. 編譯安裝 Python 3Cent OS 預(yù)裝了一個 Python 2,并且系統(tǒng)很多組件都依賴于 Python 2 ,筆者在安裝和使用 Python 3 時就因為這些依賴情況遇到了很多問題,最后總結(jié)下來,正確的安裝和使用 Python 3 的過程如下:
遠程連接云服務(wù)器實例,在本示例中將使用 root 用戶通過編譯安裝方式全局安裝 Python 3,你也可以選擇多帶帶為某個用戶安裝 Python 3 ,步驟上大同小異,詳細編譯安裝文檔參考 Using Python on Unix platforms 。
使用 Yum 安裝編譯安裝 Python 3 時依賴的包:
$ 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 版本的安裝包,其它版本的請自行去 Download Python | Python.org 獲取鏈接:
$ wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
在當前用戶目錄解壓下載的 Python 安裝包:
$ tar -zxvf Python-3.6.7.tgz
進入已解壓的 Python 安裝文件根目錄:
$ cd Python-3.6.7
通過編譯配置指定 Python 的安裝位置:
$ ./configure --prefix=/usr/local/python3
使用 make 命令開始編譯安裝 Python:
$ make && make install
為了和系統(tǒng)自帶的 python 和 pip 命令區(qū)分開來,給剛剛安裝的 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
測試 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. >>>
測試 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 pip7. 使用 Pipenv 管理 Python 虛擬環(huán)境
Pipenv 是 Pipfile 主要倡導(dǎo)者、requests 作者 Kenneth Reitz 寫的一個命令行工具,主要包含了 Pipfile、pip、click、requests 和 virtualenv ,使用 Pipenv 可以方便的管理 Python 虛擬環(huán)境、管理依賴文件。Pipfile 和 Pipenv本來都是Kenneth Reitz 的個人項目,后來貢獻給了 pypa 組織。Pipfile 是社區(qū)擬定的依賴管理文件,用于替代過于簡陋的 requirements.txt 文件。
執(zhí)行下面命令,安裝 Pipenv :
$ pip3 install pipenv
執(zhí)行下面命令,為 Pipenv 可執(zhí)行文件設(shè)置軟鏈接,之后可以通過 pipenv 命令來使用 Pipenv :
$ ln -s /usr/local/python3/bin/pipenv /usr/bin/pipenv
切換到一個擁有 root 權(quán)限的用戶,這里以 admin 用戶為例:
$ su admin
在用戶目錄下為你的項目創(chuàng)建一個目錄,并進入項目目錄,項目名稱以 FlaskApp 為例:
$ cd ~ $ mkdir FlaskApp $ cd FlaskApp
執(zhí)行下面命令,為項目創(chuàng)建 Python 虛擬環(huán)境,默認將虛擬環(huán)境保存在 ~/.local/share/virtualenvs:
$ pipenv install
如果想把虛擬環(huán)境保存至項目根目錄,需要設(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
在項目根目錄編寫一個簡單的 Flask Demo 進行測試:
# 新建并打開一個名為 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 命令可以運行編寫的代碼:
$ pipenv run flask run
也可以使用 pipenv shell 命令進入虛擬環(huán)境,然后再在虛擬環(huán)境執(zhí)行 flask run 命令運行程序:
$ pipenv shell (venv)$ flask run
Flask 默認運行的地址和端口為 http://127.0.0.1:5000 ,云服務(wù)器實例不包含桌面環(huán)境的話,你很難去瀏覽這個頁面。你可以設(shè)置 flask 運行的地址和端口,然后嘗試從外網(wǎng)訪問該頁面。先執(zhí)行下面命令,讓 flask 允許外網(wǎng)訪問,并且監(jiān)聽 80 端口:
$ pipenv run flask run --host 0.0.0.0 --port 80
然后你可以通過你的服務(wù)器公網(wǎng) IP 或 域名 直接訪問到該頁面。
8. 使用 Gunicorn 運行程序flask run 命令啟動的開發(fā)服務(wù)器是由 Werkzeug 提供的。細分的話, Werkzeug 提供的這個開發(fā)服務(wù)器應(yīng)該被稱為 WSGI 服務(wù)器,而不是單純意義上的 Web 服務(wù)器。在生產(chǎn)環(huán)境中,我們需要一個更強健、性能更高的 WSGI 服務(wù)器。這些 WSGI 服務(wù)器也被稱為獨立 WSGI 容器,因為它們可以承載我們編寫的 WSGI 程序,然后處理 HTTP 請求和響應(yīng)。這通常有很多選擇,比如 Gunicorn 。 Gunicorn 是 Green Unicorn 的簡寫,意為綠色獨角獸,是一款專為 UNIX 設(shè)計的 Python WSGI HTTP 服務(wù)器。是一個Pre-fork 工人模型。Gunicorn 服務(wù)器廣泛兼容各種 web 框架,實現(xiàn)簡單,節(jié)省服務(wù)器資源,速度相當快。
安裝 Gunicorn :
$ pipenv install gunicorn
使用 Gunicorn 運行一個 WSGI 程序:
$ pipenv run gunicorn --workers=4 --bind=0.0.0.0:8000 app:app # --workers = 4 表示使用 4 worker 進程運行程序,建議 worker 數(shù)量為 ( CPU 核心數(shù) × 2 ) + 1 # Gunicorn 默認只允許從本地 8000 端口訪問,--bind=0.0.0.0:8000 表示允許使用 8000 端口從外部訪問 # app:app 冒號前面的 app 表示 app.py 文件,冒號后面的 app 表示 flask 程序的名稱
也可以把 --workers 簡寫為 -w 、--bind 簡寫為 -b ,如下:
# 沒有 -b 或者 --bind 參數(shù),默認監(jiān)聽 127.0.0.1:8000 $ pipenv run gunicorn -w 4 app:app # 指定 -b 0.0.0.0:8000 監(jiān)聽 8000 端口的外部請求 $ pipenv run gunicorn -w 4 -b 0.0.0.0:8000 app:app9. 使用 Nginx 提供反向代理
像 Gunicorn 這類 WSGI 服務(wù)器內(nèi)置的 Web 服務(wù)器還不夠強健,雖然程序可以正常運行,但是更流行的部署方式是使用一個常規(guī)的 Web 服務(wù)器運行在前端,為 WSGI 提供反向代理。比較流行的開源 Web 服務(wù)器有 Nginx 、Apache 等,這里選擇使用和 Gunicorn 集成良好的 Nginx 。
訪問 nginx packages 獲取對應(yīng)版本 Nginx 的 Yum 倉庫的鏈接,例如:
http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
下載 Nginx Yum 倉庫文件:
$ wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安裝 Nginx Yum 倉庫文件:
$ sudo yum localinstall nginx-release-centos-7-0.el7.ngx.noarch.rpm
安裝 Nginx :
$ sudo yum install nginx
進入 Nginx 配置文件目錄:
$ cd /etc/nginx/
創(chuàng)建 cert 目錄,并上傳你的 SSL 證書到該目錄:
$ mkdir cert
上傳 SSL 證書到 cert 目錄你可以使用 scp 命令,或者使用 FileZilla 等 SFTP 軟件,我上傳的文件如下:
$ cd cert $ ls ssl.key ssl.pem
進入 /etc/nginx/conf.d/ 目錄編輯默認的配置文件 default.conf:
$ cd /etc/nginx/conf.d/ $ vim default.conf
刪除文件中原有的全部內(nèi)容,新增下面內(nèi)容并保存:
# 監(jiān)聽 http 請求,強制跳轉(zhuǎn)到 https server { listen 80; # 這里的 your.domain.com 換成你購買的域名 server_name your.domain.com; # 這里的 your.domain.com 換成你購買的域名 return 301 https://your.domain.com$request_uri; } # 監(jiān)聽 https 請求 server { listen 443; # 這里的 your.domain.com 換成你購買的域名 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 換成你上傳的與其對應(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ā)請求給 Gunicorn proxy_pass http://127.0.0.1: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; proxy_set_header X-Forwarded-Proto $scheme; } # 處理靜態(tài)文件夾中的靜態(tài)文件 location /static { alias /home/admin/FlaskApp/static/; # 設(shè)置靜態(tài)文件緩存過期時間為 30 天 expires 30d; } }
測試配置正確性:
$ sudo nginx -t
如果出現(xiàn)的提示中沒有報錯,則可以啟動 nginx 了。
啟動 nginx :
$ sudo nginx
現(xiàn)在,你可以使用 Gunicorn 不指定 --bind 參數(shù)運行 Flask 程序,然后嘗試從外網(wǎng)通過 HTTPS 訪問,判斷 nginx 反向代理是否設(shè)置成功。
使用 nginx 命令管理 Nginx :
$ sudo nginx # 啟動 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 # 啟動 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 # 啟動 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ù)開機自啟動 $ sudo systemctl disable nginx # 關(guān)閉 Nginx 服務(wù)開機自啟動
如果 Nginx 已經(jīng)啟動卻又被啟動了一次,可能會報錯。比如:找不到 nginx.pid 文件、提示 XX 端口已經(jīng)被使用等等...,解決辦法如下:
# 殺掉占用 80 端口的進程 $ sudo fuser -k 80/tcp # 殺掉占用 443 端口的進程 $ sudo fuser -k 443/tcp # 使用默認配置文件重新啟動 Nginx $ sudo nginx -c /etc/nginx/nginx.conf10. 使用 Supervisor 管理進程
Supervisor 是用 Python 開發(fā)的一套通用的進程管理程序,能將一個普通的命令行進程變?yōu)楹笈_ daemon ,并監(jiān)控進程狀態(tài),異常退出時能自動重啟。它是通過 fork/exec 的方式把這些被管理的進程當作 Supervisor 的子進程來啟動,這樣只要在 Supervisor 的配置文件中把要管理的進程的可執(zhí)行文件的路徑寫進去即可。也實現(xiàn)當子進程掛掉的時候,父進程可以準確獲取子進程掛掉的信息的,可以選擇是否自己啟動和報警。Supervisor 還提供了一個功能,可以為 supervisord 或者每個子進程設(shè)置一個非 root 的用戶,這個用戶就可以管理它對應(yīng)的進程。
安裝 Supervisor :
$ sudo yum install supervisor
檢查 Supervisor 配置文件:
$ vim /etc/supervisord.conf
找到最后一行,檢查是否是如下內(nèi)容:
[include] files = supervisord.d/*.ini
如果不是,則修改文件使其跟上面內(nèi)容一致。
進入 /etc/supervisord.d/ 目錄, 為項目創(chuàng)建一個 Supervisor 配置文件:
$ cd /etc/supervisord.d/ $ vi FlaskApp.ini
配置文件內(nèi)容為:
[program:app] ; 下面命令中的 app:app 請修改為你實際部署時的項目名稱 command=pipenv run gunicorn -w 4 app:app ; 下面的路徑請修改為你創(chuàng)建的項目的根目錄 directory=/home/admin/FlaskApp autostart=true autorestart=true stopsignal=QUIT stopasgroup=true killasgroup=true ; 下面的用戶請修改為創(chuàng)建該項目的用戶 user=admin redirect_stderr=true ; log 文件的路徑你可以重新自定義 stdout_logfile=/home/admin/FlaskApp/log/supervisor.log ; 解決編碼問題 [supervisord] environment=LC_ALL="en_US.UTF-8",LANG="en_US.UTF-8"
啟動 Supervisor :
$ supervisord -c /etc/supervisord.conf
使用 service 命令管理 Supervisor 服務(wù):
$ sudo service supervisord start # 啟動 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 # 啟動 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ù)開機自啟動 $ sudo systemctl disable supervisord # 關(guān)閉 Supervisor 服務(wù)開機自啟動
進入 Supervisor 控制臺,管理后臺進程:
$ 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 命令,查看正在運行的后臺進程:
supervisor> status app RUNNING pid 2696, uptime 23:49:37
使用 stop 命令,結(jié)束指定的進程:
supervisor> stop app app: stopped
使用 start 命令,啟動指定的進程:
supervisor> start app app: started
測試,你可以先使用 Supervisor 運行進程,再通過外網(wǎng)訪問頁面,檢查是否正常訪問;再結(jié)束進程,看看頁面是否顯示 502 Bad Gateway 。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43155.html
摘要:創(chuàng)建文件,加入的進程管理中,實現(xiàn)服務(wù)器后臺運行是在中的進程名,隨便取啥上述代碼為使用運行。 suopervisor 一、安裝supervisor安裝 注:以下所有操作在CentOS7中進行 1.安裝CentOS7擴展軟件倉庫 sudo yum install -y epel-release 2.安裝supervisor yum install -y supervisor 3.查看安...
摘要:生產(chǎn)環(huán)境下,自帶的服務(wù)器,無法滿足性能要求。配置前面我們已經(jīng)在系統(tǒng)環(huán)境下安裝了安裝好的二進制文件放在文件夾下,接下來使用來管理。參考文章探針安裝部署部署筆記在生產(chǎn)環(huán)境上部署使用詳解本文系工程師編譯整理。 由于字數(shù)的限制,其實本篇文章的全標題為 《如何在 virtualenv 環(huán)境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web》...
閱讀 3737·2021-11-24 10:23
閱讀 2780·2021-09-06 15:02
閱讀 1284·2021-08-23 09:43
閱讀 2361·2019-08-30 15:44
閱讀 3058·2019-08-30 13:18
閱讀 794·2019-08-23 16:56
閱讀 1753·2019-08-23 16:10
閱讀 551·2019-08-23 15:08