本文目录一览:
1、[如何部署简单python + flask应用](#如何部署简单python + flask应用) 2、如何创建部署WSGI类型的Python应用 3、[如何部署python3 的应用](#如何部署python3 的应用) 4、如何在服务器上部署python
如何部署简单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文件的配置为:
server {
listen 80; # 监听80端口
location / {
proxy_pass http://127.0.0.1:5000; # 代理本机127.0.0.1:5000的服务
}
location /static {
alias /home/ubuntu/myproject/myblog/app/static; # 负载均衡
}
}
cd ..
cd sites-enable
sudo ln -s ../sites-available/test .
sudo service nginx reload
sudo service nginx restart
这样nginx的基本配置文件就写好了。接下来我们配置进程管理工具supervisor,supervisor可以在后面启动你的python进程,这样很方便。
cd /etc/supervisor/conf.d
sudo vi test.conf
[program:test]
command = /usr/local/bin/gunicorn -b127.0.0.1:5000 /home/ubuntu/myproject/test.py
sudo supervisorctl
reload
start test
如果一切正常,做完这所有步骤之后,现在公网的ip访问你的主机,就可以打开你的flask应用了。
如何创建部署WSGI类型的Python应用
- 因为这是部署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
- 安装Gunicorn,这是运行Python的WSGI HTTP服务。
sudo pip install gunicorn
- 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
中加入verp
和gunicorn
:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'verp',
'gunicorn'
)
以上,本地开发环境是没问题的。 这些步骤也可以用virtualenv新创建一个虚拟环境完成,本地创建virtualenv可以:
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
转发,这个要求后端application必须内置一个能处理高并发的http server,在python的web框架当中,只能选择tornado。 - uwsgi:包括4部分组成,nginx从0.8.4开始内置支持uwsgi协议,uwsgi协议非常简单,一个4个字节header+一个body,body可以是很多协议的包,比如说http,cgi等(通过header里面字段标示),uwsgi的特点在于自带的进程控制程序。它是用c语言编写,使用native函数,其实和spawn-fcgi/php-fpm类似。所以uwsgi可以支持多种应用框架,包括(python,lua,ruby,erlang,go)等等。
- 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 bdist_egg # 生成easy_install支持的格式
python setup.py sdist # 生成pip支持的格式
发布到pypi。 发布到pypi首先需要注册一个账号,然后进行如下两步:
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
文件。