介绍
在阅读本教程的标题后,你会发现自己提出这些问题之一:- 为什么我应该使用CherryPy的纯Python Web服务器而不是一个“真正的”独立(可能基于C)一个为我的WSGI应用程序?
- CherryPy ...不是一个框架?这是与我的瓶,瓶等基于应用程序的部署有什么关系?
词汇表
1.了解CherryPy和使用Nginx
- CherryPy WSGI Web服务器简介
- 为什么要使用CherryPy的WSGI Web服务器进行部署?
- 使用Nginx作为反向代理在CherryPy前面
2.准备您的Droplet进行生产
- 更新默认操作系统
- 设置Python,pip和virtualenv
- 创建虚拟(Python)环境
- 下载并安装CherryPy
- 下载和安装Nginx
3.使用CherryPy Web服务器提供Python Web应用程序
- WSGI
- WSGI应用程序对象(可调用):wsgi.py
- 创建脚本以使用CherryPy Web Server:server.py
- 运行服务器
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驻留在其中)。
更新默认操作系统
注意:我们将在一个新的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(创建隔离的,虚拟环境)。
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服务器和应用程序本身之间的接口。它的存在是为了保证各种服务器和应用程序(框架)之间的标准化的方式彼此合作,允许互换性必要时(例如,从开发切换到生产环境),这是一个必须有需要时下。 注意:如果你有兴趣了解更多关于 WSGI和 Python的Web服务器 ,看看我们的文章: 网络服务器的基于Python的Web应用程序的比较 。WSGI应用对象(可赎回): wsgi.py
如上所述,在WSGI上运行的Web服务器需要一个应用程序对象(即您的应用程序)。 对于大多数框架和应用程序,它包括:
- wsgi.py包含并提供要由服务器使用的应用程序对象(或可调用)。
- 和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服务器实例
- 配置这些服务器实例
- 启动和停止服务器引擎
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