如何通过Nginx反向代理部署CherryPy Web应用程序

介绍

CherryPy的是创建Web的应用程序和一个很好的框架 API各种规模的-从“GET-开始与- Python的” 你好,世界上有什么可以成为世界上最繁忙的网站之一 !! 如果你是来自不同的语言,当你第一次使用CherryPy开发开发时,让你的新应用程序在线的过程可能显得有点不熟悉。 在这篇DigitalOcean文章中,我们将通过两种很好的方式部署一个基于CherryPy的绝对基于Web的应用程序,并使用pip管理它的依赖关系。

词汇表

CherryPy和Web应用程序部署简介

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

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

  1. 创建应用程序结构
  2. 编辑“应用程序/ 初始化的.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. 从应用程序依赖关系列表下载

5.开始部署:下载,安装和设置Nginx

  1. 安装Nginx
  2. 配置Nginx

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

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

CherryPy和Web应用程序部署简介

CherryPy作为一个整体是一个极简的Python Web应用程序开发框架,没有随机提供太多的组件,无论你想要他们与否。该框架处理所有你可能需要的核心必需品,离开休息(如会话,缓存,文件上传等) -而选择-怎样使用以及如何使用由 决定。 它本身从它的简单其他Python框架分开使用发货,准备部署 HTTP / 1.1兼容的,WSGI线程池Web服务器上网。

Web应用程序部署

对于所有Python WSGI Web应用程序,部署包括准备一个WSGI模块,该模块包含对应用程序对象的引用,然后将其用作Web服务器传入请求的入口点。 注:但是,在使用CherryPy的自己的服务器的情况下,这个过程变得更简单,你并不特别需要担心。 在我们的文章中,我们将看到两种不同的应用程序部署方式:
  • 使用CherryPy的默认Web服务器,适用于大多数应用程序,以及;
  • 对需要深入配置功能的应用程序使用另一个备用应用程序服务器(uWSGI)。

WSGI

简而言之,WSGI是Web服务器和应用程序本身之间的接口。存在以确保各种服务器和应用(框架)之间的标准化方式以彼此工作,在必要时允许可互换性(即,从开发到生产环境的切换),这是当今必需的。 注意:如果你有兴趣了解更多关于 WSGIPython的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
  • 服务员

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

CherryPy的纯Python Web服务器是一个紧凑的解决方案,与名称框架。由[CherryPy的]项目定义为“高速,生产准备,线程池,一般的HTTP服务器”,它是可以用来服务于 任何的Python WSGI web应用模块化的组件。 CherryPy Web服务器的亮点:
  • 一个非常紧凑和简单的使用纯Python解决方案
  • 易于配置,使用方便
  • 线程池和快速
  • 允许缩放
  • 支持SSL

uWSGI

以下是从上述DigitalOcean的提取物 的Python服务器比较制品。
尽管它非常混乱的命名规则,uWSGI本身就是一个浩大的工程包含多个组件,旨在为建设 托管服务提供完整的软件。 其中一个组件,uWSGI服务器,运行Python WSGI应用程序。 它能够使用多种协议,包括自己的 uwsgi线协议 ,这是准等同于SCGI的。为了满足在应用服务器前使用独立HTTP服务器的理解需求,NGINX和Cherokee Web服务器被模块化,以支持uWSGI的自己的最佳性能的uwsgi协议,以直接控制其进程。 uWSGI亮点
  • uWSGI带有一个WSGI适配器,它完全支持在WSGI上运行的Python应用程序。
  • 它与libpython链接。它在启动时加载应用程序代码,并像一个Python解释器。它解析传入的请求并调用Python可调用。
  • 它直接支持流行的NGINX Web服务器(与Cherokee *和lighttpd一起)。
  • 它写在C.
  • 它的各种组件可以做更多的运行一个应用程序,这可能是方便的扩展。
  • 目前(截至2013年底),它是积极开发和具有快速释放周期。
  • 它具有用于运行应用程序(异步和同步)的各种引擎。
  • 它可以意味着更低的内存占用运行。

使用“app”对象公开一个简单的CherryPy应用程序

让我们开始我们的部署示例,创建一个新的CherryPy应用程序用作示例。 注:这里的应用实例使用虚拟环境来管理应用程序文件和它的依赖。 要了解有关 画中画virtualenv中 ,看看我们的教程 常用的Python工具:使用的virtualenv,用Pip安装和管理软件包

创建应用程序结构

我们希望使用一个简单的例子,它应该类似于一个非常简约但实际的应用程序。 为此,我们可以创建类似于这样的东西:
myy_app
  |-- wsgi.py
  |__ /app
        |-- __init__.py
首先,让我们创建一个应用程序文件夹和一个应用程序模块:
mkdir ~/my_app
mkdir ~/my_app/app
随后,让; S创建应用程序文件和 wsgi.py部署所需的文件:
touch ~/my_app/wsgi.py
touch ~/my_app/app/__init__.py

编辑“应用程序/ 初始化的.py”利用纳米

我们已经创建了 app包,包含我们的示范性应用模块。 现在,我们可以编辑 __init__.py来定义它。
nano ~/my_app/app/__init__.py
复制并粘贴以下脚本:
import cherrypy

class Root(object):
    @cherrypy.expose
    def index(self):
        return "Hello, world!"
按CTRL + X,并用Y确认保存并退出。

使用nano编辑“wsgi.py”

wsgi.py文件将被用于 公开的入口点你的应用程序。在我们的示例中,在此文件中,我们将导入应用程序模块(app),并使用CherryPy的WSGI Web服务器直接运行它,或者将其传递到包含它并运行的uWSGI。
nano ~/my_app/wsgi.py
复制并粘贴以下内容:
import cherrypy
from app import Root

app = cherrypy.tree.mount(Root(), '/')

if __name__=='__main__':

    cherrypy.config.update({
        'server.socket_host': '127.0.0.1',
        'server.socket_port': 8080,
    })

    # Run the application using CherryPy's HTTP Web Server
    cherrypy.quickstart(Root())
按CTRL + X,并用Y确认保存并退出。

准备系统以进行CherryPy部署

更新系统

为了有一个稳定的部署服务器,保持最新和良好的维护至关重要。 为了确保我们有最新的可用版本的默认应用程序,我们需要更新我们的系统。 对于基于Debian的系统(即Ubuntu,Debian),运行以下命令:
aptitude    update
aptitude -y upgrade
对于基于RHEL的系统(即CentOS),运行以下命令:
yum -y update

设置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的 (开发工具),
  • PIP(管理包),
  • 的virtualenv(创建隔离,虚拟
注:安装某些应用程序继续之前,特别是如果从源代码构建,你可能需要安装必要的开发工具, 建立必要的使用以下命令:
aptitude install -y build-essential

python-dev

python-dev是一个操作系统级包,其中包含用于构建Python模块的扩展开发工具。 运行以下命令使用aptitude安装python-dev:
aptitude install -y python-dev

# You might need python2.7-dev
# aptitude install -y python2.7-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

下载并安装CherryPy

CherryPy框架可以使用pip包管理器安装。 运行以下命令以安装 CherryPy的使用PIP:
# Install CherryPy Framework and HTTP Web-Server
pip install cherrypy

下载并安装uWSGI

始终是将所有与应用程序相关的元素尽可能多地包含在虚拟环境中的推荐方式。所以我们将下载并安装uWSGI。 如果你 不是一个环境中工作,uWSGI将在全球范围内安装(即提供系统范围)。 不建议这样做-总是选择使用 的virtualenv。 要使用pip安装uWSGI,请运行以下命令:
pip install uwsgi

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

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

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

获取生产环境的依赖关系的最简单的方法是使用pip。用一个命令,它能够产生所有包(或依赖)已安装的(你 启动的环境中,如果没有, 在全球您的系统上),并再次用一个命令,它可以让你拥有所有这些下载和安装。 注意:此部分包含无论你想生成的应用程序依赖关系列表这是在您的本地开发机器或执行的信息。此文件应放置在应用程序目录中,并上传到您的服务器。 使用“pip”创建已安装软件包的列表:
pip freeze > requirements.txt
此命令将创建一个名为 requirements.txt它包含所有已安装的软件包列表。 如果您在的virtualenv内运行,该列表将 由环境中安装的软件包。否则,将列出全局安装的所有软件包。

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

使用pip从列表中安装软件包: 注:本部分包含这是要在你的生产(即部署)的机器/环境下执行的信息。
pip install -r requirements.txt
此命令将下载并安装所有列出的软件包。如果您在激活的环境中工作,文件将在那里下载。否则,他们将在全球范围内安装-这是 推荐的方法的原因在前面的章节中说明。

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

不管服务器的选择,我们的CherryPy应用程序将在Nginx后面上线,原因我们在前面的部分中已经提到。所以,让我们首先下载并配置Nginx,然后继续工作的应用服务器。 基本服务器体系结构示例:
Client Request ----> Nginx (Reverse-Proxy)
                        |
                       /|\                           
                      | | `-> App. Server I.   127.0.0.1:8080 # Our example
                      |  `--> App. Server II.  127.0.0.1:8082
                       `----> App. Server III. 127.0.0.1:8083

安装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并采用纳米文本编辑器编辑:
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

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

创建了一个示例应用程序并通过管理依赖关系,我们已经准备好开始部署的最后阶段:设置服务器。 正如上面提到的,在这篇文章中,我们将重点介绍如何使用 CherryPy的uWSGI Web应用程序服务器Nginx的背后。

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

CherryPy的纯Python Web服务器是一个紧凑的解决方案与框架。它被项目定义为“高速,生产就绪,线程池化,通用HTTP服务器”。 既然我们已经使用该框架开发的,我们的内部程序 wsgi.py已经准备开始运行后,它服务。 我们的设置为CherryPy匹配我们的配置Nginx:
# ..

cherrypy.config.update({
    'server.socket_host': '127.0.0.1',
    'server.socket_port': 8080,
})

# ..

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

要启动服务应用程序,你只需要执行 server.py使用Python安装。 运行以下命令以按配置启动服务器:
python ~/my_app/wsgi.py
这将在前台运行服务器。如果你想停止它,请按 Ctrl + C。 要在后台运行服务器,请使用以下命令:
python ~/my_app/wsgi.py &
当您在后台运行应用程序时,您需要使用进程管理器(例如htop)来终止(或停止)它。

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

虽然极其能力和强大,CherryPy自己的HTTP服务器不是所有的设置或部署。如果您需要调整大量选项以匹配所需的配置设置,uWSGI可能是您的解决方案。

运行服务器

uWSGI有很多选项和配置,有许多可能的使用方法,由于它的灵活性。从一开始就没有复杂的事情,我们将开始使用它尽可能简单,并继续使用更先进的方法。 注意:确保要在 my_app文件夹执行命令之下,否则uwsgi将无法找到前 wsgi.py也不导入应用程序对象的应用程序。 简单用法示例:
uwsgi [option] [option 2] .. -w [wsgi file with app. callable]
要运行uWSGI从wsgi.py开始提供应用程序,请运行以下命令:
uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi:app
这将在前台运行服务器。如果你想停止它,请按 Ctrl + C。
要在后台运行服务器,请运行以下命令:
uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi:app &
当您在后台运行应用程序时,您需要使用进程管理器(例如htop)来终止(或停止)它。有关详细信息,请参阅下面的部分。
就这样!在使用Nginx连接应用程序服务器后,您现在可以使用您最喜欢的浏览器访问您的Droplet的IP地址来访问它。
http://[your droplet's IP adde.]/

# Hello, world!

深入阅读

如果您想了解有关Python Web应用程序部署的更多信息,建议您查看我们关于此主题的以下文章,以获得更好的一般性了解:
:提交 OS Tezer
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏