如何在 Nginx 反向代理后部署 CherryPy 网络应用程序

介绍


CherryPy是一个很好的框架来创建各种尺寸的Web应用程序和API(http://docs.cherrypy.org/dev/progguide/REST.html) - 从一个从Python开始 _Hello,世界! _到什么可以成为世界上最繁忙的网站之一!

如果你来自不同的语言,在你开始使用CherryPy开发时,在线获得新应用程序的过程可能有点陌生。

在这篇DigitalOcean文章中,我们将通过使用Pip来部署一个绝对坚实的基于CherryPy的Web应用程序以及管理其依赖的两种好方法。

词汇


1. CherryPy 和 Web 应用程序的部署简要


  1. Web 应用程序部署 2. WSGI 3. 使用 Nginx 作为反向代理 4. Python (WSGI) Web 应用程序服务器 5. CherryPy 的应用程序 (HTTP) 服务器简要 6. uWSGI

准备一个简单的CherryPy应用程序与应用对象暴露


  1. 创建应用结构 2. 使用 nano 编辑 app/**init** .py 3. 使用 nano 编辑 wsgi.py

3. 准备 CherryPy 部署的系统


  1. 更新系统 2. 设置 Python、pip 和 virtualenv 3. python-dev 4. pip 5. virtualenv 6. 下载和安装 CherryPy 7. 下载和安装 uWSGI

4. 如何使用 pip 处理应用程序依赖


  1. 创建应用程序依赖的列表 2. 从应用程序依赖的列表下载

开始部署:下载、安装和设置 Nginx


  1. 安装 Nginx 2. 配置 Nginx

创建 Python WSGI Web 应用服务器


  1. 使用 CherryPy 自己的 Web 服务器服务应用程序 [] 2. 运行和管理 CherryPy 应用程序服务器 3. 使用 uWSGI 服务应用程序 [] 4. 运行服务器

CherryPy 和 Web 应用程序部署简要


CherryPy作为一个整体是一个最小化的Python网络应用程序开发框架,它不会运出太多的组件出盒,不管你是否想要. 框架处理您可能需要的所有核心必需品( 如会话、 缓存、 文件上传等) , 并留下其它的 - 以及选择 - 使用什么和如何使用, 由_ You_ 决定 。 它与其他 Python 框架分开,简便地使用已运出,准备部署符合HTTP/1.1的WSGI线条集成的Web Server .

Web 应用部署


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

** 注意:** 但是,如果您使用 CherryPy 自己的服务器,这个过程会变得更简单,您不必担心。

在我们的文章中,我们将看到两个不同的应用部署方式:

  • 使用 CherryPy 的默认 Web 服务器,对于大多数应用程序都非常好; 使用其他替代应用程序服务器 (uWSGI) 用于需要深入配置能力的应用程序。

名称:WSGI


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

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

使用 Nginx 作为反向代理


Nginx 是一个非常高性能的 Web 服务器 / (反向) - 代理服务器. 它因其轻量,相对易于使用和易于扩展(通过插件 / 插件)而获得了其受欢迎性。 由于其架构,它能够处理 a lot 请求(几乎无限),这 - 取决于您的应用程序或网站的负载 - 可能很难使用其他一些较旧的替代方案来解决。

记住:处理连接在技术上意味着不放弃它们,并且能够为它们提供服务。

Python(WSGI) Web 应用服务器


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

它们通过接受包含 - 如前所述 - 可调用到 contain 的 Web 应用程序的 Python 模块而运作,并在网络上提供服务。

虽然其中一些是可以直接使用的高性能服务器,但出于上述原因(例如较高的性能)建议在前面使用 Nginx。

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

  • CherryPy
  • Gunicorn
  • uWSGI
  • waitress

CherryPy的应用程序(HTTP)服务器简要


CherryPy 的纯 Python Web 服务器是一个紧凑的解决方案,配备了类似的框架,由 CherryPy 项目定义为高速,生产准备,线程聚合,通用 HTTP 服务器,它是一个模块化的组件,可以用来服务任何 Python WSGI Web 应用程序。

CherryPy Web 服务器的亮点:

  • 非常紧凑,易于使用纯Python解决方案 * 易于配置,易于使用 * 带有线和快速 * 允许扩展 * 支持SSL


以下是上述DigitalOcean Python Server Comparison文章的摘要。

尽管命名惯例非常混乱, uWSGI本身是一个庞大的项目, 其中之一的uWSGI服务器运行了Python WSGI应用程序. 它能够使用各种协议,包括它自己的_uwsgi电线协议_,它与SCGI准同. 为了满足在应用程序服务器前使用独立的HTTP服务器这一可以理解的需求,NGINX和切罗基网络服务器被模块化,以支持uWSGI的[自有]性能最好的uwsgi协议,直接控制其进程.

主持人:UWSGI Highlights

*uWSGI带有WSGI适配器,它完全支持在WSGI上运行的Python应用程序.

  • 联合国 它链接到_libpython_. 它在启动时加载应用程序代码,并起到像Python解释器的作用. 它解析了收到的请求并引用了可调用的 Python 。
  • 联合国 它直接支持受欢迎的NGINX网络服务器(与切罗基*和lighttpd一起).
  • 联合国 其文为C.
  • 联合国 其各种组件所能做的远不止运行一个应用程序,它可能有利于扩展.
  • 目前(截至2013年底),它正在积极开发,并且有快速的释放周期。
  • 联合国 它拥有各种运行应用(同步和同步)的引擎.
  • 联合国 可以指: 更低的内存足迹来跑. .

准备一个简单的 CherryPy 应用程序与应用对象暴露


让我们开始我们的部署示例,创建一个新的 CherryPy 应用程序以作为样本使用。

** 注意: ** 这里的应用程序示例使用虚拟环境来管理应用程序文件及其依赖性. 要了解 ** pip** 和 ** virtualenv** ,请参阅我们的教程 常见的Python工具:使用virtualenv,安装与Pip,和管理包

创建应用程序结构


我们想用一个简单的例子工作,这应该看起来像一个非常简洁但实际的应用程序。

为此,我们可以创建类似于此的东西:

1myy_app
2  |-- wsgi.py
3  |__ /app
4        |-- __init__.py

首先,让我们创建一个应用程序文件夹和一个应用程序模块:

1mkdir ~/my_app
2mkdir ~/my_app/app

之后,让我们创建应用程序文件和部署所需的 wsgi.py 文件:

1touch ~/my_app/wsgi.py
2touch ~/my_app/app/__init__.py

使用 nano 编辑app/**init** .py


我们创建了app包以包含我们的示例应用模块,现在我们可以编辑__init__.py来定义它。

1nano ~/my_app/app/__init__.py

复制并粘贴下面的脚本:

1import cherrypy
2
3class Root(object):
4    @cherrypy.expose
5    def index(self):
6        return "Hello, world!"

按 CTRL + X 并用 Y 确认保存和退出。

使用 nano 编辑 wsgi.py


在我们的例子中,在这个文件中,我们将导入应用模块(应用程序)并直接使用CherryPy的WSGI网络服务器运行它,或者将其传递给uWSGI,其中包含它并运行。

1nano ~/my_app/wsgi.py

复制并粘贴下面的内容:

 1import cherrypy
 2from app import Root
 3
 4app = cherrypy.tree.mount(Root(), '/')
 5
 6if __name__=='__main__':
 7
 8    cherrypy.config.update({
 9        'server.socket_host': '127.0.0.1',
10        'server.socket_port': 8080,
11    })
12
13    # Run the application using CherryPy's HTTP Web Server
14    cherrypy.quickstart(Root())

按 CTRL + X 并用 Y 确认保存和退出。

为 CherryPy 部署准备系统


更新系统


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

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

对于基于 Debian 的系统(即 Ubuntu、Debian),运行以下操作:

1aptitude update
2aptitude -y upgrade

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

1yum -y update

设置 Python、Pip 和 virtualenv


翻译: ** CentOS / RHEL 用户说明:** 翻译: ** CentOS / RHEL** ,默认为作为非常精细的服务器而来. 它的"工具"可能为您的需要而过时,不是** ** 在那里运行您的应用程序,而是为服务器的系统工具提供动力(例如YUM). 翻译: 翻译: 为了准备您的 CentOS 系统, Python 需要建立( 即从源头编译) , pip * / virtualenv 需要使用该解释器安装 。 翻译: 翻译: 要了解在CentOS 6.4和5.8 上如何设置Python 2.7.6和3.3.3,加上** pip** 和** virtualenv** ,请参见:[如何设置Python 2.7.6和3.3.3在CentOS上 (https://www.digitalocean.com/community/articles/how-to-set-up-python-2-7-6-and-3-3-3-on-centos-6-4).

在Ubuntu和Debian上,你可以使用的Python翻译器的最新版本是默认的,它只留给了我们一个有限的额外包来安装:

  • python-dev (开发工具), * ** pip** (用于管理包), * ** virtualenv** (用于创建孤立、虚拟的软件)

** 注意:** 在继续安装某些应用程序之前,特别是如果从源构建,您可能需要使用以下命令安装必备的开发工具 build-essential:

1aptitude install -y build-essential

首页 > python-dev


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

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

1aptitude install -y python-dev
2
3# You might need python2.7-dev
4# aptitude install -y python2.7-dev

◎【PIP】


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

运行以下命令来安装 pip:

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

您可能需要 sudo 特权。

虚拟化


最好将一个Python应用程序包含在其自身的 environment 内,以及其所有依赖性。 一个环境可以最好地描述(简单地说)作为一个孤立的位置(一个目录),其中一切都在。

运行以下操作以使用 pip 安装 virtualenv:

1sudo pip install virtualenv

下载和安装 CherryPy


CherryPy 框架可以通过 pip 包管理器安装。

运行以下操作以使用 pip 安装 cherrypy :

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

下载和安装 uWSGI


它始终是建议的方式来包含所有应用程序相关的元素,尽可能多,在虚拟环境中一起,所以我们将下载和安装uWSGI作为这样的。

如果您在环境中 工作,则 uWSGI 将被安装在全球范围内(即可在整个系统中使用)。

若要使用 pip 安装 uWSGI,请执行以下操作:

1pip install uwsgi

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


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

创建应用依赖的列表


使用单个命令,它能够生成您已安装的所有包(或依赖)(在您的 激活 环境中,如果没有,在您的系统上全球** ),再一次用一个命令,它允许您将它们全部下载和安装。

** 注意: ** 本节包含在本地开发机器上或您想要生成应用程序依赖性列表的任何地方执行的信息,该文件应放在您的应用程序目录中并上传到您的服务器。

使用pip创建安装包列表:

1pip freeze > requirements.txt

此命令将创建一个名为requirements.txt的文件,其中包含所有安装的包的列表. 如果您在 virtualenv 中运行它,则该列表将包括在环境中安装的包

从应用程序依赖的列表中下载


使用Pip从列表中安装包:

注:本节包含在您的生产(即部署)机器/环境上执行的信息。

1pip install -r requirements.txt

此命令将下载并安装列出的所有包. 如果您在启用环境中工作,文件将被下载到那里.否则,它们将被全球安装 - 这是 not 推荐的方式,原因在上一节解释。

开始部署:下载、安装和设置 Nginx


无论服务器的选择,我们的 CherryPy 应用程序都会在 Nginx 后面在线,因为我们在上一节提到的原因,所以,让我们先下载和配置 Nginx 并继续工作应用程序服务器。

** 基本服务器架构的示例:**

1Client Request ----> Nginx (Reverse-Proxy)
2                        |
3                       /|\                           
4                      | | `-> App. Server I. 127.0.0.1:8080 # Our example
5                      |  `--> App. Server II. 127.0.0.1:8082
6                       `----> App. Server III. 127.0.0.1:8083

安装 Nginx


** 注意 CentOS / RHEL 用户:** > > 下面的指示不会在 CentOS 系统上工作. 请参阅 CentOS 的指示 这里

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

1sudo aptitude install nginx

要运行 Nginx,请使用以下方法:

1sudo service nginx start

要停止 Nginx,请使用以下方法:

1sudo service nginx stop

若要重新启动 Nginx,请使用以下方法:

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

** 注意:** 若要了解有关 Ubuntu 上 Nginx 的更多信息,请参阅我们的文章: 如何在 Ubuntu 12.0 上安装 Nginx

配置 Nginx


** 注意:** 下面是使用 Nginx 作为反向代理程序的更简短的教程. 有关 Nginx 的更多信息,请参阅 如何在 VPS 上配置 Nginx Web Server

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

要做到这一点,我们需要修改 Nginx 的配置文件: nginx.conf

运行以下命令,打开「nginx.conf」并使用纳米文本编辑器编辑它:

1sudo nano /etc/nginx/nginx.conf

您可以用以下示例配置来替换文件,以便 Nginx 作为反向代理程序工作,与您的应用程序交谈。

复制并粘贴下面的示例配置:

 1worker_processes 1;
 2
 3events {
 4
 5    worker_connections 1024;
 6
 7}
 8
 9http {
10
11    sendfile on;
12
13    gzip on;
14    gzip_http_version 1.0;
15    gzip_proxied any;
16    gzip_min_length 500;
17    gzip_disable      "MSIE [1-6]\.";
18    gzip_types text/plain text/xml text/css
19                      text/comma-separated-values
20                      text/javascript
21                      application/x-javascript
22                      application/atom+xml;
23
24    # Configuration containing list of application servers
25    upstream app_servers {
26
27        server 127.0.0.1:8080;
28        # server 127.0.0.1:8081;
29        # ..
30        # .
31
32    }
33
34    # Configuration for Nginx
35    server {
36
37        # Running port
38        listen 80;
39
40        # Settings to serve static files 
41        location ^~ /static/  {
42
43            # Example:
44            # root /full/path/to/application/static/file/dir;
45            root /app/static/;
46
47        }
48
49        # Serve a static file (ex. favico)
50        # outside /static directory
51        location = /favico.ico  {
52
53            root /app/favico.ico;
54
55        }
56
57        # Proxy connections to the application servers
58        # app_servers
59        location / {
60
61            proxy_pass http://app_servers;
62            proxy_redirect off;
63            proxy_set_header Host $host;
64            proxy_set_header X-Real-IP $remote_addr;
65            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
66            proxy_set_header X-Forwarded-Host $server_name;
67
68        }
69    }
70}

当您完成更改配置时,请按 CTRL + X 并用 Y 确认保存和退出,您需要重新启动 Nginx 以便更改生效。

** 运行以下操作来重新启动 Nginx:**

1sudo service nginx stop
2sudo service nginx start

创建 Python WSGI Web 应用服务器


创建了样本应用程序并通过管理依赖方式,我们已经准备好开始部署的最后阶段:设置服务器。

如上所述,在本文中,我们将专注于使用 CherryPy 和 ** uWSGI** 网页应用服务器背后的 Nginx。

使用 CherryPy 自己的 Web 服务器服务应用程序 [*]


CherryPy 的纯 Python 网页服务器是一个紧凑的解决方案,该解决方案附带框架,该项目将其定义为高速,生产准备,线程聚合,通用 HTTP 服务器

由于我们已经使用框架开发,所以我们在wsgi.py内部的程序已经准备好在运行时开始服务。

我们的 CherryPy 设置匹配我们的 Nginx 配置:

1# ..
2
3cherrypy.config.update({
4    'server.socket_host': '127.0.0.1',
5    'server.socket_port': 8080,
6})
7
8# ..

运行和管理 CherryPy 应用服务器


要開始服務您的應用程式,您只需使用 Python 安裝程式執行「server.py」。

运行以下操作以按配置启动服务器:

1python ~/my_app/wsgi.py

这将使服务器在前面运行. 如果您想阻止它,请按 CTRL+C

要在背景中运行服务器,请使用以下方法:

1python ~/my_app/wsgi.py &

当您在背景中运行应用程序时,您需要使用一个流程管理器(例如 htop)来杀死(或停止)它。

使用 uWSGI 服务应用程序 [*]


虽然它非常有能力和强大,但CherryPy的HTTP服务器并非适合所有设置或部署,如果你需要能够调整很多选项以匹配你想要的配置设置,uWSGI可能是你的解决方案。

运行服务器


uWSGI有许多选项和配置,由于其灵活性,有许多可能的方式来使用它们. 没有从一开始就复杂的事情,我们将开始尽可能简单地处理它,并继续使用更先进的方法。

** 注意:** 在执行下面的命令之前,请确保位于my_app文件夹中,否则 uwsgi 将无法找到wsgi.py或导入应用程序对象应用程序。

简单的使用例子:**

1uwsgi [option] [option 2] .. -w [wsgi file with app. callable]

** 要运行 uWSGI 以便从 wsgi.py 开始服务应用程序,请执行以下操作:**

1uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi:app

这将使服务器在前台运行. 如果您想阻止它,请按 CTRL+C

** 要在背景中运行服务器,请执行以下操作:**

1uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi:app &

当您在背景中运行应用程序时,您需要使用一个流程管理器(例如 htop)来杀死(或停止)它。

在将应用程序服务器连接到 Nginx 后,您现在可以通过使用您喜爱的浏览器访问您的 Droplet 的 IP 地址。

1http://[your droplet's IP adde.]/
2
3# Hello, world!

继续阅读


如果您想了解更多关于 Python Web 应用程序部署的信息,建议您查看以下有关该主题的文章,以获得更全面的了解:

Submitted by: O.S. Tezer
Published At
Categories with 技术
comments powered by Disqus