介绍
很可能你发现自己在阅读本教程的标题后提出了这些问题之一:
- 为什么我应该为我的 WSGI 应用程序使用 CherryPy 的纯 Python 网络服务器,而不是一个
真正的
独立(也许是基于 C 的)服务器? * CherryPy...不是一个框架吗?这与我的 Bottle、Flask 等基于应用程序的部署有什么关系?
在这篇DigitalOcean文章中,我们将找到它们,我们将开始谈论CherryPy究竟是什么以及用于您的Web应用程序的优势,我们将继续解释为什么
,最重要的是如何
您可以使用CherryPy的Web服务器部署Python应用程序。
语法
1. 了解 CherryPy 和使用 Nginx
- CherryPy WSGI Web 服务器简介 2. 为什么要部署 CherryPy 的 WSGI Web 服务器? 3. 使用 Nginx 作为 CherryPy 前面的反向代理
2 准备你的滴滴来生产
- 更新默认操作系统 2. 设置 Python、pip 和 virtualenv 3. 创建虚拟(Python)环境 4. 下载和安装 CherryPy 5. 下载和安装 Nginx
3. 使用 CherryPy Web Server 服务 Python Web 应用程序
- 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的内部居住)。
** 注意: ** 这里提供的指示是简短的。 要了解更多信息,请参阅我们关于 pip 和 virtualenv 的文章: 常见的 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 environment 和 your 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:
创建警报:**
** 每天监控和观看服务器访问日志:**