CentOS 部署 flask項(xiàng)目

最近在學(xué)習(xí) python,使用 flask 實(shí)現(xiàn)了個(gè)個(gè)人博客程序壕翩,完了想部署到服務(wù)器上涂乌。因?yàn)槭切率忠照唬宦房目慕O絆最終把它基本搞定。網(wǎng)上資料對(duì)新手感覺(jué)都不太友好湾盒,都是零零碎碎的湿右,所以我整理了一下,一方面作為我自己的記錄罚勾,方便以后查閱毅人,另一方面也希望能幫助到跟我一樣的新手吭狡。

前提

  1. 有一個(gè)服務(wù)器(不然搞毛),購(gòu)買可以參考優(yōu)質(zhì)國(guó)外vps推薦

  2. 有個(gè)人域名(當(dāng)然丈莺,你可以直接使用 IP訪問(wèn)划煮,但有點(diǎn)奇怪不是?購(gòu)買域名可以去GoDaddy

1.安裝git

可以選擇 github 或者Bitbucket场刑,當(dāng)然你也可以自己搭建 git服務(wù)器般此,但我覺(jué)得沒(méi)啥必要,我選擇Bitbucket牵现,主要是因?yàn)樗接袔?kù)免費(fèi)

sudo yum install git

后續(xù)就跟我們本地開(kāi)發(fā)沒(méi)什么區(qū)別了铐懊,配置 ssh key,clone代碼瞎疼,就不展開(kāi)了科乎,項(xiàng)目目錄建議放在 /home/www/

2. 安裝 Mysql

添加 MySQL YUM 源

$wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'
$sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
$yum repolist all | grep mysql

mysql-connectors-community/x86_64 MySQL Connectors Community                  36
mysql-tools-community/x86_64      MySQL Tools Community                       47
mysql57-community/x86_64          MySQL 5.7 Community Server                 187

安裝最新版本

$sudo yum install mysql-community-server

啟動(dòng) MySQL 服務(wù)

$sudo service mysqld start 
$sudo systemctl start mysqld #CentOS 7
$sudo systemctl status mysqld
● mysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-05-27 12:56:26 CST; 15s ago
  Process: 2482 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 2421 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 2481 (mysqld_safe)
   CGroup: /system.slice/mysqld.service
           ├─2481 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─2647 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/...

說(shuō)明已經(jīng)正在運(yùn)行中了

修改密碼

$ mysql -uroot -p 

這里有要求你輸入密碼,Mysql安裝時(shí)會(huì)生成一個(gè)默認(rèn)密碼贼急,使用 grep "temporary password" /var/log/mysqld.log命令茅茂,返回結(jié)果最后引號(hào)后面的字符串就是root的默認(rèn)密碼

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';

修改編碼

在 /etc/my.cnf 中設(shè)置默認(rèn)的編碼

[client]

default-character-set = utf8

[mysqld]

default-storage-engine = INNODB

character-set-server = utf8

collation-server = utf8_general_ci #不區(qū)分大小寫

collation-server = utf8_bin #區(qū)分大小寫

collation-server = utf8_unicode_ci #比 utf8_general_ci 更準(zhǔn)確

創(chuàng)建數(shù)據(jù)庫(kù)

mysql> CREATE DATABASE <datebasename> CHARACTER SET utf8;

3. 安裝python3 pip3

CentOS 7 默認(rèn)安裝了 Python 2,當(dāng)需要使用 Python 3 的時(shí)候太抓,可以手動(dòng)下載 Python 源碼后編譯安裝空闲。

安裝 Python 3

sudo mkdir /usr/local/python3 # 創(chuàng)建安裝目錄
$ wget --no-check-certificate https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz # 下載 Python 源文件 
# 注意:wget獲取https的時(shí)候要加上:--no-check-certifica
$ tar -xzvf Python-3.6.2.tgz # 解壓縮包
$ cd Python-3.6.2 # 進(jìn)入解壓目錄
sudo ./configure --prefix=/usr/local/python3 # 指定創(chuàng)建的目錄
sudo make
sudo make install # 編譯安裝

執(zhí)行./configure時(shí)可能會(huì)報(bào)錯(cuò),configure: error: no acceptable C compiler found in $PATH走敌,這是因?yàn)槲窗惭b合適的編譯器碴倾,安裝下就好了,

sudo yum install gcc-c++
(使用sudo yum install gcc-c++時(shí)會(huì)自動(dòng)安裝/升級(jí)gcc及其他依賴的包掉丽。)

配置兩個(gè)版本共存

創(chuàng)建 python3 的軟鏈接:

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

這樣就可以通過(guò) python 命令使用 Python 2跌榔,python3 來(lái)使用 Python 3。

安裝 pip

$ sudo yum -y install epel-release # 首先安裝 epel 擴(kuò)展源
$ sudo yum -y install python-pip # 安裝 python-pip
$ sudo yum clean all # 清除 cache

通過(guò)這種方式貌似只能安裝 pip2捶障,想要安裝 Python 3 的 pip僧须,可以通過(guò)以下的源代碼安裝方式。

# 下載源代碼
$ wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz

$ tar -zvxf 9.0.1.tar.gz    # 解壓文件

$ cd pip-9.0.1

$ python3 setup.py install # 使用 Python 3 安裝

創(chuàng)建鏈接:

$ sudo ln -s /usr/local/python3/bin/pip /usr/bin/pip3

升級(jí) pip

$ pip install --upgrade pip

4. 安裝 gunicorn

Gunicorn (獨(dú)角獸)是一個(gè)高效的Python WSGI Server,通常用它來(lái)運(yùn)行 wsgi application(由我們自己編寫遵循WSGI application的編寫規(guī)范) 或者 wsgi framework(如Django,Paster),地位相當(dāng)于Java中的Tomcat项炼。
WSGI就是這樣的一個(gè)協(xié)議:它是一個(gè)Python程序和用戶請(qǐng)求之間的接口担平。WSGI服務(wù)器的作用就是接受并分析用戶的請(qǐng)求,調(diào)用相應(yīng)的python對(duì)象完成對(duì)請(qǐng)求的處理锭部,然后返回相應(yīng)的結(jié)果暂论。
簡(jiǎn)單來(lái)說(shuō)gunicorn封裝了HTTP的底層實(shí)現(xiàn),我們通過(guò)gunicorn啟動(dòng)服務(wù)空免,用戶請(qǐng)求與服務(wù)相應(yīng)都經(jīng)過(guò)gunicorn傳輸

創(chuàng)建虛擬環(huán)境

cd /home/www/blog
mkdir venv
python3 -m venv venv

激活虛擬環(huán)境:

source venv/bin/activate

然后根據(jù)requirements.txt文件安裝依賴包:

pip3 install -r requirements.txt

安裝gunicorn

pip3 install gunicorn

在項(xiàng)目根目錄創(chuàng)建一個(gè)wsgi.py文件

from app import create_app

application = create_app('production')

if __name__ == '__main__':
    application.run()

不再通過(guò)manage.py啟動(dòng)服務(wù),那只在開(kāi)發(fā)的時(shí)候使用

啟動(dòng)服務(wù):

gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application

5. 安裝 Nginx

nginx 是一個(gè)高性能的web服務(wù)器盆耽。通常用來(lái)在前端做反向代理服務(wù)器蹋砚。所謂正向與反向(reverse)扼菠,只是英文說(shuō)法翻譯。代理服務(wù)坝咐,簡(jiǎn)而言之循榆,一個(gè)請(qǐng)求經(jīng)過(guò)代理服務(wù)器從局域網(wǎng)發(fā)出,然后到達(dá)互聯(lián)網(wǎng)上服務(wù)器墨坚,這個(gè)過(guò)程的代理為正向代理秧饮。如果一個(gè)請(qǐng)求,從互聯(lián)網(wǎng)過(guò)來(lái)泽篮,先進(jìn)入代理服務(wù)器盗尸,再由代理服務(wù)器轉(zhuǎn)發(fā)給局域網(wǎng)的目標(biāo)服務(wù)器,這個(gè)時(shí)候帽撑,代理服務(wù)器為反向代理(相對(duì)正向而言)泼各。

正向代理:{ 客戶端 ---》 代理服務(wù)器 } ---》 服務(wù)器

反向代理:客戶端 ---》 { 代理服務(wù)器 ---》 服務(wù)器 }

{} 表示局域網(wǎng)

nginx既可以做正向,也可以做反向亏拉。

$ yum -y install nginx

啟動(dòng) nginx 服務(wù)

$ service nginx start

停止 nginx 服務(wù)

$ service nginx stop

重啟 nginx 服務(wù)

$ service nginx restart

平滑重啟

nginx配置改動(dòng)了扣蜻,可以重新加載而不用先關(guān)閉再打開(kāi)

$ nginx -s reload

啟動(dòng)后 ,在瀏覽器中 輸入服務(wù)器的 ip 地址及塘,就可以看到

1324702136-57fb16aa00d21_articlex.png

到這里 yum 安裝 nginx 就完成了

添加配置

nginx的配置文件為:/etc/nginx/nginx.conf

server {
        listen 80;
        server_name adisonhyh.com;

        location / {
                proxy_pass http://127.0.0.1:8000;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
  • 監(jiān)聽(tīng)http默認(rèn)的端口號(hào)80
  • server_name:個(gè)人網(wǎng)站域名
  • 把請(qǐng)求代理到本機(jī)的8000端口(gunicorn啟動(dòng)服務(wù)指定的端口)
    剩下proxy_set_header照抄

gunicorn和nginx關(guān)系:

gunicorn 可以單獨(dú)提供服務(wù)莽使,但生產(chǎn)環(huán)境一般不這樣做。首先靜態(tài)資源(jscssimg)會(huì)占用不少的請(qǐng)求資源笙僚,而對(duì)于 gunicorn 來(lái)講它本身更應(yīng)該關(guān)注實(shí)際業(yè)務(wù)的請(qǐng)求與處理而不應(yīng)該把資源浪費(fèi)在靜態(tài)資源請(qǐng)求上芳肌;此外,單獨(dú)運(yùn)行 gunicorn 是沒(méi)有辦法起多個(gè)進(jìn)程多個(gè)端口來(lái)負(fù)載均衡的味咳。

nginx 的作用就是彌補(bǔ)以上問(wèn)題庇勃,首先作為前端服務(wù)器它可以處理一切靜態(tài)文件請(qǐng)求,此時(shí) gunicorn 作為后端服務(wù)器槽驶,nginx 將會(huì)把動(dòng)態(tài)請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器责嚷,因此我們可以起多個(gè) gunicorn 進(jìn)程,然后讓 nginx 作均衡負(fù)載轉(zhuǎn)發(fā)請(qǐng)求給多個(gè) gunicorn 進(jìn)程從而提升服務(wù)器處理效率與處理能力掂铐。最后罕拂,nginx 還可以配置很多安全相關(guān)、認(rèn)證相關(guān)等很多處理全陨,可以讓你的網(wǎng)站更專注業(yè)務(wù)的編寫爆班,把一些轉(zhuǎn)發(fā)規(guī)則等其它業(yè)務(wù)無(wú)關(guān)的事情交給 nginx 做。

配置好后打開(kāi)本地瀏覽器辱姨,輸入域名柿菩,應(yīng)該就能訪問(wèn)了。

6.supervisor

如果你需要進(jìn)程一直執(zhí)行雨涛,若該進(jìn)程因各種原因中斷枢舶,也會(huì)自動(dòng)重啟的話懦胞,supervisor是一個(gè)很好的選擇。
supervisor管理進(jìn)程凉泄,是通過(guò)fork/exec的方式將這些被管理的進(jìn)程當(dāng)作supervisor的子進(jìn)程來(lái)啟動(dòng)躏尉,所以我們只需要將要管理進(jìn)程的可執(zhí)行文件的路徑添加到supervisor的配置文件中就好了。此時(shí)被管理進(jìn)程被視為supervisor的子進(jìn)程后众,若該子進(jìn)程異常終端胀糜,則父進(jìn)程可以準(zhǔn)確的獲取子進(jìn)程異常終端的信息,通過(guò)在配置文件中設(shè)置autostart=true蒂誉,可以實(shí)現(xiàn)對(duì)異常中斷的子進(jìn)程的自動(dòng)重啟教藻。

安裝 supervisor

$ pip install supervisor
$ echo_supervisord_conf > supervisor.conf   # 生成 supervisor 默認(rèn)配置文件
$ vim supervisor.conf                       # 修改 supervisor 配置文件,添加 gunicorn 進(jìn)程管理

在blog supervisor.conf 配置文件底部添加 (注意我的工作路徑是www/home/blog/)

[program:blog]
command=/home/www/blog/venv/bin/gunicorn -w4 -b0.0.0.0:8000 wsgi:application    ;supervisor啟動(dòng)命令
directory=/home/www/blog                                                 ; 項(xiàng)目的文件夾路徑
startsecs=0                                                               ; 啟動(dòng)時(shí)間
stopwaitsecs=0                                                            ; 終止等待時(shí)間
autostart=false                                                           ; 是否自動(dòng)啟動(dòng)
autorestart=false                                                         ; 是否自動(dòng)重啟
stdout_logfile=/home/www/blog/logs/gunicorn.log                            ; log 日志
stderr_logfile=/home/www/blog/logs/gunicorn.err                            ; 錯(cuò)誤日志

使用 supervsior 啟動(dòng) gunicorn

$ sudo supervisord -c supervisor.conf  
$ sudo supervisorctl start blog

在瀏覽器地址欄輸入配置的地址即可訪問(wèn)網(wǎng)站拗盒。

7. fabric

最后一步怖竭,我們使用fabric實(shí)現(xiàn)遠(yuǎn)程操作和部署。Fabric 是一個(gè) Python 下類似于 Makefiles 的工具陡蝇,但是能夠在遠(yuǎn)程服務(wù)器上執(zhí)行命令痊臭。

安裝 fabric

pip install fabric

在 blog 目錄下新建一個(gè)fabfile.py文件

import os
from fabric.api import local, env, run, cd, sudo, prefix, settings, execute, task, put
from fabric.contrib.files import exists
from contextlib import contextmanager

env.hosts = ['204.152.201.69']
env.user = 'root'
env.password = '****'#密碼
env.group = "root"

DEPLOY_DIR = '/home/www/blog'
VENV_DIR = os.path.join(DEPLOY_DIR, 'venv')
VENV_PATH = os.path.join(VENV_DIR, 'bin/activate')


@contextmanager
def source_virtualenv():
    with prefix("source {}".format(VENV_PATH)):
        yield


def update():
    with cd('/home/www/blog/'):
        sudo('git pull')


def restart():
    with cd(DEPLOY_DIR):
        if not exists(VENV_DIR):
            run("virtualenv {}".format(VENV_DIR))
        with settings(warn_only=True):
            with source_virtualenv():
                run("pip install -r {}/requirements.txt".format(DEPLOY_DIR))
                with settings(warn_only=True):
                    stop_result = sudo("supervisorctl -c {}/supervisor.conf stop all".format(DEPLOY_DIR))
                    if not stop_result.failed:
                        kill_result = sudo("pkill supervisor")
                        if not kill_result:
                            sudo("supervisord -c {}/supervisor.conf".format(DEPLOY_DIR))
                            sudo("supervisorctl -c {}/supervisor.conf reload".format(DEPLOY_DIR))
                            sudo("supervisorctl -c {}/supervisor.conf status".format(DEPLOY_DIR))
                            sudo("supervisorctl -c {}/supervisor.conf start all".format(DEPLOY_DIR))


@task
def deploy():
    execute(update)
    execute(restart)

現(xiàn)在代碼如果更新了,可以直接在本地執(zhí)行遠(yuǎn)程部署了

fab deploy
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末登夫,一起剝皮案震驚了整個(gè)濱河市广匙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恼策,老刑警劉巖鸦致,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涣楷,居然都是意外死亡分唾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門狮斗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绽乔,“玉大人,你說(shuō)我怎么就攤上這事碳褒≌墼遥” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵沙峻,是天一觀的道長(zhǎng)睦授。 經(jīng)常有香客問(wèn)我,道長(zhǎng)摔寨,這世上最難降的妖魔是什么去枷? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上删顶,老公的妹妹穿的比我還像新娘疗隶。我一直安慰自己,他們只是感情好翼闹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蒋纬,像睡著了一般猎荠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜀备,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天关摇,我揣著相機(jī)與錄音,去河邊找鬼碾阁。 笑死输虱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脂凶。 我是一名探鬼主播宪睹,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚕钦!你這毒婦竟也來(lái)了亭病?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嘶居,失蹤者是張志新(化名)和其女友劉穎罪帖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體邮屁,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡整袁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佑吝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坐昙。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迹蛤,靈堂內(nèi)的尸體忽然破棺而出民珍,到底是詐尸還是另有隱情,我是刑警寧澤盗飒,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布嚷量,位于F島的核電站,受9級(jí)特大地震影響逆趣,放射性物質(zhì)發(fā)生泄漏蝶溶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抖所。 院中可真熱鬧梨州,春花似錦、人聲如沸田轧。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)傻粘。三九已至每窖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弦悉,已是汗流浹背窒典。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稽莉,地道東北人瀑志。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像污秆,于是被迫代替她去往敵國(guó)和親劈猪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容