如何部署基于Pyramid的PythonWSGIWeb应用程序

来自菜鸟教程
跳转至:导航、​搜索

介绍


当您第一次开始开发 Python Web 应用程序时,特别是如果您来自不同的语言或具有桌面 (GUI) 应用程序的背景,您可能会在将您的新作品上线的过程中迷失方向。

在这篇 DigitalOcean 文章中,继我们之前关于 开始使用 Pyramid 并使用不同的 Web 服务器部署 Python Web 应用程序的文章中,我们将看到如何打包 Pyramid WSGI Web 应用程序,创建其依赖项列表,并部署它(即 在线发布)。

注意: 本文的示例,虽然也给出了使用示例,但遵循入门文章中使用的命名约定。 如果您对使用 Pyramid 开始 Web 应用程序开发有疑问,或者只是想熟悉以前使用的名称,您可以在此处 查看文章

词汇表


1. 金字塔简介


  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-Server 为 Pyramid 应用程序提供服务
  2. 运行和管理应用服务器

4. 设置 Nginx


  1. 安装 Nginx
  2. 配置 Nginx

金字塔简介


与一些较重的对应物相比,Pyramid 是轻量级 Python Web 应用程序框架之一。 但是,与 Flask 或其他“微型”产品不同,Pyramid 仍然具有许多开箱即用的特性和功能。

作为一个维护良好的优秀项目,Pyramid 非常受欢迎,并且有几种不同的方式(Web 服务器和方法)可以基于它部署 Web 应用程序。

Web 应用程序部署


对于所有 Python WSGI Web 应用程序,部署包括准备一个 WSGI 模块,该模块包含对 application 对象的引用,然后 Web 服务器将其用作传递请求的入口点。

WSGI


简而言之,WSGI 是 Web 服务器和应用程序本身之间的接口。 它的存在是为了确保各种服务器和应用程序(框架)之间以标准化的方式相互工作,在必要时允许互换性(例如 从开发环境切换到生产环境),这是当今的必备需求。

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

关于使用 Nginx 作为反向代理


Nginx 是一个非常高性能的 Web 服务器/(反向)代理。 由于重量轻、相对容易使用和易于扩展(使用附加组件/插件),它已经流行起来。 由于其架构,它能够处理 很多 的请求(几乎无限制),这取决于您的应用程序或网站负载 - 使用其他一些较旧的替代方案可能真的很难解决。

记住:“处理”连接在技术上意味着不丢弃它们,并且能够使用 something 为它们服务。 您仍然需要您的应用程序和数据库运行良好,以便让 Nginx 为客户端的响应提供非错误消息。

Python WSGI Web 应用程序服务器


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

它们通过接受一个 Python 模块进行操作,该模块包含 - 如前所述 - 一个可调用的应用程序 包含 网络应用程序并在网络上提供它。

虽然其中一些是可以直接使用的高能力服务器,但是前面提到的原因还是推荐使用Nginx(例如 更高的性能)。 同样,通常附带 Web 应用程序框架的开发服务器不建议在生产中使用,因为它们缺乏功能 - 当然也有少数例外

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

  • 樱桃派
  • 独角兽
  • 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,默认情况下,作为一个非常精简的服务器。 它的工具集很可能已经过时以满足您的需求, 不是 用于运行您的应用程序,而是为服务器的系统工具(例如 百胜)。

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

要了解 如何在 CentOS 6.4 和 5.8 上使用 pip 和 virtualenv 设置 Python 2.7.6 和 3.3.3,请参阅:如何设置 Python 2.7.6 和 3.3。 3 在 CentOS 上。

在 Ubuntu 和 Debian 上,默认提供最新版本的 Python 解释器,您可以使用它。 它使我们只需要安装有限数量的附加软件包:

  • python-dev – 开发工具
  • pip – 管理包
  • virtualenv – 创建隔离的虚拟环境

蟒蛇开发:


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

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

aptitude install python-dev

点:


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 权限。

虚拟环境:


最好在自己的环境中包含 Python 应用程序及其所有依赖项。 可以将环境最好(简单地说)描述为所有内容所在的隔离位置(目录)。 为此,使用了一个名为 virtualenv 的工具。

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

sudo pip install virtualenv

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


注意: 本节重点介绍从上一教程中在线获取我们的示例单页应用程序。

目前,我们有一个单页应用程序(即 application.py) 是为服务“Hello world!”而构建的。 使用 Pyramid 的开发服务器在端口 8080 上。

我们当前的工作目录位于 ~/pyramid_sites/hello_world

我们当前的 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 可能——而且通常——比其他的更容易接受。

要使用 nano 文本编辑器创建 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 中运行它,列表将包含安装在环境 only 中的包。 否则,将列出全局安装的所有软件包。

从应用程序依赖项列表下载


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

注意: 这部分包含要在您的产品中执行的信息(即 部署)机器/环境。

pip install -r requirements.txt

此命令将下载并安装所有列出的软件包。 如果您在激活的环境中工作,文件将在那里下载。 否则,它们将被全局安装 - 这是 而不是 推荐的方式,原因在前几节中解释。

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


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

在本文中,我们将专注于使用 CherryPy,因为它的功能和简单性相结合。

注意: 这里给出的指令是简短的。 要了解更多信息,请查看我们关于 pip 和 virtualenv 常用 Python 工具:virtualenv 和 pip 的操作指南文章。 如果您正在使用基于 CentOS 的服务器,您可能还想查看 如何在 CentOS 上设置 Python 2.7.6 和 3.3.3 文章。

使用 CherryPy Web-Server 为 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 服务器创建示例服务器应用程序:

# 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 确认再次保存并退出。

运行和管理应用服务器


要开始为您的应用程序提供服务,您只需使用 Python 安装执行 server.py

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

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

注意:想了解更多关于Ubuntu上的Nginx,请参考我们的文章:如何在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 应用程序部署的更多信息,建议您查看我们关于该主题的以下文章以获得更好的总体理解: