十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹“CentOS如何部署flask項(xiàng)目”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“CentOS如何部署flask項(xiàng)目”文章能幫助大家解決問(wèn)題。
“只有客戶(hù)發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)建站的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線(xiàn),而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無(wú)止境。
前提
有一個(gè)服務(wù)器(不然搞毛),購(gòu)買(mǎi)可以參考優(yōu)質(zhì)國(guó)外vps推薦
有個(gè)人域名(當(dāng)然,你可以直接使用 ip訪(fǎng)問(wèn),但有點(diǎn)奇怪不是?購(gòu)買(mǎi)域名可以去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ū)分大小寫(xiě) collation-server = utf8_bin #區(qū)分大小寫(xiě) collation-server = utf8_unicode_ci #比 utf8_general_ci 更準(zhǔn)確
創(chuàng)建數(shù)據(jù)庫(kù)
mysql> create databasecharacter 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及其他依賴(lài)的包。)
配置兩個(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(由我們自己編寫(xiě)遵循wsgi application的編寫(xiě)規(guī)范) 或者 wsgi framework(如django,paster),地位相當(dāng)于java中的tomcat。 wsgi就是這樣的一個(gè)協(xié)議:它是一個(gè)python程序和用戶(hù)請(qǐng)求之間的接口。wsgi服務(wù)器的作用就是接受并分析用戶(hù)的請(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ù),用戶(hù)請(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 文件安裝依賴(lài)包:
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ì)正向而言)。
正向代理:{ 客戶(hù)端 ---》 代理服務(wù)器 } ---》 服務(wù)器
反向代理:客戶(hù)端 ---》 { 代理服務(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 地址,就可以看到
到這里 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)站更專(zhuān)注業(yè)務(wù)的編寫(xiě),把一些轉(zhuǎn)發(fā)規(guī)則等其它業(yè)務(wù)無(wú)關(guān)的事情交給 nginx 做。
配置好后打開(kāi)本地瀏覽器,輸入域名,應(yīng)該就能訪(fǎng)問(wèn)了。
6.supervisor
如果你需要進(jìn)程一直執(zhí)行,若該進(jìn)程因各種原因中斷,也會(huì)自動(dòng)重啟的話(huà),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
在瀏覽器地址欄輸入配置的地址即可訪(fǎng)問(wèn)網(wǎng)站。
7. fabric
最后一步,我們使用fabric實(shí)現(xiàn)遠(yuǎn)程操作和部署。fabric 是一個(gè) python 下類(lèi)似于 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
關(guān)于“CentOS如何部署flask項(xiàng)目”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。