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

介绍


也许它是关于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


  1. Gunicorn 2. 使用 Nginx 部署 Web 应用程序

2 准备你的滴滴来生产


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

3. 用 Gunicorn 服务 Python Web 应用程序


  1. 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:

创建警报:**

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

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