在阿里云服務(wù)器上配置CentOS+Nginx+Python+Flask環(huán)境
項(xiàng)目運(yùn)行環(huán)境
阿里云(單核CPU, 1G內(nèi)存, Ubuntu 14.04 x64 帶寬1Mbps), 具體購(gòu)買(mǎi)和ssh連接阿里云本文不做描述。
實(shí)用工具
首先進(jìn)入阿里云后先要升級(jí)下apt-get, 并下載所需軟件
sudo apt-get update sudo apt-get install vim git wget tmux
我還會(huì)使用zsh和oh-my-zsh來(lái)替換bash
sudo apt-get install zsh # 終端下打以下命令 wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
替換bash為zsh
chsh -s /bin/zsh
重新連接阿里云就可以看到效果, 具體主題可以根據(jù)自己喜好更改主目錄下的.zshrc即可
安裝python相關(guān)模塊
使用python的pip包管理工具
sudo apt-get install python-setuptools sudo apt-get install python-pip sudo pip install python-virtualenv
在主目錄下創(chuàng)建文件夾code并把所有項(xiàng)目放進(jìn)這個(gè)目錄里
mkdir code # 使用virtualenv vritualenv venv # 開(kāi)啟virtualenv source /venv/bin/activate # 關(guān)閉virtualenv deactivate # 在開(kāi)啟virtualenv的狀態(tài)下使用pip會(huì)使用venv中的pip,也就是所有模塊都會(huì)安裝到venv中 # 如果想要安裝全局模塊就使用sudo pip # 安裝flask, 安裝到venv中 pip install flask # 兩個(gè)是不同的, 安裝到系統(tǒng)中 sudo pip install flask
使用Flask
現(xiàn)在我們已經(jīng)安裝了Flask, 現(xiàn)在我們寫(xiě)一個(gè)小的程序來(lái)運(yùn)行一下。
這里我們?cè)谝淮伟惭bflask的相關(guān)模塊,并把他們寫(xiě)入到requirements.txt這個(gè)文件中。
# 安裝flask的相關(guān)模塊 pip install -r requirements # 創(chuàng)建一個(gè)manage.py文件, 用作管理我們的應(yīng)用, 然后創(chuàng)建我們的一個(gè)應(yīng)用。 touch manage.py ## 創(chuàng)建一個(gè)叫bamboo的應(yīng)用 mkdir bamboo ## 創(chuàng)建一個(gè)應(yīng)用的文件, 接下來(lái)我們要編輯這個(gè)文件了。 touch bamboo/__init__.py bamboo/app.py
項(xiàng)目目錄結(jié)構(gòu)是這樣的
/root/code/ ├── bamboo │ ├── app.py │ ├── config.py │ ├── __init__.py │ ├── static │ ├── templates │ └── views ├── gunicorn.conf ├── logs │ ├── access.log │ ├── error.log │ ├── supervisord.log │ ├── supervisor_err.log │ └── supervisor_out.log ├── manage.py ├── requirements.txt ├── run.py ├── sweep.py └── venv
編輯bamboo/app.py和bamboo/views/main.py
## app.py from flask import Flask def create_app(): app = Flask(__name__) # do something register_blueprints(app) return app # 用來(lái)注冊(cè)視圖的路由 def register_blueprints(app): from bamboo.views import main, error for i in (main, error): app.register_blueprint(i.bp) ## main.py from flask import render_template, Blueprint bp = Blueprint('main', __name__) @bp.route('/') @bp.route('/index') def index(): return '<h1>Hello, Bamboo!</h1>'
安裝Gunicorn
Gunicorn是一個(gè)wsgi服務(wù)器, 我們將通過(guò)它來(lái)啟動(dòng)我們的web服務(wù)。
# 注意我們是通過(guò)pip來(lái)安裝,所以該模塊所有文件都是在venv里面 pip install gunicorn
可以進(jìn)入目錄vevn/bin下查看是否存在gunicorn命令
# 這里我們編輯下manage.py文件,具體文件路徑請(qǐng)查看上文中的目錄結(jié)構(gòu) ## manage.py from bamboo.app import create_app from flask.ext.script import Manager, Server, Shell app = create_app() manager = Manager(app) def make_shell_context(): # 用于shell使用 pass manager.add_command('shell', Shell(make_context=make_shell_context)) manager.add_command('runserver', Server( use_debugger=True, use_reloader=True, host='127.0.0.1', port=5000 )) if __name__ == '__main__': manager.run()
運(yùn)行一下manage.py
# 不適用gunicorn運(yùn)行 python manage.py runserver # 使用gunicorn 運(yùn)行 # 這里需要注意一下, 冒號(hào)前面的是文件名也就是manage.py而后面的是應(yīng)用的名稱(chēng)。我在這里載過(guò)跟頭。因?yàn)榉?wù)器需要接受一個(gè)wsgi的應(yīng)用而manager = Manager(app)不是一個(gè)wsgi應(yīng)用所以報(bào)錯(cuò) gunicorn manage:app
我們創(chuàng)建一個(gè)gunicorn配置文件gunicorn.conf并把他放到code目錄下
## gunicorn.conf workers=3 bind='127.0.0.1:5000'
安裝Nginx
我們通過(guò)nginx來(lái)反向代理我們的服務(wù)。
# 首先下載一個(gè)nginx sudo apt-get install nginx
我們可以訪(fǎng)問(wèn)我們的域名或IP地址,如果出現(xiàn)Nginx的提示就表示安裝成功了。
nginx安裝在/etc/nginx/目錄下, 我們把項(xiàng)目的配置文件放到/etc/nginx/sites-available/
server{ listen 80; server_name xxx.xxx.xxx.xxx; # nginx log信息, 需要?jiǎng)?chuàng)建logs目錄 access_log /root/code/logs/access.log error_log /root/code/logs/error.log location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header HOST $host; proxy_redirect off; if (!-f $request_filename){ proxy_pass http://127.0.0.1:5000; break; } } }
需要?jiǎng)?chuàng)建一個(gè)軟鏈接到/etc/nginx/sites-enabled/
# 這里bamoo只是文件名你也可以取自己的項(xiàng)目名稱(chēng) ln -s /etc/nginx/sites-available/bamboo /etc/nginx/sites-enabled/bamboo # 然后檢查nginx有沒(méi)有錯(cuò)誤 nginx -t # 重新啟動(dòng)服務(wù) service nginx restart 安裝Supervisor supervisor用來(lái)監(jiān)控進(jìn)程,并在進(jìn)程掛掉的時(shí)候自動(dòng)重啟它。 # 這里需要把它安裝到系統(tǒng)中 sudo pip install supervisor # 生成配置文件 sudo echo_supervisord_conf > /etc/supervisord.conf
# 編輯/etc/supervisord.conf,并在最后一行加入一下字段 # 這樣配置文件會(huì)將/etc/supervisor/conf.d下所有.conf結(jié)尾的都會(huì)導(dǎo)入進(jìn)來(lái) [include] files = /etc/supervisor/conf.d/*.conf # 在創(chuàng)建一個(gè)配置文件到/etc/supervisor/conf.d/bamboo.conf [program:bamboo] command=/root/code/venv/bin/gunicorn manage:app -c /root/code/gunicorn.conf directory=/root/code/ user=root autostart=true autorestart=true stdout_logfile=/root/code/logs/supervisor_out.log stderr_logfile=/root/code/logs/supervisor_err.log
通過(guò)supervisorctl工具用來(lái)管理supervisor維護(hù)的進(jìn)程
# reread來(lái)檢測(cè)修改的配置內(nèi)容, update來(lái)更新 # 這樣就可以看到bamboo的process啟動(dòng)了 supervisorctl reread supervisorctl update # 也可以通過(guò)supervisorctl status 查看所有的項(xiàng)目進(jìn)程 bamboo RUNNING pid 12928, uptime 2:13:05
這樣我們的web服務(wù)已經(jīng)啟動(dòng)起來(lái)了。
相關(guān)文章
Python連接es筆記之創(chuàng)建和刪除操作示例詳解
這篇文章主要為大家介紹了Python連接es筆記之創(chuàng)建和刪除操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05python中pyplot基礎(chǔ)圖標(biāo)函數(shù)整理
在本篇文章里小編給大家整理的是一篇關(guān)于python中pyplot基礎(chǔ)圖標(biāo)函數(shù)整理的相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以參考下。2020-11-11tensorboard實(shí)現(xiàn)同時(shí)顯示訓(xùn)練曲線(xiàn)和測(cè)試曲線(xiàn)
今天小編就為大家分享一篇tensorboard實(shí)現(xiàn)同時(shí)顯示訓(xùn)練曲線(xiàn)和測(cè)試曲線(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python+微信接口實(shí)現(xiàn)運(yùn)維報(bào)警
這篇文章主要介紹了Python+微信接口實(shí)現(xiàn)運(yùn)維報(bào)警的相關(guān)資料,需要的朋友可以參考下2016-08-08Python3.6 中的pyinstaller安裝和使用教程
這篇文章主要介紹了Python3.6 中的pyinstaller安裝和使用的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03對(duì)python pandas中 inplace 參數(shù)的理解
這篇文章主要介紹了對(duì)python pandas中 inplace 參數(shù)的理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python實(shí)現(xiàn)自動(dòng)化處理每月考勤缺卡數(shù)據(jù)
不管是上學(xué)還是上班都會(huì)統(tǒng)計(jì)考勤,有些學(xué)?;蚬緯?huì)對(duì)每月缺卡次數(shù)過(guò)多(比如三次以上)的人員進(jìn)行處罰。本文提供了Python自動(dòng)處理考勤和日志缺失的方法,需要的可以參考一下2022-06-06Django中URL的參數(shù)傳遞的實(shí)現(xiàn)
這篇文章主要介紹了Django中URL的參數(shù)傳遞的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python基于內(nèi)置庫(kù)pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別功能
這篇文章主要介紹了Python基于內(nèi)置庫(kù)pytesseract實(shí)現(xiàn)圖片驗(yàn)證碼識(shí)別功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02