介绍
也许它是关于Python Web Server比较(https://www.digitalocean.com/community/articles/a-comparison-of-web-servers-for-python-based-web-applications)的文章诱惑你切换,或者你只是超越了你目前的应用程序部署堆积的事实。
在这篇DigitalOcean文章中,我们的目标是帮助您解决上述所有问题,然后一些问题,我们将开始扩大我们对优秀的Gunicorn WSGI HTTP服务器的知识,并继续部署基于各种流行的框架构建的Python WSGI网络应用程序。
词汇
关于 Gunicorn 和 Nginx
- Gunicorn 2. 使用 Nginx 部署 Web 应用程序
2 准备你的滴滴来生产
- 更新默认操作系统 2. 设置 Python、pip 和 virtualenv 3. 创建虚拟(Python)环境 4. 下载和安装 Gunicorn 5. 下载和安装 Nginx
3. 用 Gunicorn 服务 Python Web 应用程序
- WSGI 2. WSGI 应用对象 (可调用): wsgi.py 3. 运行服务器 4. 配置和优化 Gunicorn 5. 配置 Nginx 6. 混淆的提示和建议
关于 Gunicorn 和 Nginx
名称: Gunicorn
Gunicorn 是一个独立的 WSGI Web 应用服务器,提供大量功能,它通过其适配器自然支持各种框架,使其成为许多开发过程中使用的开发服务器非常容易使用的 drop-in 替代品。
从技术上讲,Gunicorn的工作方式非常类似于成功的UnicornWeb服务器用于Ruby应用程序,它们都使用了所谓的前叉模型,这在本质上使中央(Gunicorn)主流处理工人的管理,创建接口和连接等。
Gunicorn服务器亮点
- 运行任何 WSGI Python Web 应用程序(和框架) * 可作为 Paster (金字塔), Django 的开发服务器, web2py 等的落入替代品 * 配备各种工人类型和配置 * 自动管理工人流程 * HTTP/1.0 和 HTTP/1.1 (保持活着) 支持通过同步和非同步工人 * 支持 SSL * 可扩展与夹克 * Python 2.6+ 和 3.x 支持
使用 Nginx 部署 Web 应用程序
Nginx 是一个非常高性能的 Web 服务器 / (反向) - 代理服务器. 它已经达到其当前的普及,因为它是轻量级,相对容易工作,并容易扩展(通过插件 / 插件)。 由于其架构,它能够处理 a lot 请求(几乎无限),这 - 取决于您的应用程序或网站的负载 - 可能很难使用一些其他,较旧的替代方案来解决。
请记住:处理
连接在技术上意味着不放弃它们,并且能够用 something 服务它们. 您仍然需要您的应用程序和数据库正常运作,以便 Nginx 服务客户端 * 响应不是错误消息。
为什么要在应用程序服务器前使用 Nginx 作为反向代理?
许多框架和应用程序服务器(包括Gunicorn)可以为静态文件(如 javascript、css、图像等)提供响应,但最好是让一个(反向代理)服务器(如Nginx)处理这些文件的服务和管理连接(请求)。
随着应用程序的增长,您将想要优化它,并在时间到来时,将其分配到服务器(VPS)之间,以便能够同时处理更多的连接(并且具有更强大的架构)。
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
注意:请参阅设置和优化 Gunicorn
部分,了解要使用的服务器/工人的数量。
为生产准备您的滴滴
在本节中,我们将准备我们的虚拟生产(即部署我们的应用程序)。
我们将从:
*更新默认操作系统 *下载和安装常见的Python工具(即Pip,virtualenv) *创建一个虚拟环境以包含应用程序(其中其依赖性如Gunicorn居住)
** 注意: ** 这里提供的指示是简短的。 要了解更多信息,请参阅我们关于 pip 和 virtualenv 的文章: 常见的 Python 工具:使用 virtualenv、安装与 Pip 和管理包。
更新默认操作系统
** 注意:** 我们将使用最新版本的操作系统进行下列设置和准备,理论上,您不应该有问题在您的VPS上尝试它们,但是,如果您已经积极使用它,我们强烈建议切换到新系统。
为了确保我们拥有最新的默认应用程序版本,我们需要更新我们的系统。
对于基于 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和vitualenv,请参见:[如何在CentOS上设置Python 2.7.6和3.3.3] (https://www.digitalocean.com/community/articles/how-to-set-up-python-2-7-6-and-3-3-3-on-centos-6-4).
在Ubuntu和Debian上,你可以使用的Python翻译器的最新版本是默认的,它只留给了我们一个有限的额外包来安装:
python-dev(开发工具)、pip(管理包)、virtualenv(创建孤立的虚拟环境)。
主題: python-dev
python-dev 是一个操作系统级包,包含用于构建 Python 模块的扩展开发工具。
运行以下命令来安装 python-dev 使用 ** aptitude** :
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)环境
有了所有必要的工具,我们可以创建一个环境来部署我们的应用程序。
** 请记住:** 如果您没有在您的开发(本地)机器上有一个虚拟机,您应该考虑创建一个,并将您的应用程序(及其依赖)移动到内部。
让我们先创建一个包含虚拟环境和应用模块的文件夹:
您可以在这里使用任何名称来满足您的需求。
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 |.
下载和安装 Gunicorn
它总是建议的方式,以包含所有的应用程序相关的元素,尽可能多,在虚拟环境中一起. 因此,我们将下载和安装Gunicorn。
如果您不在环境中工作,Gunicorn 将被安装在全球范围内(即可在整个系统中使用)。
若要使用 pip 安装 Gunicorn,请执行以下操作:
1pip install gunicorn
下载和安装 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。
使用 Gunicorn 服务 Python Web 应用程序
在本节中,我们将看到一个WSGI应用程序如何与Gunicorn合作,这个过程包括为服务器提供一个 WSGI应用程序 callable (例如 application = (..)
)作为输入点。
名称:WSGI
简而言之,WSGI是网络服务器和应用程序本身之间的接口,它存在于确保各种服务器和应用程序(框架)之间相互工作的标准化方式,在必要时允许互换性(例如从开发到生产环境的切换),这是今天必需的。
注: 如果您有兴趣了解更多关于 ** WSGI** 和 ** Python Web 服务器** 的信息,请参阅我们的文章: Python 基于 Web 应用程序的 Web 服务器比较。
WSGI 应用对象(可调用): wsgi.py
如上所述,在 WSGI 上运行的 Web 服务器需要一个应用程序对象(即应用程序的对象)。
对于大多数框架和应用程序,这包括:
一个 wsgi.py 包含和提供一个应用程序对象(或可调用)由服务器使用。
我们将从创建一个典型的 wsgi.py 开始使用 Gunicorn。
您可以选择任何名称而不是wsgi.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 |.
运行服务器
要开始服务您的应用程序,您只需要执行:
1gunicorn [option] [option] .. [wsgi file]
运行以下操作来启动服务器:
1gunicorn -b 0.0.0.0:8080 wsgi
这将使服务器在前台运行. 如果您想阻止它,请按 CTRL+C。
** 要在背景中运行服务器,请执行以下操作:**
1gunicorn -b 0.0.0.0:8080 wsgi &
当您在背景中运行应用程序时,您需要使用一个流程管理器(例如 htop)来杀死(或停止)它。
配置和优化 Gunicorn
** 注意: ** 以下是最常用的配置和优化设置。 有关所有可用的选项,请查看 [Gunicorn 配置概述] 的官方文档(http://docs.gunicorn.org/en/latest/configure.html)。
如前所述,Gunicorn是高度可配置的,很容易修改所有必要的参数,以使它有你的方式。
[!] 重要: 以下列出的所有设置和配置选项都必须链接(一个接一个)以启动 gunicorn 和服务器您的应用程序. 您无法在启动服务器后修改任何选项。
◎例子:**
1# Simply running the server (as shown above):
2gunicorn -b 0.0.0.0:8080 wsgi
3
4# Running the server with five workers:
5gunicorn -b 0.0.0.0:8080 --workers=5 wsgi
工人会计师( )
一般来说,它被认为(并被接受)应用程序是I / O绑定的,而不是CPU绑定的。这意味着,瓶颈不是由您的虚拟服务器的处理功率引起的,而是由磁盘。
因此,建议的工人数量通常用以下简单的公式设定:
1# (2 Workers * CPU Cores) + 1
2# ---------------------------
3# For 1 core -> (2*1)+1 = 3
4# For 2 cores -> (2*2)+1 = 5
5# For 4 cores -> (2*4)+1 = 9
您可以通过通过参数 --workers=[n]
来指定工人数量。
使用:
1# Example: gunicorn --workers=[number of workers]
2gunicorn --workers=5
** 注意: ** 上述情況並不嚴格適用於非封鎖工人。
- 插件设置 *
socket bindings 的工作方式如下:
1# Example: gunicorn -b [address:port]
2gunicorn -b 127.0.0.1:8080
注意:当一个应用程序设置为听取127.0.0.1
上的接入连接时,它只能在本地访问它,但如果您使用0.0.0.0
,它也会接受来自外部的连接。
选择工人类型
Gunicorn,正如我们所讨论的那样,提供了与不同类型的工人合作的可能性。
对于大多数部署,标准工人类型 - sync - 将是足够的,并且是默认的,因此不需要任何明确的设置。
对于其他工人,请注意,您需要将它们安装为依赖。
使用:
1# Example: gunicorn -k [worker]
2gunicorn -k sync # or;
3gunicorn -k gevent # ..
可用的类型:
- sync
- eventlet
- gevent
- tornado
** Eventlet / Gevent 的同时连接数量**
若要更改 Eventlet 和 Gevent 员工的同时连接数量:
1# Example: gunicorn -k [worker] --worker-connections [number]
2gunicorn -k gevent --worker-connections 1001
** 访问日志**
如果您想明确设置文件来写访问日志:
1# Example: gunicorn --access-logfile [file]
2gunicorn --access-logfile acclogs
默认情况下,此选项设置为 None。
- 错误记录 *
要指定要写错误日志的文件,请使用此设置。
1# Example: gunicorn --log-file [file]
2gunicorn --log-file error_logs.log
- 登录级别*
此方法用于设置错误日志输出的颗粒性. 可能的选项是:
- 调试 * 信息 * 警告 * 错误 * 关键
使用:
1# Example: gunicorn --log-level [level]
2 gunicorn --log-level error
名称: 名称过程
如果您正在使用 _top 等实用程序来监控流程,您可以使用此设置给它们一个更有意义的名称,这应该帮助您完成任务。
1# Example: gunicorn --name [name]
2gunicorn --name my_application
配置 Nginx
在了解了如何配置和运行 Gunicorn 之后,我们现在需要与 Nginx 做同样的事情,以便与运行应用程序的 Gunicorn 服务器交谈。
** 运行以下命令打开nginx.conf
并使用纳米文本编辑器编辑它:**
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:
创建警报:**
** 每天监控和观看服务器访问日志:**