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

在这种DigitalOcean文章中,我们将与拓展优秀Gunicorn WSGI HTTP Server上我们的知识开始,并继续与部署上构建各种流行框架的Python WSGI的Web应用程序。

介绍


也许是对文章Python的Web服务器比较诱惑你进行切换,或事实上你干脆超越当前应用程序的部署栈。您有兴趣了解更多关于Gunicorn Web服务器,并希望从一开始就彻底了解如何部署Python应用程序。 在这个DigitalOcean文章中,我们的目的是帮助你以上所有,然后一些。我们将开始扩展我们对优秀的Gunicorn WSGI HTTP Server的知识,并继续部署在各种流行框架上构建的Python WSGI Web应用程序。

词汇表


关于Gunicorn和Nginx


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

2.准备您的Droplet进行生产


  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应用程序服务器。它本身支持各种框架及其适配器,使其成为开发过程中使用的许多开发服务器的非常容易使用的插件替换。 从技术上说,Gunicorn的工作方式非常类似于成功的Unicorn Web服务器的Ruby应用程序。他们都使用所谓的前叉模型。这本质上,任务中央[Gunicorn]主流程来处理工人的管理,创建套接字和绑定等。 Gunicorn服务器亮点
  • 运行任何WSGI Python Web应用程序(和框架)
  • 可用于替换Paster(Pyramid),Django的开发服务器,web2py等。
  • 配有各种工人类型和配置
  • 自动管理工作进程
  • 通过同步和异步工作的HTTP / 1.0和HTTP / 1.1(Keep-Alive)支持
  • 支持SSL
  • 可伸缩与钩
  • Python 2.6+和3.x支持

使用Nginx的Web应用程序部署


Nginx是一个非常高性能的Web服务器/(反向)-proxy。它已经达到其目前的流行,由于重量轻,相对容易使用,并且易于扩展(与附加/插件)。由于它的结构,它能够处理大量的哪些请求(几乎不受限制)的-这取决于你的应用程序或网站负载-可能是真的很难用一些其他的,旧的替代品来解决。
请记住:“处理”连接技术上意味着不会放弃他们,并能与一些为他们服务。你仍然需要你的应用程序和数据库运行良好,以使Nginx服务客户端* esponses不是错误消息。
为什么使用Nginx作为应用服务器前面的反向代理? 许多框架和应用程序服务器(包括Gunicorn)可以提供静态文件(例如javascript,css,图像等)以及响应。然而,更好的做法是让(反向代理)服务器,如Nginx处理服务这些文件和管理连接(请求)的任务。这减轻了应用程序服务器的负载,为您提供了更好的整体性能。 随着应用程序的增长,您将需要优化它,并且在时间到来时,将其分布在服务器(VPS)上,以便能够同时处理更多连接(并且具有更稳定的架构)。在应用程序服务器前面有一个反向代理可以从一开始就帮助您。 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
注意:请请参见配置和优化Gunicorn了解服务器/职工人数使用。

准备您的Droplet进行生产


在本节中,我们将准备我们的虚拟生产(即部署我们的应用程序)。 我们将从:
  • 更新默认操作系统
  • 下载和安装常见的Python工具(即pip,virtualenv)
  • 创建一个虚拟环境来包含应用程序(它的依赖项,例如Gunicorn驻留在其中)
注意:这里给出的说明保持简短。 要了解更多信息,请访问我们的how-to文章PIP和的virtualenv: 常用的Python工具:使用的virtualenv,用Pip安装和管理软件包

更新默认操作系统


注意:我们将在一个新的Droplet进行以下设置和准备使用的操作系统的最新版本。在理论上,你不应该有在VPS上尝试它们的问题。但是,如果您已经积极使用它,我们强烈建议切换到新系统。
为了确保我们有最新的可用版本的默认应用程序,我们需要更新我们的系统。 对于基于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,与PIP和的virtualenv,请参考: 如何设置的Python 2.7.6和3.3.3在CentOS
在Ubuntu和Debian,最近的Python解释器,你可以使用的版本出现在默认情况下。它使我们只有有限数量的额外的软件包安装:
  • python-dev(开发工具),
  • pip(管理包),
  • virtualenv(创建隔离的,虚拟环境)。
python-dev: python-dev的是一个操作系统级的包,其中包含扩展开发工具,用于构建Python模块。 运行以下命令使用aptitude来安装python-dev的
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
  |..
  |.

下载并安装Gunicorn


始终是将所有与应用程序相关的元素尽可能多地包含在虚拟环境中的推荐方式。因此,我们将下载并安装Gunicorn。 如果您不在环境中工作,Gunicorn将在全球安装(即系统范围内可用)。这是推荐的。 总是选择使用的virtualenv。 要使用pip安装Gunicorn,请运行以下命令:
pip install gunicorn

下载和安装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的

使用Gunicorn提供Python Web应用程序


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

WSGI


简而言之,WSGI是Web服务器和应用程序本身之间的接口。它的存在是为了保证各种服务器和应用程序(框架)之间的标准化的方式彼此合作,允许互换性必要时(例如,从开发切换到生产环境),这是一个必须有需要时下。 注意:如果你有兴趣了解更多关于WSGIPython的Web服务器 ,看看我们的文章: 网络服务器的基于Python的Web应用程序的比较

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


如上所述,在WSGI上运行的Web服务器需要一个应用程序对象(即您的应用程序)。 对于大多数框架和应用程序,它包括:
  • 一个wsgi.py遏制和提供由服务器一起使用的应用程序对象(或调用)。
我们将开始创建一个示例性的wsgi.py与Gunicorn一起使用。
您可以选择任何名称,而不是“wsgi.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 /控制器/方法/变量 )。
将应用程序代码放入后,按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
  |..
  |.

运行服务器


要开始提供应用程序,您只需执行:
gunicorn [option] [option] .. [wsgi file]
运行以下命令启动服务器:
gunicorn -b 0.0.0.0:8080 wsgi
这将在前台运行服务器。如果你想停止它,按CTRL + C。
要在后台运行服务器,请运行以下命令:
gunicorn -b 0.0.0.0:8080 wsgi &
当您在后台运行应用程序时,您需要使用进程管理器(例如htop)来终止(或停止)它。

配置和优化Gunicorn


注:下面是一些最常用的配置和优化设置。 若要查看所有可用的选项,检查出的官方文档Gunicorn配置概述
如前所述,Gunicorn是高度可配置的,它是很容易修改所有必要的参数,让它的方式。 重要事项[!]:下面列出的所有设置和配置选项是被链接(放一个接一个)推出gunicorn和服务器应用程序。您不能在启动服务器后修改任何选项。无论您使用哪个选项或选项,它们都必须后跟包含应用程序入口点的wsgi文件。
例:
# Simply running the server (as shown above):
gunicorn -b 0.0.0.0:8080 wsgi

# Running the server with five workers:
gunicorn -b 0.0.0.0:8080 --workers=5 wsgi
工人计数 一般来说,应用程序被认为(并且被接受)是I / O绑定而不是CPU绑定。这意味着,瓶颈不是由虚拟服务器具有的处理能力造成的,而是由磁盘造成的。这个想法是:当一个工作者忙于磁盘操作时,另一个仍然利用处理请求的CPU。 因此,建议的工人数量通常用下面的简单公式设定:
# (2 Workers * CPU Cores) + 1
# ---------------------------
# For 1 core  -> (2*1)+1 = 3
# For 2 cores -> (2*2)+1 = 5
# For 4 cores -> (2*4)+1 = 9
你可以通过参数指定工人的数量--workers=[n] 用法:
# Example: gunicorn --workers=[number of workers]
gunicorn --workers=5
注:上述方案不严格适用于非阻塞工人。
套接字设置 套接字绑定的工作方式如下:
# Example: gunicorn -b [address:port]
gunicorn -b 127.0.0.1:8080
注意:当一个应用程序设置为侦听传入连接127.0.0.1 ,就只可能在本地访问它。 如果使用0.0.0.0 ,但是,它将接受来自外部的连接以及。
选择工作线程类型 Gunicorn,正如我们所讨论的,提供了与各种类型的工人工作的可能性。 对于大多数部署,标准工作者类型 - 同步 - 将是足够的,默认情况下,因此不需要任何显式设置。
对于其他工作人员,请注意,您需要将其安装为依赖项。
用法:
# Example: gunicorn -k [worker]
gunicorn -k sync    # or;
gunicorn -k gevent  # ..
可用类型:
  • 同步
  • eventlet
  • gevent
  • 龙卷风
Eventlet / Gevent的并发连接数 要修改Eventlet和Gevent工作程序的并发连接数:
# Example: gunicorn -k [worker] --worker-connections [number]
gunicorn -k gevent --worker-connections 1001
访问日志 如果您要明确设置写入访问日志的文件:
# Example: gunicorn --log-file [file]
gunicorn --log-file error_logs.log
默认情况下,此选项设置为
错误日志 要指定要写入错误日志的文件,请使用此设置。
# Example: gunicorn --access-logfile [file]
gunicorn --access-logfile acclogs
日志级别 这用于设置错误日志输出的粒度。可能的选项有:
  • 调试
  • 信息
  • 警告
  • 错误
  • 危急
用法:
 # Example: gunicorn --log-level [level]
 gunicorn --log-level error
进程命名 如果您正在使用工具如上方来监控您的进程,您可以使用此设置,给他们一个更有意义的名称应该帮助你的任务。
# Example: gunicorn --name [name]
gunicorn --name my_application

配置Nginx


在学习了配置和运行Gunicorn之后,我们现在需要对Nginx做同样的事情来与运行应用程序的Gunicorn服务器通信。为此,我们需要修改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