如何在 Nginx 后面使用 CherryPy Web 服务器部署 Python WSGI 应用程序

介绍


很可能你发现自己在阅读本教程的标题后提出了这些问题之一:

  • 为什么我应该为我的 WSGI 应用程序使用 CherryPy 的纯 Python 网络服务器,而不是一个真正的独立(也许是基于 C 的)服务器? * CherryPy...不是一个框架吗?这与我的 Bottle、Flask 等基于应用程序的部署有什么关系?

在这篇DigitalOcean文章中,我们将找到它们,我们将开始谈论CherryPy究竟是什么以及用于您的Web应用程序的优势,我们将继续解释为什么,最重要的是如何您可以使用CherryPy的Web服务器部署Python应用程序。

语法


1. 了解 CherryPy 和使用 Nginx


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

2 准备你的滴滴来生产


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

3. 使用 CherryPy Web Server 服务 Python Web 应用程序


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

4 配置 Nginx

5 混淆的提示和建议

了解 CherryPy 和使用 Nginx


樱桃Py整体是一个最小化的Python网络框架. 这里的最小化意味着它不是运出太多的组件,不管你是否喜欢(或需要)它们. 最小主义基本上是避免将事物强加给开发者而不给他们选择. CherryPy—— 以及这方面的其他框架—— 通常处理人们所期望的核心必需品(例如会话、缓存、文件上传等), 并留下其余的, 以及选择使用什么和如何使用, 由_you_决定.

区分CherryPy与其他Python框架(包括一些完整的框架)的是其开发人员的野心,提供它准备好工作(即开发)并准备好部署作为一个自包含的应用程序包(包)。

CherryPy WSGI Web 服务器 简介


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

CherryPy Web 服务器的亮点:

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

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


正如我们在开始时所提到的,你可能会想知道为什么要使用这个解决方案,而不是另一个你可能听说过或甚至尝试过的著名解决方案。 事实是,由于WSGI的优良规格,创建网页服务器很容易。

選擇的數量是巨大的,他們都(大多數)在很大程度上做同樣的事情。

为什么要使用 CherryPy Web 服务器来部署应用程序?

答案很简单:这是一个乐趣的工作. 使用 CherryPy 的服务器来服务您的 WSGI Web 应用程序的易用性是绝佳的. 它会节省您大量的头痛,因为您在一两分钟内起床和运行。

** 请记住:** 对于多进程设置,您需要配置多个服务器对象实例。

除非你确信,在你的应用程序上线几分钟内,它将收到每秒数万个请求,而你不能简单地使用更多的服务器来平衡负载,那么你最好用你的时间继续开发应用程序,而不是麻烦库,CPU优化,处理崩溃等。

CherryPy Web Server,加上(易用)使用 Nginx 作为面向前面的反向代理,是服务Python WSGI基于Web应用的真正坚实的方法,无论是在Bottle、CherryPy、Django、Flask、Pyramid或任何其他框架上开发的。

** 记住** :上面提到的架构(下面解释)使您能够轻松地在水平(更多的服务器)甚至垂直(每个服务器的容量更大)进行扩展。您的bottleneck很可能是后端(数据库)。

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


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

记住:处理连接在技术上意味着不放弃它们,并且能够用 something 服务它们. 您仍然需要您的应用程序和数据库正常工作,以便 Nginx 服务客户端 responses 不是错误消息。

为什么要使用 Nginx 作为应用程序服务器前面的反向代理?

虽然您的应用程序服务器 - CherryPy WSGI Web 服务器在我们的情况下 - 可以服务您的应用程序及其静态文件(如 javascript, css,图像等),这是一个非常好的想法,使用一个反向代理,设置在前面,如 Nginx。

随着应用程序的增长,您将希望优化它,并在时间到来时,在服务器上分发它,以便能够同时处理更多的连接,并具有更强大的架构。

其可扩展性(例如,原生缓存以及故障转移和其他机制)也是一个很好的成就,与(简单)应用程序服务器不同,它有利于Web应用程序。

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

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

** 注意:** 当应用程序设置为听取127.0.0.1上的接入连接时,只能在本地访问它。

为生产准备您的滴滴


在本节中,我们将为生产(即部署我们的应用程序)做好准备。

我们将从:

*更新默认操作系统 *下载和安装常见的Python工具(即Pip,virtualenv) *并创建一个虚拟环境来包含应用程序(其依赖性如CherryPy的内部居住)。

** 注意: ** 这里提供的指示是简短的。 要了解更多信息,请参阅我们关于 pipvirtualenv 的文章: 常见的 Python 工具:使用 virtualenv,安装与 Pip 和管理包

更新默认操作系统


** 注意:** 我们将使用最新版本的操作系统,在一个新的滴子上执行下面的设置和准备工作。理论上,您不应该有问题在您的服务器上尝试它们。

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

对于基于 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,请参阅: 如何在 CentOS 上设置 Python 2.7.6 和 3.3.3

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

python-dev(开发工具)、pip(管理包)、virtualenv(创建孤立的虚拟环境)。

Python 服务器:

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

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

1aptitude install python-dev

:

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应用程序包含在它自己的环境中,以及它的所有依赖性。一个环境可以最好地描述(简单地说)作为一个孤立的位置(一个目录),其中一切都在。

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

1sudo pip install virtualenv

创建一个自有的虚拟(Python)环境


有了所有必要的工具,我们可以创建一个环境来部署我们的应用程序。

** 请记住:** 如果您没有在您的开发(本地)机器上有一个虚拟机,您应该考虑创建一个,并将您的应用程序(及其依赖)移动到内部。

让我们先创建一个包含 virtual environmentyour application module 的文件夹:

您可以在这里使用任何名称来满足您的需求。

1mkdir my_app

我们可以继续输入此文件夹并在里面创建一个新的虚拟环境:

您也可以为您的虚拟环境选择您喜欢的任何名称。

1cd my_app
2virtualenv my_app_venv

让我们在那里创建一个新的文件夹,以包含您的Python应用模块:

这是您的应用模块将居住的文件夹。

1mkdir app

并在虚拟环境中激活翻译器以使用它:

请确保使用您选择的虚拟环境的名称,如果您选择了my_app_venv

1source my_app_venv/bin/activate

最后,这是你的主要应用部署目录应该是这样的:

1my_app              # Main Folder to Contain Everything Together
2  |
3  |=== my_app_venv  # V. Env. folder with the Python Int.
4  |=== app          # Your application module
5  |..
6  |.

下载和安装 CherryPy


为了使用 CherryPy 的 WSGI Web Server,我们首先需要下载并安装它。

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

1pip install cherrypy

注意: 如果您在环境中工作,CherryPy 将被安装在那里,否则安装将是全球可用(即全系统可用)。

下载和安装 Nginx


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

** 运行以下命令以使用默认系统包管理器 aptitude install Nginx:**

1sudo aptitude install nginx

要运行 Nginx,您可以使用以下内容:

1sudo service nginx start

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

1sudo service nginx stop

要重新启动 Nginx,您可以使用以下方法:

每次重新配置 Nginx 后,需要重新启动或重新加载才能使新设置生效。

1sudo service nginx restart

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

使用 CherryPy Web Server 服务 Python Web 应用程序


在本节中,我们将看到一个 WSGI 应用程序如何与 CherryPy Web 服务器一起工作. 这个过程包括为服务器提供一个 WSGI 应用程序可调用 (例如 application = (..)) 作为输入点。

名称:WSGI


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

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

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


如上所述,在 WSGI 上运行的 Web 服务器需要一个应用程序对象(即应用程序的对象)。

对于大多数框架和应用程序,这包括:

一个 wsgi.py 包含和提供一个应用程序对象(或可调用)由服务器使用。

我们将开始创建一个典型的wsgi.py,并继续为CherryPy创建一个共同的server.py

您可以选择任何名称,而不是 wsgi.py 和 server.py. 然而,这些都是常用的名称(例如,由 Django)。

让我们先创建一个 wsgi.py 文件以包含一个基本的 WSGI 应用程序。

** 运行以下命令以使用文本编辑器 nano 创建 wsgi.py:**

1nano wsgi.py

让我们继续移动(复制/粘贴)内部的基本WSGI应用程序代码(该代码应该被自己的应用程序的调用代码取代):

1def application(env, start_response):
2    start_response('200 OK', [('Content-Type', 'text/html')])
3    return ["Hello!"]

这是服务器所包含的文件,每次发出请求时,服务器都会使用该应用程序可调用来运行应用程序的请求处理器(即控制器)来解析 URL(例如 mysite.tld/controller/method/variable)。

插入应用程序代码后,按 CTRL + X,然后用 Y 确认以将该文件保存到my_app文件夹中,并与虚拟环境和包含实际应用程序的应用程序模块一起。

** 注意:** 此 WSGI 应用程序是其类型的最基本的例子,您需要更换此代码块以从应用程序模块中包含自己的应用程序对象。

一旦完成,这就是您的主要应用部署目录应该是这样的:

1my_app              # Main Folder to Contain Everything Together
2  |
3  |=== my_app_venv  # V. Env. folder with the Python Int.
4  |=== app          # Your application module
5  |
6  |--- wsgi.py      # File containing application callable
7  |..
8  |.

创建一个使用 CherryPy Web Server 的脚本: server.py


在当前的工作目录(例如 my_app)文件夹中,我们现在需要创建一个 Python 脚本:

  • 包含应用程序 * 创建一个或多个 CherryPy Web 服务器实例 * 配置这些服务器实例 * 启动和停止服务器引擎(s)

有多个方法可以获得这样的脚本,在下面的示例中,我们将使用一个简单但易于配置的。

创建 server.py 文件以使用 nano 包含 Web 服务器启动脚本:

1nano server.py

** 在此文件中,写入(复制/粘贴)以下服务器片段:**

 1# Import your application as:
 2# from wsgi import application
 3# Example:
 4
 5from wsgi import application
 6
 7# Import CherryPy
 8import cherrypy
 9
10if __name__ == '__main__':
11
12    # Mount the application
13    cherrypy.tree.graft(application, "/")
14
15    # Unsubscribe the default server
16    cherrypy.server.unsubscribe()
17
18    # Instantiate a new server object
19    server = cherrypy._cpserver.Server()
20
21    # Configure the server object
22    server.socket_host = "0.0.0.0"
23    server.socket_port = 8080
24    server.thread_pool = 30
25
26    # For SSL Support
27    # server.ssl_module            = 'pyopenssl'
28    # server.ssl_certificate       = 'ssl/certificate.crt'
29    # server.ssl_private_key       = 'ssl/private.key'
30    # server.ssl_certificate_chain = 'ssl/bundle.crt'
31
32    # Subscribe this server
33    server.subscribe()
34
35    # Example for a 2nd server (same steps as above):
36    # Remember to use a different port
37
38    # server2             = cherrypy._cpserver.Server()
39
40    # server2.socket_host = "0.0.0.0"
41    # server2.socket_port = 8081
42    # server2.thread_pool = 30
43    # server2.subscribe()
44
45    # Start the server engine (Option 1 *and* 2)
46
47    cherrypy.engine.start()
48    cherrypy.engine.block()

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

最后,这是您的主要应用部署目录应该是这样的:

1my_app              # Main Folder to Contain Everything Together
2  |
3  |=== my_app_venv  # V. Env. folder with the Python Int.
4  |=== app          # Your application module
5  |
6  |--- wsgi.py      # File containing application callable
7  |--- server.py    # Python executable to launch the server
8  |..
9  |.

运行服务器


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

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

** 注意:** 这将执行脚本,使用已启用的Python解释器,因为我们仍然在虚拟环境中工作. 如果它没有启用,则需要指定路径: ** my_app/bin/python server.py** 。

1python server.py

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

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

1python server.py &

要返回命令行,只需按 Enter. 应用程序仍在运行。

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

配置 Nginx


在设置 CherryPy 来运行我们的应用程序后,我们现在需要与 Nginx 做同样的事情,以便它可以与 CherryPy 服务器(s)交谈。

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

1sudo nano /etc/nginx/nginx.conf

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

** 注意:** 若要了解如何嵌入 SSL 支持,请先阅读本文: 在 Nginx 上创建 SSL 证书

** Web 应用程序的示例配置:**

 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

** 注意:** 有关 Nginx 的更多信息,请参阅我们的文章: 如何在 VPS 上配置 Nginx Web Server

混淆的提示和建议


防火墙:

安全的SSH:

创建警报:**

** 每天监控和观看服务器访问日志:**

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