如何在 CentOS 6.4 上使用 uWSGI 在 Nginx 后面部署 Flask Web 应用程序

金钱(警告)

状态: 被贬低

本文涵盖了不再受支持的 CentOS 版本. 如果您目前正在运行运行 CentOS 6 的服务器,我们强烈建议升级或迁移到受支持的 CentOS 版本。

原因 : CentOS 6于2020年11月30日到期(EOL)并且不再收到安全补丁或更新。

参见相反 :本指南可能仍然有用作为参考,但可能不适用于其他 CentOS 版本. 如果可用,我们强烈建议使用为您使用的 CentOS 版本撰写的指南。

下面的DigitalOcean教程可能立即感兴趣,因为它概述了在CentOS 7服务器上使用uWSGI和nginx部署Flask应用程序:

美元

介绍


Armin Ronacher的Flask是过去几年为Python创建的Web应用框架领域发生的最伟大的事情之一。

Flask是一个最小的,但极其功能 - 和强大的 - 框架,这是非常受欢迎和非常可扩展与一个伟大的选择的第三方库(例如,Flask-WTF或Flask-SQLAlchemy)。

在这篇DigitalOcean文章中,我们将试图向您展示如何部署您的应用程序,并以类似的方式运行。

词汇


1. Flask In Brief


  1. Web 应用程序部署 2. WSGI 简要 3. 使用 Nginx 作为反向代理 4. Python WSGI Web 应用程序服务器 5. uWSGI 简要

2. Preparing The System For Deployment


  1. 更新系统 2. 设置 Python、pip 和 virtualenv 3. 准备系统进行开发 4. 在 CentOS 上下载、编译和安装 Python 5. 使用新 Python 安装在 CentOS 上安装 pip 6. 使用新 Python 安装在 CentOS 上安装 virtualenv

3. Getting Started With Application Deployment


  1. 创建应用程序目录用于部署 2. 创建虚拟环境 3. 与虚拟环境一起工作 4. 在虚拟环境中下载和安装 uWSGI 5. 下载和安装 Flask 库 6. 创建样本 Flask 应用程序

4. Deployment Stage: Installing And Setting Up Nginx


  1. 安装 Nginx 2. 配置 Nginx

5. Deployment Stage: Working With uWSGI


1、运行服务器

6. Further Reading


《瓶子》简介


鉴于Flask的性质,除了我们在介绍部分中已经提到的之外,没有什么可说的,它是一个精心编程的、简洁的Web应用程序开发库,只有两个直接依赖:Jinja2模板引擎和WerkzeugWSGI工具包。

使用Flask,创建可以从单个文件到数十个可重复使用的模块(即组件)的任何地方的网站都非常容易。

在我们的文章中,我们将使用一个非常基本的,样本的Flask应用程序 - 严格创建,以展示部署. 为了了解如何包装您的应用程序和上传,请查看我们的文章 如何包装和分发Python应用程序. 如果您有兴趣了解更多关于Flask和).

Web 应用部署


对于所有 Python WSGI Web 应用程序,部署包括准备一个 WSGI 模块,其中包含对您的应用程序对象的引用,然后被 Web 服务器用作输入点,以传递由应用程序控制器(或视图)处理的请求。

在这里,我们将使用uWSGI作为一个WSGI应用程序服务器,该服务器将包含Flask应用程序,以便为它提供 Nginx. Since Nginx has native support for uWSGI’s preferred and (acclaimed) faster wire-protocol,我们将使其相应工作。

WSGI 简介


很简单地说,WSGI是网络服务器和应用程序本身之间的接口,它存在于确保各种服务器和应用程序(框架)之间相互工作的标准化方式,在必要时允许互换性(例如从开发到生产环境的切换),这是当今必需的。

注: 如果您有兴趣了解更多关于 WSGI 和 Python 网页服务器的信息,请参阅我们的文章: 对比 Python 基于 Web 应用程序的网页服务器

在Flask的情况下,WSGI操作由底层 Werkzeug中间件库进行处理。

使用 Nginx 作为反向代理


Nginx 是一个非常高性能的 Web 服务器 / (反向) - 代理服务器. 它因其轻量,相对易于使用和易于扩展(通过插件 / 插件)而获得了其受欢迎性。 由于其架构,它能够处理 a lot 请求(几乎无限),这 - 取决于您的应用程序或网站的负载 - 可能很难使用其他一些较旧的替代方案来解决。

记住:处理连接在技术上意味着不放弃它们,并且能够用 something 服务它们. 您仍然需要您的应用程序和数据库正常工作,以便 Nginx 服务客户端 responses 不是错误消息。

由于其受欢迎性和成功,我们将部署我们的Flask应用程序运行在Nginx后面,以获益于其强大的功能。

Python WSGI Web 应用服务器


Python Web 应用服务器通常是基于 C 的独立解决方案或完全(或部分)基于 Python 的解决方案(即纯 Python)。

它们通过接受包含 - 如前所述 - 可调用到 contain 的 Web 应用程序的 Python 模块而运作,并在网络上提供服务。

虽然其中一些是可以直接使用的高性能服务器,但出于上述原因(例如较高的性能)建议在前面使用 Nginx。

一些受欢迎的 Python WSGI 网页服务器是:

  • CherryPy
  • Gunicorn
  • uWSGI
  • waitress

简介 简介


尽管命名惯例非常混乱,uWSGI本身是一个具有许多组件的庞大项目,旨在为建设托管服务提供完整的软件堆. 其中之一的uWSGI服务器运行了Python WSGI应用程序. 它能够使用各种协议,包括它自己的uwsgi电线协议,它与SCGI准同. 为了满足在应用程序服务器前使用独立的HTTP服务器这一可以理解的需求,NGINX和切罗基网络服务器被模块化,以支持uWSGI的[自有]性能最好的uwsgi协议来直接控制其进程.

主持人:UWSGI Highlights

  • uWSGI带有WSGI适配器,它完全支持在WSGI上运行的Python应用程序.
  • 联合国 它和利平通有关 它在启动时加载应用程序代码,并起到像Python解释器的作用. 它解析了收到的请求并引用了可调用的 Python 。
  • 联合国 它与受欢迎的NGINX网络服务器(同为切罗基和Lighttpd)直接相伴而来.
  • 联合国 其文为C.
  • 联合国 其各种组件所能做的远不止运行一个应用程序,它可能有利于扩展.
  • 目前(截至2013年底),它正在积极开发,并且有快速的释放周期。
  • 联合国 它拥有各种运行应用(同步和同步)的引擎.
  • 联合国 可以指: 更低的内存足迹来跑. .

准备系统部署


更新系统


为了有一个稳定的部署服务器,保持事物的最新和良好的维护至关重要。

为了确保我们拥有最新的默认应用程序版本,我们需要更新我们的系统。

运行以下操作来更新您的 CentOS 系统:

1yum -y update

设置 Python、Pip 和 virtualenv


注:本指南应适用于 CentOS 版本 6.5 以及 5.8 和 6.4。

CentOS / RHEL,默认情况下,作为一个非常薄弱的服务器。其工具集,这很可能会被日期化为您的需求,不是**在那里运行您的应用程序,但为服务器的系统工具(例如YUM)提供动力。

为了准备CentOS系统,需要设置Python(即从源编译)并使用该特定的解释器安装pip / virtualenv。

总的来说,我们将使用以下Python包:

python-dev - 开发工具* pip* - 管理包** virtualenv* - 创建孤立的虚拟环境

注: 以下是我们在CentOs 6.4上如何设置Python 2.7.6和3.3.3一篇文章的摘要(尽管是详尽的一篇文章)。 如果你想多学点,请检查一下 以防您想更多地了解 pip 和 virtualenv , 请参看我们的 [Common Python 工具: 使用 virtualenv And pip] (https://www.digitalocean.com/community/articles/common-python-tools-using-virtualenv-installing-with-pip-and-managing-packages) 教程 .

准备系统的发展


CentOS 发行版不包含您可能需要的许多流行的应用程序和工具 - 这是一个故意的设计选择。

对于我们的安装,我们将需要一些库和工具(即 development [related] tools ),而不是默认交付。

因此,我们需要在继续之前下载和安装它们。

YUM 软件组由一组常用的工具(应用程序)组成,可同时通过执行单个命令并指定 组名称 下载。

注意: 使用 YUM,您甚至可以一起下载多个组。

为了获得必要的开发工具,运行以下操作:

1yum groupinstall -y development

或;

1yum groupinstall -y 'development tools'

注意: 以前的(较短)版本可能不会在** CentOS** 的** 较旧** 发行版上工作。

要下载一些方便的附加包:

1yum install -y zlib-devel openssl-devel sqlite-devel bzip2-devel

在 CentOS 上下载、编译和安装 Python


注: 这里提供的指示可以用来下载任何Python版本. 您只需要用所需的版本(如下示例中所述的版本为2.7.6)替换(如3.3.3)。 您可以同时安装和使用多个版本。

让我们先从包含Python源代码的(压缩)档案中获取。

1wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz

此文件是使用 XZ 库压缩的。根据其版本,您的系统可能没有它。

1yum install xz-libs

解码 XZ 档案并提取 tar 档案的内容:

1# Let's decode (-d) the XZ encoded tar archive:
2xz -d Python-2.7.6.tar.xz
3
4# Now we can perform the extraction:
5tar -xvf Python-2.7.6.tar

使用 ./configure 验证代码库:

1# Enter the file directory:
2cd Python-2.7.6
3
4# Start the configuration (setting the installation directory)
5# By default files are installed in /usr/local.
6# You can modify the --prefix to modify it (e.g. for $HOME).
7./configure --prefix=/usr/local

构建和安装 Python 2.7.6:

1# Let's build (compile) the source
2# This procedure can take awhile (~a few minutes)
3make && make altinstall

[可选步骤]将新Python安装位置添加到PATH:

注意: 如果您使用默认设置遵循了指示,您不应该需要通过本节。但是,如果您选择了与 /usr/local 不同的 path 来安装 Python,您需要执行以下操作才能运行它而不明确表示其完整的 [安装] 路径 每一次

1# Example: export PATH="[/path/to/installation]:$PATH"
2export PATH="/usr/local/bin:$PATH"

要了解更多关于 PATH 的信息,请考虑阅读 PATH 定义 在 Linux 信息项目。

设置常见的 Python 工具 pip 和 virtualenv


安装了Python后,我们现在可以完成完成应用程序制作和部署的基础知识,为此,我们将设置两个最常用的工具:pip包管理器和virtualenv环境管理器。

如果您有兴趣了解这两种工具或快速刷新您的知识,请考虑阅读 常见的Python工具:使用virtualenv,使用Pip安装和管理包

在 CentOS 上安装 pip 使用新 Python 安装


在安装 pip 之前,我们需要获得其唯一的外部依赖性 - setuptools

执行以下命令来安装 setuptools:

这将为 [Python] 版本 2.7.6 安装

 1# Let's download the installation file using wget:
 2wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz
 3
 4# Extract the files from the archive:
 5tar -xvf setuptools-1.4.2.tar.gz
 6
 7# Enter the extracted directory:
 8cd setuptools-1.4.2
 9
10# Install setuptools using the Python we've installed (2.7.6)
11python2.7 setup.py install

安装 pip 本身是一个非常简单的过程,然后我们将使用上述文章的说明来自动和安全地使用 cURL 库下载和安装。

让我们下载Pip的设置文件,并让Python (2.7)安装它:

这将为 [Python] 版本 2.7.6 安装

1curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2.7 -

使用新 Python 安装在 CentOS 上安装 virtualenv


运行以下命令来下载和安装 virtualenv 使用 pip:

1pip install virtualenv

开始应用部署


在我们开始创建样本应用程序并实际下载(并安装)我们的服务器之前,我们需要(不必,但需要)创建一个虚拟环境,以包含与应用程序相关的库和数据。

创建部署的应用程序目录


让我们从构建一个应用程序目录开始,以包含:

  • 我们的应用模块 * 虚拟环境目录 * 服务器需要的 WSGI 文件
1# Folders / Directories
2mkdir ~/MyApplication     # Replace the name to suit your needs
3mkdir ~/MyApplication/app # Application (module) directory
4
5# Application Files 
6touch ~/MyApplication/WSGI.py          # Server entry-point
7touch ~/MyApplication/app/__init__.py  # Application file

创建虚拟环境


开始使用虚拟环境非常容易。

运行以下操作,在MyApplication目录中启动一个新的环境:

1cd ~/MyApplication
2virtualenv env

此命令将创建一个名为env的新目录 - 与应用程序模块app旁边。

与虚拟环境合作


有几种方法可以使用虚拟环境:

  • 啟用環境 * 明確指出 Python 解釋器在環境中的位置。

为了让事情简单,我们将遵循第二个选项,并明确说明Python解释器和Pip的位置。

在虚拟环境中下载和安装 uWSGI


若要使用 pip 安装 uWSGI,请执行以下操作:

1~/MyApplication/env/bin/pip install uwsgi

此命令将使 uWSGI 安装在我们的虚拟环境中。

下载和安装Flask图书馆


若要使用 pip 安装 Flask,请执行以下操作:

1~/MyApplication/env/bin/pip install flask

这个命令将安装Flask在我们的虚拟环境中

创建一个样本瓶装应用程序


为了继续我们的部署示例,我们需要设置一个样本应用程序来运行。

让我们创建(编辑)单页Flask应用程序:

1nano ~/MyApplication/app/__init__.py

插入下面的内容来定义一个简单的Flask应用程序:

1from flask import Flask
2app = Flask(__name__)
3
4@app.route("/")
5def hello():
6    return "Hello!"
7
8if __name__ == "__main__":
9    app.run()

保存和退出,按 CTRL + X 并用 Y 确认。

创建导入应用程序的样本 WSGI 文件


在正常情况下,我们创建的应用程序文件夹将包含主应用程序模块 - 我们将其概括为一个文件. 该应用程序模块,与应用程序对象一起,将由一个WSGI文件导入,以供服务。

让我们创建(编辑) WSGI.py 文件:

1nano ~/MyApplication/WSGI.py

放下下面的内容:

1from app import app
2
3if __name__ == "__main__":
4    app.run()

部署阶段:安装和设置 Nginx


无论服务器的选择,我们的 CherryPy 应用程序都会在 Nginx 后面在线,因为我们在上一节提到的原因,所以,让我们先下载和配置 Nginx 并继续工作应用程序服务器。

基本服务器架构的示例:

1Client Request ----> Nginx (Reverse-Proxy)
2                        |
3                       /|\                           
4                      | | `-> App. Server I. 127.0.0.1:8080 # Our example
5                      |  `--> App. Server II. 127.0.0.1:8082
6                       `----> App. Server III. 127.0.0.1:8083

安装 Nginx


请参阅 CentOS 的指示(https://www.digitalocean.com/community/articles/how-to-install-nginx-on-centos-6-with-yum)。

运行以下命令以使用 aptitude 安装 Nginx:

1# Enable EPEL Repository
2sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
3
4# Download and install Nginx
5sudo yum install -y nginx

要运行 Nginx,请使用以下方法:

1sudo service nginx start

要停止 Nginx,请使用以下方法:

1sudo service nginx stop

若要重新启动 Nginx,请使用以下方法:

1# After each time you reconfigure Nginx, a restart
2# or reload is needed for the new settings to come
3# into effect.  
4sudo service nginx restart

配置 Nginx


选择和设置一个 Web 服务器来运行我们的应用程序后,我们可以继续与 Nginx 做同样的事情,并准备与后端服务器(s)进行交谈(运行 WSGI 应用)。

要做到这一点,我们需要修改 Nginx 的配置文件:nginx.conf

运行以下命令,打开「nginx.conf」并使用纳米文本编辑器编辑它:

1sudo nano /etc/nginx/nginx.conf

您可以用以下示例配置来替换文件,以便 Nginx 作为反向代理程序工作,与您的应用程序交谈。

复制并粘贴下面的示例配置:

注意: 要了解如何嵌入 SSL 支持,请先阅读本文: 在 Nginx 上创建 SSL 证书

在下面的示例中,我们正在利用 Nginx 通过其 uwsgi 线程协议与 uWSGI 应用程序服务器的本地集成。

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 uwsgicluster {
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 by-pass for 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) outside static dir.
50        location = /favico.ico  {
51
52            root /app/favico.ico;
53
54        }
55
56        # Proxying connections to application servers
57        location / {
58
59            include uwsgi_params;
60            uwsgi_pass uwsgicluster;
61
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 服务器

创建 Python WSGI Web 应用服务器


注意: 有关使用 uWSGI 部署 Python Web 应用程序的更多信息,请参阅我们的文章: 如何使用 uWSGI Web 服务器部署

使用 uWSGI 服务应用程序


在本节中,我们将看到一个 Python WSGI 应用程序如何与 uWSGI 网络服务器一起工作。 uWSGI 需要的,就像其他服务器一样,是让您的应用程序为其提供一个入口点(即)。

运行服务器


uWSGI有许多选项和配置,由于其灵活性,有许多可能的方式来使用它们. 没有从一开始就复杂的事情,我们将开始尽可能简单地处理它,并继续使用更先进的方法。

注意: 在执行下面的命令之前,请确保在my_app文件夹中,否则 uwsgi 将无法找到wsgi.py或导入应用程序对象 app

简单的使用例子:**

1# Enter the application directory
2cd ~/MyApplication
3
4# Run uWSGI Installed inside the virtual environment
5env/bin/uwsgi [option] [option 2] .. -w [wsgi file with app. callable]

要运行 uWSGI 以便从 `wsgi.py 开始服务应用程序,请执行以下操作:

1cd ~/MyApplication
2env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app
3
4# To get uWSGI communicate with Nginx using HTTP:
5# env/bin/uwsgi --socket 127.0.0.1:8080 --protocol=http -w WSGI:app

这将使服务器在前台运行. 如果您想阻止它,请按 CTRL+C。

要在背景中运行服务器,请执行以下操作:

1env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app &

当您在背景中运行应用程序时,您需要使用一个流程管理器(例如 htop)来杀死(或停止)它。

在将应用程序服务器连接到 Nginx 后,您现在可以通过使用您喜爱的浏览器访问您的 Droplet 的 IP 地址。

1http://[your droplet's IP adde.]/
2
3# Hello, world!

继续阅读


如果您想了解更多关于 Python Web 应用程序部署的信息,建议您查看以下有关该主题的文章,以获得更全面的了解:

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