最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

阿里云部署Ubuntu 1.4 Flask + WSGI + Nginx 詳解

 更新時間:2017年12月19日 21:36:58   作者:Ray  
本文解決的是 Flask 最后一公里的問題:Linux 部署,需要的朋友可以參考下

抵不住朋友的誘惑,今天終于入手了一臺阿里云服務(wù)器,是Ubuntu 1.4 32位版本,最初考慮是用來嘗嘗鮮只是買了個最低配的,價格算起來與在國外買個空間的價格相當(dāng)吧(可能一年才貴100多),但用起來感覺就很不錯,速度那是一個字:快。

自從倒戈向Linux世界后,對于一切大而全的開發(fā)框架與軟件都有一種不討喜的感覺,個人更喜歡于使用那些小而精,高性能高產(chǎn)生力的軟件和開發(fā)框架,So 我現(xiàn)在的第一語言是Python和Coffee,開發(fā)框架就當(dāng)然是 AngularJS (前端) + Flask (后端) ,關(guān)于 AngularJS 與 Flask 不在本文的敘述范圍之內(nèi),本文解決的是 Flask 最后一公里的問題:Linux 部署。

我采用的部署方案是:

  • Web 服務(wù)器采用 uwsgi host Flask
  • 用 Supervisor 引用 uwsgi 作常規(guī)啟動服務(wù)
  • 基于 Nginx 作反向代理

首先, 阿里云服務(wù)器可以通過 SSH 指令在本機(jī)的終端進(jìn)行遠(yuǎn)程連接

ssh root@云服務(wù)器地址

輸入密碼進(jìn)入后所有的操作與本地終端完全一至。

安裝 Python 環(huán)境

接下來是python , Ubuntu 的默認(rèn)環(huán)境已經(jīng)預(yù)裝 python 2.7 所以只需要安裝 python 的 pip 安裝工具即可。pip 用于安裝一些基于python 應(yīng)用的軟件工具,在下文中將會頻繁使用。

PIP

如果用python 而不懂 [pip|http://pypi.python.org/] 那最好就快點(diǎn)腦補(bǔ)吧, 指令如下:

sudo apt-get install pip

不同的項(xiàng)目可能會引用各種不同的依賴包,為了避免版本與和應(yīng)用之間的沖突而造成的“依賴地獄”
[Virtualenv | https://virtualenv.readthedocs.org/en/latest/] 就是我們python 項(xiàng)目的必須品了。VirtualEnv 可以為每個Python應(yīng)用創(chuàng)建獨(dú)立的開發(fā)環(huán)境,使他們互不影響,Virtualenv 能夠做到:

  • 在沒有權(quán)限的情況下安裝新套件
  • 不同應(yīng)用可以使用不同的套件版本
  • 套件升級不影響其他應(yīng)用

安裝:

sudo pip install virtualenv

安裝VirtualEnv 后只需要在項(xiàng)目目錄內(nèi)運(yùn)行 virtualenv 目錄名 就可以建立一個虛擬環(huán)境文件夾,然后啟用 activate 指令即可啟用該python虛擬環(huán)境,具體操作如下:

假定我的項(xiàng)目目錄叫 /home/www/my_flask,首先安裝虛擬環(huán)境 (我習(xí)慣使用的虛擬環(huán)境目錄叫 venv )

my_flask root$ virtualenv venv

>> New python executable in venv/bin/python
>> Installing setuptools, pip...done.

在項(xiàng)目目錄下就會建立一個新的 venv 目錄,里面就是運(yùn)行python 的基本環(huán)境的工具與指令,和包。 然后啟用該環(huán)境,使用當(dāng)前命令行狀態(tài)進(jìn)入虛擬環(huán)境,進(jìn)入虛擬環(huán)境后,一切安裝python的操作都會將包和引用裝在虛擬環(huán)境內(nèi),而不會影響到全局的python 環(huán)境。

my_flask root$ source venv/bin/activate 

(venv)my_flask root$ 

調(diào)用 activate 指令后命令符前就會出現(xiàn) (venv) 字樣。 可通過 deactivate 退出虛擬環(huán)境。

安裝 uWSGI

Flask 的實(shí)際生產(chǎn)運(yùn)行環(huán)境選擇并不多,比較成熟的是 [Gunicorn|http://gunicorn.org/] 和 [uWSGI|https://github.com/unbit/uwsgi] ,聽說Gunicorn 的配置很簡單,但可惜我一直沒有配置成功過,我現(xiàn)采用的是 uWSGI。接下來就安裝uWSGI吧。

(venv)my_flask root$ pip install uwsgi

在虛擬環(huán)境下不需要使用 sudo ,因?yàn)関irtualenv 是沒有權(quán)限要求的。

這個安裝很迅速,基本是秒成。安裝完成后我們可以先放下 uWSGI 不表,在后面再回過來配置他,因?yàn)槲覀兪紫纫獙㈥P(guān)鍵的 Flask環(huán)境和我們的項(xiàng)目文件傳到服務(wù)器目錄內(nèi)。

安裝 Flask

我是用清單文件一次性安裝Flask和他的相關(guān)依賴的,這樣會更快。我的引用清單是這樣的:
requirements.txt

Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-Moment==0.4.0
Flask-PageDown==0.1.5
Flask-SQLAlchemy==2.0
Flask-Script==2.0.5
Flask-WTF==0.10.2
Flask-Cache==0.13.1
Flask-Restless==0.15.0
Flask-Uploads==0.1.3
Jinja2==2.7.3
Mako==1.0.0
Markdown==2.5.1
MarkupSafe==0.23
SQLAlchemy==0.9.8
WTForms==2.0.1
Werkzeug==0.9.6
html5lib==1.0b3
itsdangerous==0.24
six==1.8.0
awesome-slugify==1.6

可以想像,如果一個一個裝非瘋了不可。
安裝清單文件:

(venv)my_flask root$ pip install -r requirements.txt

在此還是重重地提一下:一定要注意在運(yùn)行這個安裝之前啟用了python 虛擬環(huán)境,否則會直接安裝到全局去的!

項(xiàng)目文件

接下來就是上傳 Flask的項(xiàng)目文件,之前我在各大的“轉(zhuǎn)載專業(yè)戶”里找了好多的資料,在這一步中大多只是在上面加個標(biāo)準(zhǔn)的Flask運(yùn)行文件,雖說做個范例可以但說實(shí)在的這很讓人迷惑,為什么?先看看代碼吧:

from flask import Flask
 
app = Flask(__name__)
 
@app.route("/")
def hello():
  return "Hello World!"

生產(chǎn)環(huán)境內(nèi),誰會用這樣的代碼呢,這只是Flask 的最簡入門范,我的Flask項(xiàng)目中 app 是被做在包內(nèi)的,相信很多人都是這樣做的,在包外我們采用 Flask Script 寫一個 manage.py 文件 作為啟動文件,這更方便于支持各種的項(xiàng)目,包括可以安裝到 window下的 FastCGI 中。

那么我的 這個 manage.py 是這個樣子的:

#!/usr/bin/env python
import os

if os.path.exists('.env'):
  print('Importing environment from .env...')
  for line in open('.env'):
    var = line.strip().split('=')
    if len(var) == 2:
      os.environ[var[0]] = var[1]

from app import create_app
from flask.ext.script import Manager, Shell

# 通過配置創(chuàng)建 app 
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)

def make_shell_context():
  return dict(app=app)


manager.add_command("shell", Shell(make_context=make_shell_context))

@manager.command
def deploy():
  """Run deployment tasks."""
  pass


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

這樣做我地開發(fā)環(huán)境可以這樣運(yùn)行 Flask:

python manage.py runserver

更詳細(xì)的做法請參考 [Flask Script|http://flask-script.readthedocs.org/en/latest/] 擴(kuò)展

好吧,我們可以用 支持SSH的FTP工具將Flask項(xiàng)目文件上傳到服務(wù)器上,下面是整個項(xiàng)目文件結(jié)構(gòu):

www/
└── my_flask 
│  ├── logs
│  └── venv //虛擬目錄
│  │  ├── bin
│  │  │     ├── activate
│  │  │     ├── easy_install
│  │  │     ├── gunicorn
│  │  │     ├── pip
│  │  │     └── python
│  │  ├── include
│  │  │     └── python2.7 -> /usr/include/python2.7
│  │  ├── lib
│  │  │     └── python2.7
│  │  ├── local
│  │  │     ├── bin -> /home/shenye/shenyefuli/bin
│  │  │     ├── include -> /home/shenye/shenyefuli/include
│  │  │     └── lib -> /home/shenye/shenyefuli/lib
│  └── app //Flask 程序目錄
│  │      └── __init__.py //這是程序包文件。這個目錄下還有其它的文件此處略過
│  ├── manage.py  
│  ├── requirements.txt 

配置 uwsgi

好了,項(xiàng)目的準(zhǔn)備工作已經(jīng)做完了,是時候回過頭去配置 uwsgi 了,它的具體指令可以去看它的官方文檔,我們在這里采用其中的一種指令方式:配置起動。我采用 .ini文件作為配置,在項(xiàng)目目錄下創(chuàng)建一個 confg.ini (具體見下文)寫好后可以這樣執(zhí)行  

(venv)my_flask root$ uwsgi config.ini

我認(rèn)為是最簡單的方式,也容易更改。好了重要部分來了,config.ini 是這樣寫的:

[uwsgi]

# uwsgi 啟動時所使用的地址與端口
socket = 127.0.0.1:8001 

# 指向網(wǎng)站目錄
chdir = /home/www/ 

# python 啟動程序文件
wsgi-file = manage.py 

# python 程序內(nèi)用以啟動的 application 變量名
callable = app 

# 處理器數(shù)
processes = 4

# 線程數(shù)
threads = 2

#狀態(tài)檢測地址
stats = 127.0.0.1:9191

注意 : callable=app 這個 app 是 manage.py 程序文件內(nèi)的一個變量,這個變量的類型是 Flask的 application 類 。

運(yùn)行 uwsgi

```
(venv)my_flask root$ uwsgi config.ini

[uWSGI] getting INI configuration from config.ini

*** Starting uWSGI 2.0.8 (64bit) on [Fri Dec 19 14:34:11 2014] 
// 此處略去那些無用的啟動信息
Stats server enabled on 127.0.0.1:9191 fd: 15 ***
```

OK, 此時已經(jīng)正常啟動 uwsgi 并將 Flask 項(xiàng)目載入其中了,ctrl+c 關(guān)閉程序。但這只是命令啟動形式,要使其隨同服務(wù)器啟動并作為后臺服務(wù)運(yùn)行才是運(yùn)營環(huán)境的實(shí)際所需要。因此接下來我們需要安裝另一個工具來引導(dǎo) uwsgi 。

安裝 Supervisor

[Supervisor|http://supervisord.org/configuration.html]可以同時啟動多個應(yīng)用,最重要的是,當(dāng)某個應(yīng)用Crash的時候,他可以自動重啟該應(yīng)用,保證可用性。

sudo apt-get install supervisor

 Supervisor 的全局的配置文件位置在:

/etc/supervisor/supervisor.conf

正常情況下我們并不需要去對其作出任何的改動,只需要添加一個新的 *.conf 文件放在

/etc/supervisor/conf.d/

下就可以,那么我們就新建立一個用于啟動 my_flask 項(xiàng)目的 uwsgi 的 supervisor 配置 (命名為:my_flask_supervisor.conf):

[program:my_flask]
# 啟動命令入口
command=/home/www/my_flask/venv/bin/uwsgi /home/www/my_flask/config.ini

# 命令程序所在目錄
directory=/home/www/my_flask
#運(yùn)行命令的用戶名
user=root
    
autostart=true
autorestart=true
#日志地址
stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log  

啟動服務(wù)

sudo service supervisor start

終止服務(wù)

sudo service supervisor stop

安裝 Nginx

[Nginx|http://nginx.com/]是輕量級、性能強(qiáng)、占用資源少,能很好的處理高并發(fā)的反向代理軟件。

sudo apt-get install nginx

配置 Nginx

Ubuntu 上配置 Nginx 也是很簡單,不要去改動默認(rèn)的 nginx.conf 只需要將

/ext/nginx/sites-available/default

文件替換掉就可以了。

新建一個 default 文件:

server {
   listen 80;
   server_name XXX.XXX.XXX; #公網(wǎng)地址
  
   location / {
    include   uwsgi_params;
    uwsgi_pass  127.0.0.1:8001; # 指向uwsgi 所應(yīng)用的內(nèi)部地址,所有請求將轉(zhuǎn)發(fā)給uwsgi 處理
    uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虛擬環(huán)境目錄
    uwsgi_param UWSGI_CHDIR /home/www/my_flask; # 指向網(wǎng)站根目錄
    uwsgi_param UWSGI_SCRIPT manage:app; # 指定啟動程序
   }
  }

將default配置文件替換掉就大功告成了!
還有,更改配置還需要記得重啟一下nginx:

sudo service nginx restart

總結(jié)

阿里云的服務(wù)器運(yùn)行速度很不錯,加上Flask+uWSGI+nginx 這種高性能結(jié)構(gòu),整個網(wǎng)站響應(yīng)速度極為之快,每頁響應(yīng)速度不到0.1s , 與之相比我之前使用 C# 部署在Avarix 上的網(wǎng)站(同一個程序,不同語言實(shí)現(xiàn))每頁響應(yīng)速度至少2s 這簡直是 200:1的性能,當(dāng)然我還沒有閑到去專們用軟件去測這兩者之間的差值,寫本文的目的也是對此作一記錄,以便以后回顧。

相關(guān)文章

  • nginx正向代理與反向代理詳解

    nginx正向代理與反向代理詳解

    本文給大家分享的是nginx實(shí)現(xiàn)正向代理和反向代理的具體方法配置以及不同的實(shí)例情況,非常的詳細(xì),希望大家能夠喜歡
    2020-03-03
  • nginx location 配置 正則表達(dá)式實(shí)例詳解

    nginx location 配置 正則表達(dá)式實(shí)例詳解

    本文通過實(shí)例代碼給大家介紹了nginx location 配置 正則表達(dá)式的問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • nginx多l(xiāng)ocation配置實(shí)例代碼

    nginx多l(xiāng)ocation配置實(shí)例代碼

    公司測試環(huán)境使用nginx部署多個前端項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于nginx多l(xiāng)ocation配置的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 詳解nginx rewrite和根據(jù)url參數(shù)location

    詳解nginx rewrite和根據(jù)url參數(shù)location

    本篇文章主要是介紹了nginx rewrite和根據(jù)url參數(shù)location,有興趣的同學(xué)可以了解以下。
    2016-11-11
  • Nginx proxy_set_header配置方式

    Nginx proxy_set_header配置方式

    這篇文章主要介紹了Nginx proxy_set_header配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Nginx對網(wǎng)段內(nèi)ip的連接數(shù)限流配置詳解

    Nginx對網(wǎng)段內(nèi)ip的連接數(shù)限流配置詳解

    這篇文章主要介紹了Nginx對網(wǎng)段內(nèi)ip的連接數(shù)限流配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Nginx之QPS限制模塊的具體使用

    Nginx之QPS限制模塊的具體使用

    本文主要介紹了Nginx之QPS限制模塊的具體使用,主要介紹Nginx QPS限制模塊的原理、安裝和使用方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 基于nginx反向代理獲取用戶真實(shí)Ip地址詳解

    基于nginx反向代理獲取用戶真實(shí)Ip地址詳解

    我們訪問互聯(lián)網(wǎng)上的服務(wù)時,大多數(shù)時客戶端并不是直接訪問到服務(wù)端的,而是客戶端首先請求到反向代理,反向代理再轉(zhuǎn)發(fā)到服務(wù)端實(shí)現(xiàn)服務(wù)訪問,這篇文章主要給大家介紹了關(guān)于如何基于nginx反向代理獲取用戶真實(shí)Ip地址的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • nginx修改默認(rèn)運(yùn)行80端口的方法

    nginx修改默認(rèn)運(yùn)行80端口的方法

    這篇文章主要給大家介紹了關(guān)于nginx是如何修改默認(rèn)運(yùn)行80端口的方法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Nginx安裝完成沒有生成sbin目錄的解決方法

    Nginx安裝完成沒有生成sbin目錄的解決方法

    這篇文章主要介紹了Nginx安裝完成沒有生成sbin目錄的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

嘉定区| 巴林右旗| 贵阳市| 宜兰市| 永春县| 育儿| 霸州市| 河北区| 营山县| 晋宁县| 哈尔滨市| 曲沃县| 建瓯市| 凤凰县| 遂宁市| 利川市| 庆城县| 南澳县| 长子县| 沁阳市| 剑阁县| 黄平县| 和田市| 通河县| 关岭| 金阳县| 交口县| 临沧市| 徐闻县| 昌图县| 文昌市| 绩溪县| 客服| 田阳县| 通州市| 施甸县| 泌阳县| 陇川县| 淳安县| 荥阳市| 临湘市|