本文目錄一覽:
如何部署簡單python + flask應用
所需工具:
python3.4
flask
nginx
gunicorn
supervisor
系統環境:
Ubuntu 14.04LTS
我們先寫一個最基本的flask應用:
demo.py
from flask import Flask
app = Flask(**name**)
@app.route(‘\’)
def index():
return ‘Hello World.’
if __name__ == __main__:
app.run()
運行這個py文件,打開瀏覽器訪問127.0.0.1:5000就能看到顯示Hello World的頁面 .
如果讓這個flask引用監聽來自公網ip的請求,理論上你跑此程序的機器就相當於一個服務器了,然而這個服務器並不完美,所以我們需要nginx和gunicorn來增加它的功能,讓它真刀真槍上生產環境的時候能按要求運行。
flask自帶的WSGI框架性能很差勁,只能適用於開發環境調試使用。我們用專業一點的gunicorn(還有很多其他優秀的框架)替代flask自帶的WSGI框架。
配置完後,通過命令’/usr/local/bin/gunicorn -b127.0.0.1:5000‘啟動應用。打開瀏覽器訪問127.0.0.1:5000,同樣能夠得到返回頁面
然而gunicorn也僅僅是一個python的WSGI框架而已,要讓它真正處理來自互聯網的各類訪問功能還是有點欠缺,這時候就需要用到大名鼎鼎的nginx 服務器來替gunicorn遮風擋雨了。
Ubuntu下安裝nginx可以用命令
sudo apt-get install nginx
安裝後需要進行下配置:
cd /etc/nginx/sites-available
sudo vi test (test為配置名稱,可以根據自己項目進行命名)
test文件的配置為:
server {
listen 80; # 監聽80端口
location / {
proxy_pass ; # 代理本機127.0.0.1:5000的服務
}
location /static {
alias /home/ubuntu/myproject/myblog/app/static; # 負載均衡
}
}
cd ..
cd sites-enable
sudo ln -s ../sites-available/lwhile . (創建軟鏈接,別漏掉最後的.)
sudo service nginx reload
sudo service nginx restart
這樣nginx的基本配置文件就寫好了 接下來我們配置進程管理工具supervisor supervisor可以在後面啟動你的python進程,這樣很方便
1.cd /etc/supervisor/conf.d
2.sudo vi test.conf (test為文件名)
[program:test]
command = /usr/local/bin/gunicorn -b127.0.0.1:5000 /home/ubuntu/myproject/test.py
3.sudo supervisorctl
4.reload
5.start test
如果一切正常,做完這所有步驟之後,現在公網的ip訪問你的主機,就可以打開你的flask應用了
如何創建部署WSGI類型的Python應用
1.因為這是部署Python開發環境,所以安裝pip可以簡化一些軟件的安裝過程。(PIP對應Lua的luarocks)
sudo apt-get install python-pip
安裝三個Python框架
sudo pip install flask
sudo pip install django==1.5.1
sudo pip install tornado==3.1.1
2.安裝Gunicorn,這是運行Python的WSGI HTTP服務。
sudo pip install gunicorn
3.Virtualenv, 安裝這個是因為,在部署Django的時候,使用了不同的版本。
sudo pip install virtualenv
第二部分:創建部署應用。
1.創建一個WSGI類型的Tornado應用。
import tornado.web
import tornado.wsgi
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write(“My source code in the MoPaas server by python Tornado!”)
settings = {
“debug” : True,
“static_path”: “static”,
}
#####
urls = [
(r”/”, MainHandler),
]
app = tornado.wsgi.WSGIApplication(urls, **settings)
啟動這個服務:
gunicorn -w 4 torapp:app -b 0.0.0.0:8888
2.創建一個Flask應用。
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
return “My source code in the MoPaas server by python Tornado!”
if __name__ == “__main__”:
app.run()
啟動這個服務:
gunicorn -w 4 server:app -b 0.0.0.0:8888
3.創建Django應用。
Django是一個比較大的WEB應用,創建各部署的過程,稍微複雜一些。
創建工程
django-admin.py startproject hotdoc
創建應用
python manage.py startapp verp
創建數據庫表
python manage.py syncdb
啟動工程
gunicorn hotdoc.wsgi:application -b 0.0.0.0:8888
需要在修改工程目錄下的settings.py
在INSTALLED_APPS中加入, verup和gunicorn:
INSTALLED_APPS = (
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘verup’,
‘gunicorn’
以上,本地開發環境是沒問題的。
這些步驟也可以用virtualenv新創建一個虛擬環境完成,本地創建virtualenv可以
目前在WEB IDE上沒有測試通過,理論上說,如果coding的WEB IDE是基於Docker
的,virtualevn也應該好用。
mkdir ~/environments/
virtualenv ~/environments/tutorial/
cd ~/environments/tutorial/bin
source bin/activate
目前的Paas平台上的Python服務就是WSGI形式的應用,比如SAE和Mopaas,
不同的是,在SAE上有些現成的例子。Mopaas需要自己從頭寫,這三個例子
在Mopaas生產環境下都運行測試通過。在coding.net的WEB IDE也可成功運
行。
如何部署python3 的應用
mod_python,這是apache內置的模塊,很嚴重的依賴於mod_python編譯使用的python版本,和apache配套使用,不推薦
cgi,這個太old,不推薦,而且nginx不支持cgi方式,只能用lighttpd或者apache
fastcgi ,這個是目前流行最廣的做法,通過flup模塊來支持的,在nginx里對應的配置指令是 fastcgi_pass
spawn-fcgi,這個是fastcgi多進程管理程序,lighttpd安裝包附帶的,和
flup效果一樣,區別是flup是
python代碼級引入,spawn-fcgi是外部程序。spawn-fcgi用途很廣,可以支持任意語言開發的代
碼,php,python,perl,只要你代碼實現了fastcgi接口,它都可以幫你管理你的進程
scgi,全名是Simple Common Gateway Interface,也是cgi的替代版本,scgi協議很簡單,我覺得和fastcgi差不多,只是沒有怎麼推廣開來,nginx對應的配置指令是scgi_pass,你想用就用,flup也支持。
http,nginx使用proxy_pass轉發,這個要求後端appplication必須內置一個能處理高並發的http server,在python的web框架當中,只能選擇tornado.
python程序員喜歡發明輪子,tornado除了是一個web framework之外,它還可以單獨提供高性能http
server,所以,如果你採用其他python框架寫代碼,比如說bottle,也一樣可以通過import
tornado 來啟動一個高性能的http
server,同樣的可以採用http協議和nginx一起來部署。擴展開來,python包裡面能處理高並發的http
server還有很多,比如說gevent,也可以被其他框架引用來支持http方式部署。
現實當中,用java來做web程序,通常就用http和nginx配合,應用服務器選擇tomcat或者jetty
uwsgi,包括4部分組成,
nginx從0.8.4開始內置支持uwsgi協議,uwsgi協議非常簡單,一個4個字節header+一個body,body可以是很多協議的
包,比如說http,cgi等(通過header裡面字段標示),我曾經做個一個小規模的性能對比測試,結果表明,uwsgi和fastcgi相比,性能
沒有太明顯的優勢,也可能是數據集較小的原因
uwsgi的特點在於自帶的進程控制程序.它是用c語言編寫,使用natvie函數,其實和spawn-fcgi/php-fpm類似。所以uwsgi可以支持多種應用框架,包括(python,lua,ruby,erlang,go)等等
uwsgi協議
web server內置支持協議模塊
application服務器協議支持模塊
進程控制程序
Gunicorn,和uwsgi類似的工具,從rails的部署工具(Unicorn)移植過來的。但是它使用的協議是 WSGI,全稱是Python Web Server Gateway Interface ,這是python2.5時定義的官方標準(PEP 333 ),根紅苗正,而且部署比較簡單, 上有詳細教程
mod_wsgi,apache的一個module,也是支持WSGI協議,
如何在服務器上部署python
使用pip或easy_install可以管理和安裝python的package包,實際上它們都是從pypi服務器中搜索和下載package的。目前在pypi服務器上,有超過三萬多個package,同時還允許我們將自己的代碼也上傳發布到服務器上。這樣,世界上的所有人都能使用pip或easy_install來下載使用我們的代碼了。
具體步驟如下:
首先創建項目文件和setup文件。
目錄文件結構如下:
project/
simpletest/
__init__.py
test.py
setup.py
假設項目文件只有一個simpletest包,裡面有一個test.py文件。
創建的setup.py文件格式大致如下,其中,install_requires字段可以列出依賴的包信息,用戶使用pip或easy_install安裝時會自動下載依賴的包。詳細的格式參考文檔。
from setuptools import setup, find_packages
setup(
name = ‘simpletest’,
version = ‘0.0.1’,
keywords = (‘simple’, ‘test’),
description = ‘just a simple test’,
license = ‘MIT License’,
install_requires = [‘simplejson=1.1’],
author = ‘yjx’,
author_email = ‘not@all.com’,
packages = find_packages(),
platforms = ‘any’,
)
然後將代碼打包。
打包只需要執行python
setup.py xxx命令即可,其中xxx是打包格式的選項,如下:
# 以下所有生成文件將在當前路徑下 dist 目錄中
python setup.py bdist_egg # 生成easy_install支持的格式
python setup.py sdist # 生成pip支持的格式,下文以此為例
發布到pypi。
發布到pypi首先需要註冊一個賬號,然後進行如下兩步:
註冊package。輸入python setup.py register。
上傳文件。輸入python setup.py sdist upload。
安裝測試
上傳成功後,就可以使用pip來下載安裝了。
另外,pypi還有一個測試服務器,可以在這個測試服務器上做測試,測試的時候需要給命令指定額外的”-r”或”-i”選項,如python
setup.py register -r “”,python
setup.py sdist upload -r “”,pip
install -i “” simpletest。
發布到測試服務器的時候,建議在linux或cygwin中發布,如果是在windows中,參考文檔,需要生成.pypirc文件
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/129660.html
微信掃一掃
支付寶掃一掃