如何部署的Python WSGI应用中使用的CherryPy Web服务器Nginx

介绍

在阅读本教程的标题后,你会发现自己提出这些问题之一:
  • 为什么我应该使用CherryPy的纯Python Web服务器而不是一个“真正的”独立(可能基于C)一个为我的WSGI应用程序?
  • CherryPy ...不是一个框架?这是与我的瓶,瓶等基于应用程序的部署有什么关系?
有两个很好的答案和原因。在这篇DigitalOcean文章中,我们将会找到它们。我们将首先谈论CherryPy究竟是什么,以及将它用于您的Web应用程序的优点。我们将继续解释“为什么”,最重要的是“如何”使用CherryPy的Web服务器部署Python应用程序。

词汇表

1.了解CherryPy和使用Nginx

  1. CherryPy WSGI Web服务器简介
  2. 为什么要使用CherryPy的WSGI Web服务器进行部署?
  3. 使用Nginx作为反向代理在CherryPy前面

2.准备您的Droplet进行生产

  1. 更新默认操作系统
  2. 设置Python,pip和virtualenv
  3. 创建虚拟(Python)环境
  4. 下载并安装CherryPy
  5. 下载和安装Nginx

3.使用CherryPy Web服务器提供Python Web应用程序

  1. WSGI
  2. WSGI应用程序对象(可调用):wsgi.py
  3. 创建脚本以使用CherryPy Web Server:server.py
  4. 运行服务器

4.配置Nginx

5.其他提示和建议

了解CherryPy和使用Nginx

CherryPy作为一个整体是一个简约的Python Web框架。这里的极简主义意味着,不管你喜欢(或需要)它们,它们都不是现成的。极简主义基本上是不向开发者施加任何东西,而不给他们选择。 CherryPy和其他这样的框架通常处理人们期望的核心必需品(例如会话,缓存,文件上传等),并留下剩余和选择 - 使用什么和如何使用来决定由 。 将CherryPy与其他Python框架(包括一些“完全成熟”的框架)区分开来的是它的开发人员的目标是提供它准备工作(即开发)并准备部署为自包含的应用程序包(包)。为了实现这个任务,对于web应用程序,一个坚实的web服务器是必须的。这正是擅长的CherryPy,拥有自己的 HTTP / 1.1兼容的,WSGI线程池的Web服务器 。它是生产准备好,只是太棒了。

CherryPy WSGI Web服务器简介

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

为什么要使用CherryPy的WSGI Web服务器进行部署?

正如我们在开始时提到的,你可能想知道使用这个解决方案的原因,而不是你可能听说过甚至尝试的另一个嘲讽和着名的。事实的真相是,由于WSGI的优秀规范,它是相当容易创建一个Web服务器。多年来,这产生了许多,其中一些达到一定程度的人气,最保留隐藏在其开发的机器。 选择的数量是巨大的,他们(大多数)在很大程度上做同样的事情。 为什么应该使用CherryPy Web服务器来部署应用程序? 答案很简单:与工作是一种快乐。使用CherryPy的服务器来轻松地使用WSGI Web应用程序是一个例外。当你在一两分钟内起床并跑步时,它会为你节省大量的头痛。它可以在一定程度上定制,使您能够通过单个文件(例如server.py)以最简单的方式运行多进程和多线程实例。
请记住:对于多进程设定时,你将需要多个配置的“服务器”对象实例。
除非你确定在你的应用程序上线几分钟内,它将每秒获取成千上万的请求,你不能简单地使用更多的服务器来平衡负载,那么你最好使用你的时间来继续开发应用程序比麻烦与库,CPU优化,处理崩溃等。 CherryPy的Web服务器,再加上使用 的Nginx作为反向代理前置是一个真正的摇滚服务于Python的WSGI基于Web的应用程序,它在瓶子的顶部是否制定可靠的方法,CherryPy的,Django的,瓶,Pyramid或(轻松)任何其他框架。
记住 :以上提到的架构(下文解释)使您可以轻松横向扩展(更多的服务器),甚至垂直(更每台服务器的容量)。你的“瓶颈”很可能是后端(数据库)。这就是为什么不值得你的时候尝试优化的东西死亡,甚至有一个承诺极端负荷。即使如此,一个合理的缓存机制,如果介绍,可能会解决你的大多数问题。

使用Nginx作为反向代理在CherryPy前面

Nginx的是一个非常高的高性能 Web服务器 /( 反向)-proxy。 它已经达到了它的普及,由于重量轻,相对容易工作和易于扩展(与附加/插件)。 由于它的结构,它能够处理 大量的哪些请求(几乎 不受限制 )的-这取决于你的应用程序或网站负载-可能是真的很难用一些其他的,旧的替代品来解决。
请记住:“处理”连接技术上意味着不会放弃他们,并能与 一些为他们服务。 你仍然需要你的应用程序和数据库运作良好,才能有Nginx的为客户服务 的反应是不错误消息。
为什么应该使用Nginx作为应用服务器前面的反向代理? 虽然您的应用程序服务器 - 在我们的案例中的CherryPy WSGI Web服务器 - 可以提供您的应用程序及其静态文件(例如javascript,css,图像等),使用反向代理是一个非常好的主意,前面,如Nginx。这减轻了不少负担的[从应用服务器作为其处理 客户端请求(和间接费用)以及其他各种任务,给予你一个更好的整体性能。 随着应用程序的增长,您将需要优化它,当时间到来时,将它分布在服务器上,以便能够同时处理更多的连接,并拥有一个更稳健的架构。在应用服务器前面有一个反向代理可以从头开始帮助你。 它的可扩展性(例如本地缓存以及故障转移和其他机制)也是一个伟大的壮举,有利于Web应用程序不同于(更简单的)应用程序服务器。 基本服务器体系结构示例:
Client Request ----> Nginx (Reverse-Proxy)
                        |
                       /|\                           
                      | | `-> App. Server I.   127.0.0.1:8081
                      |  `--> App. Server II.  127.0.0.1:8082
                       `----> App. Server III. 127.0.0.1:8083
注意:当一个应用程序设置为侦听传入连接 127.0.0.1 ,就只可能在本地访问它。 如果使用 0.0.0.0 ,但是,它将接受 来自外部的连接以及。

准备您的Droplet进行生产

在本节中,我们将准备我们的Droplet用于生产(即部署我们的应用程序)。 我们将从:
  • 更新默认操作系统
  • 下载和安装常见的Python工具(即pip,virtualenv)
  • 并创建一个虚拟环境来包含应用程序(其依赖关系如CherryPy驻留在其中)。
注意:这里给出的说明保持简短。 要了解更多信息,请访问我们的how-to文章 PIP的virtualenv: 常用的Python工具:使用的virtualenv,用Pip安装和管理软件包

更新默认操作系统

注意:我们将在一个新的Droplet进行以下设置和准备使用的操作系统的最新版本。在理论上,你不应该在你的服务器上尝试它们有问题。但是,如果您已经积极使用它,我们强烈建议在尝试之前切换到新系统。
为了确保我们有最新的可用版本的默认应用程序,我们需要更新我们的系统。 对于基于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个点和virtualenv中,请参考: 如何设置的Python 2.7.6和3.3.3在CentOS
在Ubuntu和Debian上,您可以使用的最新版本的Python解释器默认情况下。它使我们只有有限数量的额外的软件包安装:
  • python-dev(开发工具),
  • pip(管理包),
  • 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

创建自包含的虚拟(Python)环境

拥有所有必要的工具,我们可以创建一个环境部署我们的应用程序。 记住:如果你没有得到你的发展的virtualenv(本地)机为你的项目,你应该考虑创建一个,内移动应用程序(及其依赖)。 让我们创造这将包含 虚拟环境应用程序模块的文件夹开始:
您可以在这里使用任何名称,以满足您的需要。
mkdir my_app
我们可以继续输入此文件夹并在其中创建一个新的虚拟环境:
您还可以为虚拟环境选择任何您喜欢的名称。
cd my_app
virtualenv my_app_venv
让我们在那里创建一个新文件夹来包含你的Python应用程序模块:
这是您的应用程序模块将驻留的文件夹。
mkdir app
并激活解释器在虚拟环境中使用它:
请确保使用您选择为您的虚拟环境中,如果你去比“我的 应用程序 venv”以外的东西的名称。
source my_app_venv/bin/activate
最后,这是您的主应用程序部署目录应该是什么样子:
my_app              # Main Folder to Contain Everything Together
  |
  |=== my_app_venv  # V. Env. folder with the Python Int.
  |=== app          # Your application module
  |..
  |.

下载并安装CherryPy

为了使用CherryPy的WSGI Web服务器,我们首先需要下载并安装它。 要使用pip安装CherryPy,请运行以下命令:
pip install cherrypy
注意:如果您的环境中工作,CherryPy的将被安装在那里。 否则,安装将 全局可用 (即系统范围)。 不建议进行全局安装。 总是选择使用 的virtualenv两个服务器和你的开发机器上。

下载和安装Nginx

CentOS / RHEL用户注意事项: 以下说明不适用于CentOS系统。请参阅说明书 在这里为CentOS。
运行以下命令来使用默认的系统包管理器安装资质的 Nginx的:
sudo aptitude install nginx
要运行Nginx,您可以使用以下命令:
sudo service nginx start
要停止Nginx,可以使用以下命令:
sudo service nginx stop
要重新启动Nginx,您可以使用以下命令:
每次重新配置Nginx后,需要重新启动或重新加载以使新设置生效。
sudo service nginx restart
注意:要了解更多关于Nginx的在Ubuntu,请参阅文章: 如何在Ubuntu 12.04安装Nginx的

使用CherryPy Web服务器提供Python Web应用程序

在本节中,我们将了解WSGI应用程序如何与CherryPy Web服务器配合使用。这一过程包括提供服务器与一个 WSGI应用程序调用 (比如, application = (..)作为入口点)。

WSGI

简而言之,WSGI是Web服务器和应用程序本身之间的接口。它的存在是为了保证各种服务器和应用程序(框架)之间的标准化的方式彼此合作,允许互换性必要时(例如,从开发切换到生产环境),这是一个必须有需要时下。 注意:如果你有兴趣了解更多关于 WSGIPython的Web服务器 ,看看我们的文章: 网络服务器的基于Python的Web应用程序的比较

WSGI应用对象(可赎回): wsgi.py

如上所述,在WSGI上运行的Web服务器需要一个应用程序对象(即您的应用程序)。 对于大多数框架和应用程序,它包括:
  • wsgi.py包含并提供要由服务器使用的应用程序对象(或可调用)。
  • 和server.py其中包括应用程序对象,并使用其服务。
我们将开始创建一个示例性的“wsgi.py”并继续为CherryPy创建一个通用的“server.py”。
您可以选择任何名称,而不是wsgi.py和server.py。然而,这些是通常使用的(例如通过Django)。
让我们开始创建一个wsgi.py文件来包含一个基本的WSGI应用程序。 运行以下命令以使用文本编辑器nano创建wsgi.py:
nano wsgi.py
让我们继续移动(复制/粘贴)基本的WSGI应用程序代码(应该替换为您自己的应用程序可调用的生产):
def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["Hello!"]
这是服务器包含的文件,并且每次请求到来时,服务器使用这个应用程序可调用来在解析URL(例如mysite.tld / controller / method / variable)时运行应用程序的请求处理程序(即控制器)。
将应用程序代码中,按Ctrl + X,然后经过确认Y以这个文件保存在里面 my_app文件夹旁边的虚拟环境,并包含您的实际应用应用程序模块。 注:此应用程序WSGI是最基本的例子,它的种类。您将需要替换此代码块,以包含应用程序模块中自己的应用程序对象。 一旦完成,这就是您的主应用程序部署目录应该是什么样子:
my_app              # Main Folder to Contain Everything Together
  |
  |=== my_app_venv  # V. Env. folder with the Python Int.
  |=== app          # Your application module
  |
  |--- wsgi.py      # File containing application callable
  |..
  |.

创建脚本使用CherryPy的Web服务器: server.py

在我们当前的工作目录(例如my_app)文件夹中,我们现在需要创建一个Python脚本:
  • 包括应用程序
  • 创建一个或多个CherryPy Web服务器实例
  • 配置这些服务器实例
  • 启动和停止服务器引擎
有多种方法可以获得这样的脚本,在下面的例子中,我们将使用一个简单但易于配置的脚本。 创建server.py文件以包含使用nano的Web服务器启动脚本:
nano server.py
在此文件中,写入(复制/粘贴)以下服务器片段:
# Import your application as:
# from wsgi import application
# Example:

from wsgi import application

# Import CherryPy
import cherrypy

if __name__ == '__main__':

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

    # 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 = 8081
    # server2.thread_pool = 30
    # server2.subscribe()

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

    cherrypy.engine.start()
    cherrypy.engine.block()
保存并再次按CTRL + X并用Y确认。 最后,这是您的主应用程序部署目录应该是什么样子:
my_app              # Main Folder to Contain Everything Together
  |
  |=== my_app_venv  # V. Env. folder with the Python Int.
  |=== app          # Your application module
  |
  |--- wsgi.py      # File containing application callable
  |--- server.py    # Python executable to launch the server
  |..
  |.

运行服务器

要开始提供您的应用程序,您只需要使用Python安装执行server.py。 运行以下命令以按配置启动服务器:
注意:这将执行该脚本,使用激活的Python解释器,因为我们仍然在虚拟环境中工作。 如果没有激活,则需要状态的路径: 我的应用程序/斌/ python_ server.py。
python server.py
这将在前台运行服务器。如果你想停止它,按CTRL + C。
要在后台运行服务器,请运行以下命令:
python server.py &
要返回到命令行,只需按enter键。应用程式仍会执行。
当您在后台运行应用程序时,您需要使用进程管理器(例如htop)来终止(或停止)它。

配置Nginx

在设置了CherryPy来运行我们的应用程序后,我们现在需要对Nginx做同样的事情来与CherryPy服务器通信。为此,我们需要修改Nginx的配置文件:“nginx.conf” 运行以下命令打开nginx.conf并使用nano文本编辑器编辑它:
sudo nano /etc/nginx/nginx.conf
之后,您可以使用以下示例配置替换文件,以使Nginx作为反向代理工作,与您的应用程序通信。
注意:要了解结合SSL支持,请先看看这篇文章: 创建于Nginx的SSL证书
Web应用程序的示例配置:
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的,请参阅文章: 如何在VPS配置的Nginx Web服务器

其他提示和建议

防火墙:
保护SSH:
创建警报:
监视和监视服务器访问日志每日:
:提交 OS Tezer
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

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

支付宝扫一扫打赏

微信扫一扫打赏