如何部署Pyramid基于Python WSGI Web的应用程序

在这种DigitalOcean文章中,我们将看到有关包装PyramidWSGI的Web应用程序,创建它的依赖列表,并部署它(即网上发布它)。

介绍


当你第一次开始开发一个Python Web的应用程序,特别是如果你是从不同的语言来或在桌面(GUI)应用程序的后台运行,你可能会有点在得到您的新作品在网上的过程中丢失。

在这种DigitalOcean文章,下面我们以前在一个与Pyramid入门和部署Python的Web应用程序使用不同的Web服务器,我们将看到有关打包PyramidWSGI的Web应用程序,创建它的依赖列表,并部署它(即网上出版它)。

注:本文所举的例子,虽然给人一种用法的例子还有,按照入门文章中使用的命名约定。 如果您在使用Pyramid开始Web应用程序开发的问题,或者只是想熟悉以前使用的名称,你可以检查出的文章在这里

词汇表


Pyramid简介


  1. Web应用程序部署
  2. WSGI
  3. 使用Nginx作为反向代理

2.部署基于Pyramid的WSGI Web应用程序


  1. 更新系统
  2. 设置Python,pip和virtualenv
  3. 使用暴露的“app”对象准备一个简单的应用程序
  4. 使用.ini设置公开脚手架的应用程序对象
  5. 使用pip处理应用程序依赖性
  6. 创建应用程序依赖关系列表
  7. 从应用程序依赖关系列表下载

3.设置Python WSGI Web应用程序服务器


  1. 使用CherryPy Web服务器来服务Pyramid应用程序
  2. 运行和管理应用程序服务器

4.设置Nginx


  1. 安装Nginx
  2. 配置Nginx

Pyramid简介


与其中一些较重的对象相比,Pyramid是一个轻量级的Python Web应用程序框架。 然而,与Flask或其他“微”不同,Pyramid仍然带有很多的功能和功能。

作为是很好的保持了优良的项目,Pyramid有相当多的人气,有几种不同的方式(网络服务器和方法)来部署基于其Web的应用程序。

Web应用程序部署


在问候所有的Python WSGI web应用,部署包括制备包含对,然后通过万维网服务器用作入口的一个点传递请求的应用程序对象的引用一个WSGI模块。

WSGI


简而言之,WSGI是Web服务器和应用程序本身之间的接口。 它的存在是为了保证各种服务器和应用程序(框架)之间的标准化的方式彼此合作,允许互换性必要时(例如,从开发切换到生产环境),这是一个必须有需要时下。

注意:如果你有兴趣了解更多关于WSGI和Python的Web服务器,看看我们的文章: 网络服务器的基于Python的Web应用程序的比较

使用Nginx作为反向代理


Nginx是一个非常高性能的Web服务器/(反向)-proxy。 它已经达到其受欢迎程度是由于重量轻,相对容易使用,并且易于扩展(与附加/插件)。 由于它的结构,它能够处理大量的哪些请求(几乎不受限制)的-这取决于你的应用程序或网站负载-可能是真的很难用一些其他的,旧的替代品来解决。

请记住:“处理”连接技术上意味着不会放弃他们,并能与一些为他们服务。 你仍然需要你的应用程序和数据库运行良好,以使Nginx服务客户端的响应,而不是错误消息。

Python WSGI Web应用程序服务器


Python Web应用程序服务器通常是独立的基于C的解决方案或完全(或部分)基于Python(即纯Python)的解决方案。

它们通过接受含有Python模块操作-如先前所解释-调用的应用程序以包含 web应用和服务于它在网络上。

虽然其中一些是高性能的服务器可以直接使用,建议使用Nginx前面的上述原因(例如更高的性能)。 同样,不建议通常都是与Web应用框架开发服务器在生产中使用,由于其缺乏功能- 除少数例外,当然

一些流行的Python WSGI Web服务器是:

  • CherryPy

  • Gunicorn

  • uWSGI

  • 服务员

部署基于Pyramid的WSGI Web应用程序


由于Python的WSGI中间件规范,对于被设置为在协议上运行的所有应用程序,也有Web应用程序服务器方面有很多选择。

重述:更新系统


为了有一个稳定的部署服务器,保持最新和良好的维护至关重要。

为了确保我们有最新的可用版本的默认应用程序,我们需要更新我们的系统。

对于基于Debian的系统(即Ubuntu,Debian),运行以下命令:

aptitude    update
aptitude -y upgrade

对于基于RHEL的系统(即CentOS),运行以下命令:

yum -y update

提示:在CentOS, upgrade ,手段升级操作系统update ,但更新的应用程序。 在Debian / Ubuntu中, update更新的应用程序源列表 ,并upgrade他们升级到了新版本。

概述:设置Python,pip和virtualenv


CentOS / RHEL用户注意事项:

CentOS的/ RHEL,默认情况下是作为一个非常精简服务器。 它的工具,这很可能是约会了您的需求,是不是有运行应用程序,但对于服务器的系统工具电源(例如:YUM)。

为了准备你的CentOS系统,Python需要设置(即从源代码编译),pip / virtualenv需要使用该解释器安装。

要了解如何设置的Python 2.7.6和3.3.3在CentOS 6.4和5.8,与PIP和的virtualenv,请参考: 如何设置的Python 2.7.6和3.3.3在CentOS

在Ubuntu和Debian,最近的Python解释器,你可以使用的版本出现在默认情况下。 它使我们只有有限数量的额外的软件包安装:

  • python-dev的 -开发工具

  • 点子 -管理包

  • 的virtualenv -创建隔离,虚拟环境

python-dev:


python-dev是一个操作系统级包,其中包含用于构建Python模块的扩展开发工具。

运行以下命令使用aptitude安装python-dev:

aptitude install python-dev

pip:


pip是一个包管理器,它将帮助我们安装我们所需要的应用程序包。

运行以下命令安装pip:

curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | python -
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python -
export PATH="/usr/local/bin:$PATH"

您可能需要sudo权限。

virtualenv:


最好在自己的环境中包含一个Python应用程序及其所有依赖项。 环境可以被最好地描述(简单地)作为一切都驻留的孤立位置(目录)。 为了这个目的,使用了被称为的virtualenv工具。

运行以下命令以使用pip安装virtualenv:

sudo pip install virtualenv

使用暴露的“app”对象准备一个简单的应用程序


注意:本节的重点从以前的教程让我们的样本单页在线申请。

目前,我们有一个单页的应用程序(即application.py即建立以服务)“世界,你好!” 在端口8080使用Pyramid的开发服务器。

我们当前的工作目录位于〜/传销网站/世界你好

我们目前的Pyramid应用实例( application.py )是这样的:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('<h1>Hello world!</h1>')

if __name__ == '__main__':
    config = Configurator()
    config.add_view(hello_world)
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

为了将此示例转换为包含WSGI可调用的模块,我们可以进行以下修改:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('<h1>Hello world!</h1>')

# Move the application object here.
# Create a configurator to make *wsgi app(lication)*
config = Configurator()
config.add_view(hello_world)

# The "app" object to be exposed
app = config.make_wsgi_app()

# If run directly, still construct a [development]
# server process and start serving on port #8080. 
if __name__ == '__main__':
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

修改后,按CTRL + X,并用Y确认保存并退出。

从现在开始,我们可以将此文件作为一个模块传递给可调用任何Python WSGI Web服务器的应用程序。

使用.ini设置公开脚手架的应用程序对象


另外,如果您已经使用Pyramid的脚手架创造了一个更复杂的应用程序,你可以建立一个wsgi.py包含使用Pyramid的“.INI”文件加载部署(或开发)配置的应用程序。

注:该文件需要驻留在您的应用程序根文件夹内,沿着requirements.txt或您的.ini文件。 它的工作原理是将您的应用程序作为一个对象。

注意:您可以在技术上选择任何名称(“包括application.py”),该文件。 然而, wsgi.py可能是-与常规-比的不同的一个以上可接受。

要创建wsgi.py使用纳米文本编辑器文件,运行以下命令:

nano wsgi.py

复制并粘贴以下内容:

from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.paster import get_app

def hello(request):
    return Response('Hello!')

config = Configurator()
config.add_route('hello', '/')
config.add_view(home, route_name='hello')

app = config.make_wsgi_app()

# Or from an .ini file:
# app = get_app('config.ini', 'application_name')

使用pip处理应用程序依赖性


由于很可能在本地机器上启动了开发过程,因此在部署应用程序时,您需要确保其所有依赖关系都已安装(在虚拟环境中)。

创建应用程序依赖关系列表


获取生产环境的依赖关系的最简单的方法是使用pip。 使用单个命令,它能够生成您已安装的所有软件包(或依赖关系)(在您的激活环境中,如果没有,在您的系统上全局),并再次使用单个命令,它允许您将它们全部下载和安装。

注意:此部分包含无论你想生成的应用程序依赖关系列表这是在您的本地开发机器或执行的信息。 此文件应放置在应用程序目录中,并上传到您的服务器。

使用“pip”创建已安装软件包的列表:

pip freeze > requirements.txt

此命令将创建一个名为“requirements.txt”的文件,其中包含所有已安装软件包的列表。 如果您在的virtualenv内运行,该列表将由环境中安装的软件包。 否则,将列出全局安装的所有软件包。

从应用程序依赖关系列表下载


使用pip从列表中安装软件包:

注:本部分包含这是要在你的生产(即部署)的机器/环境下执行的信息。

pip install -r requirements.txt

此命令将下载并安装所有列出的软件包。 如果您在激活的环境中工作,文件将在那里下载。 否则,他们将在全球范围内安装-这是推荐的方法的原因在前面的章节中说明。

设置Python WSGI Web应用程序服务器


设置我们的Pyramid应用程序以公开其应用程序对象后,我们可以开始实际部署过程,下载并安装我们的首选Web应用程序服务器。

在本文中,我们将重点介绍如何使用CherryPy的 ,由于其能力和综合简单。

注意:这里给出的指令是短暂的。 要了解更多信息,请访问我们如何做对PIP文章,并VIRTUALENV 常用的Python工具:的virtualenv和点子 如果您正在使用一个基于CentOS的服务器时,您可能想看看如何设置的Python 2.7.6和3.3.3在CentOS文章为好。

使用CherryPy Web服务器来服务Pyramid应用程序


CherryPy的纯Python Web服务器是一个紧凑的解决方案,与名称框架。 由项目定义为“高速,生产就绪,线程池化,通用HTTP服务器”,它是一个模块化组件,可用于服务任何Python WSGI Web应用程序。

在我们的第一个Pyramid教程之后,我们可以继续在虚拟环境中工作(〜/ pyramid_sites / env)并在那里安装CherryPy。 如果您在不同的位置创建了不同的位置,您也可以在那里做。

# Install CherryPy Framework and HTTP Web-Server
pip install cherrypy

在安装应用程序包时,为了服务您的Pyramid应用程序,您需要创建一个“server.py”文件以供您的Phython解释器运行。 它是包括您的应用程序包的这个文件,并使用CherryPy的Web服务器。

要创建一个server.py文件 ,运行以下命令:

nano server.py

复制并粘贴以下内容以使用CherryPy的HTTP Server创建示例服务器应用程序:

# Import your application as:
# from wsgi import application
# Example:

# If you are using the wsgi.py (standard Pyramid)
# from wsgi import app

# If using application.py (single page example):
from application import app

# Import CherryPy
import cherrypy

if __name__ == '__main__':

    # Mount the application (or *app*)
    cherrypy.tree.graft(app, "/") 

    # Unsubscribe the default server
    cherrypy.server.unsubscribe()

    # Instantiate a new server object
    server = cherrypy._cpserver.Server()

    # Configure the server object
    server.socket_host = "0.0.0.0"
    server.socket_port = 8080
    server.thread_pool = 30

    # For SSL Support
    # server.ssl_module            = 'pyopenssl'
    # server.ssl_certificate       = 'ssl/certificate.crt'
    # server.ssl_private_key       = 'ssl/private.key'
    # server.ssl_certificate_chain = 'ssl/bundle.crt'

    # Subscribe this server
    server.subscribe()

    # Example for a 2nd server (same steps as above):
    # Remember to use a different port

    # server2             = cherrypy._cpserver.Server()

    # server2.socket_host = "0.0.0.0"
    # server2.socket_port = 8080
    # server2.thread_pool = 30
    # server2.subscribe()

    # Start the server engine (Option 1 *and* 2)

    cherrypy.engine.start()
    cherrypy.engine.block()

保存并再次按CTRL + X并用Y确认。

运行和管理应用程序服务器


要启动服务应用程序,你只需要执行server.py使用Python安装。

运行以下命令以按配置启动服务器:

python server.py

这将在前台运行服务器。 如果你想停止它,按CTRL + C。

要在后台运行服务器,请使用以下命令:

python server.py &

当您在后台运行应用程序时,您需要使用进程管理器(例如htop)来终止(或停止)它。

设置Nginx


安装Nginx


CentOS / RHEL用户注意事项:

以下说明不适用于CentOS系统。 请参阅说明书在这里为CentOS。

运行以下命令使用aptitude安装Nginx:

sudo aptitude install nginx

要运行Nginx,请使用以下命令:

sudo service nginx start

要停止Nginx,请使用以下命令:

sudo service nginx stop

要重新启动Nginx,请使用以下命令:

# After each time you reconfigure Nginx, a restart
# or reload is needed for the new settings to come
# into effect.  
sudo service nginx restart

注意:要了解更多关于Nginx的在Ubuntu,请参阅文章: 如何在Ubuntu 12.04安装Nginx的

配置Nginx


注意:下面是使用Nginx的反向代理一个简短的教程。 要了解更多关于Nginx的,看看如何在VPS配置的Nginx Web服务器

在选择和设置一个web服务器来运行我们的应用程序后,我们可以继续对Nginx做同样的事情,并准备与后端服务器(运行WSGI应用程序)通信。

为了实现这一目标,我们需要修改Nginx的配置文件: nginx.conf

运行以下命令打开nginx.conf并使用nano文本编辑器编辑它:

sudo nano /etc/nginx/nginx.conf

您可以使用以下示例配置替换文件,以使Nginx作为反向代理工作,与应用程序通信。

复制并粘贴以下示例配置:

worker_processes 1;

events {

    worker_connections 1024;

}

http {

    sendfile on;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;

    # Configuration containing list of application servers
    upstream app_servers {

        server 127.0.0.1:8080;
        # server 127.0.0.1:8081;
        # ..
        # .

    }

    # Configuration for Nginx
    server {

        # Running port
        listen 80;

        # Settings to serve static files 
        location ^~ /static/  {

            # Example:
            # root /full/path/to/application/static/file/dir;
            root /app/static/;

        }

        # Serve a static file (ex. favico)
        # outside /static directory
        location = /favico.ico  {

            root /app/favico.ico;

        }

        # Proxy connections to the application servers
        # app_servers
        location / {

            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

        }
    }
}

完成修改配置后,按CTRL + X并使用Y确认以保存并退出。 您将需要重新启动Nginx以使更改生效。

运行以下命令重启Nginx:

sudo service nginx stop
sudo service nginx start

就这样! 在使用Nginx连接应用程序服务器后,您现在可以使用您最喜欢的浏览器访问您的Droplet的IP地址来访问它。

http://[your droplet's IP adde.]/

# Hello world!

深入阅读


如果您想了解有关Python Web应用程序部署的更多信息,建议您查看我们关于此主题的以下文章,以获得更好的一般性了解: