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

介绍

Armin Ronacher的Flask是在过去几年中为Python创建的Web应用程序框架领域中发生的最伟大的事情之一。 Flask是简约但非常实用-和强大的-框架,是非常受欢迎的和非常扩展与第三方库(例如FlaskWTF或Flask的SQLAlchemy)的一个很好的选择。这个开发人员友好的框架是一个伟大的方式使用Python启动Web开发,特别是如果你试图学习如何解决技术挑战,由于它干净,易于阅读的代码库,等待你发现。 在这篇DigitalOcean文章中,我们将尝试向您展示如何部署应用程序并以类似的方式运行它。我们将从准备运行CentOS 6.4 for Python的部署服务器开始,看看如何正确地使用uWSGI应用程序服务器集合来操作Nginx逆向代理。

词汇表

Flask简介

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

2.准备系统部署

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

3.应用程序部署入门

  1. 创建部署的应用程序目录
  2. 创建虚拟环境
  3. 使用虚拟环境
  4. 在虚拟环境中下载和安装uWSGI
  5. 下载并安装Flask库
  6. 创建样品 Flask应用程序

4.部署阶段:安装和设置Nginx

  1. 安装Nginx
  2. 配置Nginx

5.部署阶段:使用uWSGI

  1. 运行服务器

6.进一步阅读

Flask简介

鉴于Flask的本质,没有什么别的要说的,我们已经在介绍部分中提到过。这是一个美丽的编程,简约的Web应用程序开发库,只有两个直接的依赖: Jinja2的模板引擎和 WERKZEUG WSGI工具包。 使用Flask,创建网站非常容易,可以从单个文件扩展到使用蓝图结构化的几十个可重用模块(即组件)。 在我们的文章中,我们将使用一个非常基本的,示例Flask应用程序 - 严格创建以演示部署。为了了解打包应用程序,并上传,看看我们的文章 如何打包和分发Python应用程序 。 如果您有兴趣了解更多关于Flask和“渐大”,你可能有兴趣在我们 如何构建Large Flask的应用

Web应用程序部署

对于所有Python WSGI Web应用程序,部署包括准备一个WSGI模块,该模块包含对您的应用程序对象的引用,然后将其用作Web服务器的入口点,以传递应用程序要处理的请求控制器(或视图)。 在这里,我们将使用uWSGI作为WSGI应用程序服务器,将包含Flask应用程序在Nginx后面提供它。由于Nginx原生支持uWSGI的首选和(广受赞誉的)更快的线协议,我们将设置它工作相应。

WSGI简介

非常简单地说,WSGI是Web服务器和应用程序本身之间的接口。它的存在是为了确保各种服务器和应用程序(框架)之间的标准化方式,以便彼此协作,在必要时允许可互换性(例如,从开发切换到生产环境),这是当今必需的。 注意:如果你有兴趣了解更多关于WSGI和Python的Web服务器,看看我们的文章: 网络服务器的基于Python的Web应用程序的比较 。 在Flask的情况下,WSGI操作由底层的Werkzeug中间件库处理。

使用Nginx作为反向代理

Nginx是一个非常高性能的Web服务器/(反向)-proxy。它已经达到了它的普及,由于重量轻,相对容易工作和易于扩展(与附加/插件)。由于它的结构,它能够处理 大量的哪些请求(几乎不受限制)的-这取决于你的应用程序或网站负载-可能是真的很难用一些其他的,旧的替代品来解决。
请记住:“处理”连接技术上意味着不会放弃他们,并能与 一些为他们服务。 你仍然需要你的应用程序和数据库运作良好,才能有Nginx的为客户服务 的反应是不错误消息。
由于其流行和成功,我们将部署在Nginx后面运行的Flask应用程序,以从其强大的功能中受益。它对uWSGI应用服务器的本地支持也使其成为一种首选的在线方式。

Python WSGI Web应用程序服务器

Python Web应用程序服务器通常是独立的基于C的解决方案或完全(或部分)基于Python(即纯Python)的解决方案。 它们通过接受含有Python模块操作-如先前所解释-调用的应用程序以 包含 web应用和服务于它在网络上。 虽然其中一些是高性能的服务器可以直接使用,建议使用Nginx前面的上述原因(例如更高的性能)。同样,不建议通常都是与Web应用框架开发服务器在生产中使用,由于其缺乏功能- 除少数例外,当然一些流行的Python WSGI Web服务器是:
  • CherryPy
  • Gunicorn
  • uWSGI
  • 服务员

uWSGI简介

尽管它非常混乱的命名约定,uWSGI本身是一个巨大的项目与许多组件,旨在提供一个完整的软件构建托管服务。其中一个组件,uWSGI服务器,运行Python WSGI应用程序。它能够使用各种协议,包括其自己的uwsgi wire协议,这与SCGI准等同。为了满足在应用服务器前使用独立HTTP服务器的可理解需求,NGINX和Cherokee Web服务器被模块化以支持uWSGI的自己的最佳性能的uwsgi协议,以直接控制其进程。 uWSGI亮点
  • uWSGI带有一个WSGI适配器,它完全支持在WSGI上运行的Python应用程序。
  • 它与libpython链接。它在启动时加载应用程序代码,并像一个Python解释器。它解析传入的请求并调用Python可调用。
  • 它直接支持流行的NGINX Web服务器(与Cherokee和lighttpd一起)。
  • 它写在C.
  • 它的各种组件可以做更多的运行一个应用程序,这可能是方便的扩展。
  • 目前(截至2013年底),它是积极开发和具有快速释放周期。
  • 它具有用于运行应用程序(异步和同步)的各种引擎。
  • 它可以意味着更低的内存占用运行。

准备系统部署

更新系统

为了有一个稳定的部署服务器,保持最新和良好的维护至关重要。 为了确保我们有最新的可用版本的默认应用程序,我们需要更新我们的系统。 运行以下命令更新您的CentOS系统:
yum -y update

设置Python,pip和virtualenv

注意:本指南应该是有效的为CentOS 6.5版本以及5.8和6.4。 CentOS / RHEL默认情况下是一个非常精简的服务器。它的工具,这很可能是约会了您的需求,是 不是有运行应用程序,但对于服务器的系统工具电源(例如:YUM)。 为了准备CentOS系统,需要设置Python(即从源代码编译),并且需要使用特定的解释器安装pip / virtualenv。 总而言之,我们将使用以下Python包:
  • python-dev的 -开发工具
  • 点子 -管理包
  • 的virtualenv -创建隔离,虚拟环境
注意:以下是我们的总结(虽然是一个彻底的) 如何设置的Python 2.7.6和3.3.3在CentOS 6.4的文章。 如果您想了解更多,建议您查看。 如果你可能想了解更多关于PIP和virtualenv中,看到我们 常用的Python工具:使用的virtualenv和PIP教程。

准备系统开发

CentOS的发行不来与许多流行的应用程序和你很可能需要的工具 -这是一个有意的设计选择 。 对于我们的安装,我们将需要一些库和工具(如 开发[相关]工具),默认情况下不发货。 因此,我们需要先让他们下载并安装,然后再继续。 YUM软件组由一群捆绑在一起的常用工具(应用程序),可供下载全部通过单个命令的执行,并说明 组名的同时。 注意:使用YUM,你甚至可以下载多个团体在一起。 为了获得必要的开发工具,运行以下命令:
yum groupinstall -y development
要么;
yum groupinstall -y 'development tools'
注:前(较短)版本可能 的CentOS较老的版本上工作。 要下载一些额外的包是方便:
yum install -y zlib-devel openssl-devel sqlite-devel bzip2-devel

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

注意:这里给出的说明可以用来下载任何版本的Python。您只需要将您所需的版本(例如3.3.3)替换为所声明的版本(在下面的示例中为2.7.6)。您可以同时安装和使用多个版本。但是,你将需要在执行期间指定它们的版本(即,而不是python,你将需要使用python2.7或python3.3) 让我们开始检索包含Python源代码的(压缩)归档。我们将针对 --version 2.7.6
wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
此文件是使用 XZ库压缩。 系统,这取决于它的版本,可能 没有它。如果是这种情况,请运行以下安装XZ库:
 yum install xz-libs
解码XZ存档,并解压缩tar存档的内容:
# Let's decode (-d) the XZ encoded tar archive:
xz -d Python-2.7.6.tar.xz


# Now we can perform the extraction:
tar -xvf Python-2.7.6.tar
验证使用的代码库 ./configure
# Enter the file directory:
cd Python-2.7.6

# Start the configuration (setting the installation directory)
# By default files are installed in /usr/local.
# You can modify the --prefix to modify it (e.g. for $HOME).
./configure --prefix=/usr/local    
构建和安装Python 2.7.6:
# Let's build (compile) the source
# This procedure can take awhile (~a few minutes)
make && make altinstall
[可选步骤]添加新的Python安装位置到PATH:
注意:如果按照使用默认设置的说明,你不应该有必要通过这个部分。 但是,如果你选择了一个不同的 路径/ usr /本地安装Python,则需要执行以下才能够不必 每次都明确说明其完全[安装]路径运行。
# Example: export PATH="[/path/to/installation]:$PATH"
export PATH="/usr/local/bin:$PATH"
要了解更多关于PATH,可以阅读 PATH定义在Linux信息项目。

设置常用Python工具pip和virtualenv

安装Python之后,我们现在可以完成完成应用程序生产和部署的基础知识。为此,我们将设立 两个最常用的工具 :PIP封装经理和环境 的virtualenv经理。 如果您有兴趣了解更多关于这两个工具或者只是快速地刷新自己的知识,可以阅读 常用的Python工具:使用的virtualenv,用Pip安装和管理软件包

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

安装点子之前,我们需要得到它的唯一的对外依存度- setuptools的 。 执行以下命令安装setuptools:
这将安装它为[Python]版本2.7.6
# Let's download the installation file using wget:
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz

# Extract the files from the archive:
tar -xvf setuptools-1.4.2.tar.gz

# Enter the extracted directory:
cd setuptools-1.4.2

# Install setuptools using the Python we've installed (2.7.6)
python2.7 setup.py install
安装pip本身是一个非常简单的过程。我们将使用的指示从上面提到的把它下载和使用 cURL库自动,安全地安装的文章。 让我们下载pip的安装文件,并使用Python(2.7)安装它:
这将安装它为[Python]版本2.7.6
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2.7 -

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

运行以下命令以使用pip下载并安装virtualenv:
pip install virtualenv

应用程序部署入门

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

创建部署的应用程序目录

让我们开始构建一个应用程序目录来包含:
  • 我们的应用模块
  • 虚拟环境目录
  • 服务器需要的WSGI文件
# Folders / Directories
mkdir ~/MyApplication     # Replace the name to suit your needs
mkdir ~/MyApplication/app # Application (module) directory

# Application Files 
touch ~/MyApplication/WSGI.py          # Server entry-point
touch ~/MyApplication/app/__init__.py  # Application file

创建虚拟环境

开始使用虚拟环境非常容易。 运行以下命令以启动内部一个新的环境 MyApplication目录:
cd ~/MyApplication
virtualenv env
此命令将创建一个新的目录-所谓的 env -旁边的应用模块 app

使用虚拟环境

有一些方法可以使用虚拟环境:
  • 激活环境
  • 明确说明Python解释器在环境中的位置。
为了保持简单,我们将遵循第二个选项,并明确地说明Python解释器和pip的位置。

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

要使用pip安装uWSGI,请运行以下命令:
~/MyApplication/env/bin/pip install uwsgi
此命令将在我们的虚拟环境中安装uWSGI。

下载并安装Flask库

要使用pip安装Flask,请运行以下命令:
~/MyApplication/env/bin/pip install flask
这个命令将在我们的虚拟环境中安装Flask

创建样品 Flask应用程序

要继续我们的部署示例,我们需要设置一个示例应用程序来运行。 让我们创建(编辑)单页Flask应用程序:
nano ~/MyApplication/app/__init__.py
放置以下内容定义一个简单的Flask应用程序:
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello!"

if __name__ == "__main__":
    app.run()
按CTRL + X并用Y确认保存并退出。

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

在正常情况下,我们创建的应用程序文件夹将包含主应用程序模块 - 我们在单个文件中总结。此应用程序模块与app对象一起将由要提供的WSGI文件导入。在此步骤中,我们将创建该WSGI文件,该文件将导入应用程序,并在下一步中将其提供给uWSGI应用程序服务器。 让我们创建(编辑)WSGI.py文件:
nano ~/MyApplication/WSGI.py
放置以下内容:
from app import app

if __name__ == "__main__":
    app.run()

部署阶段:安装和设置Nginx

不管服务器的选择,我们的CherryPy应用程序将在Nginx后面上线,原因我们在前面的部分中已经提到。所以,让我们首先下载并配置Nginx,然后继续工作的应用服务器。 基本服务器体系结构示例:
Client Request ----> Nginx (Reverse-Proxy)
                        |
                       /|\                           
                      | | `-> App. Server I.   127.0.0.1:8080 # Our example
                      |  `--> App. Server II.  127.0.0.1:8082
                       `----> App. Server III. 127.0.0.1:8083

安装Nginx

CentOS / RHEL用户注意事项: 以下说明不适用于CentOS系统。请参阅说明书 在这里为CentOS。
运行以下命令使用aptitude安装Nginx:
# Enable EPEL Repository
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

# Download and install Nginx
sudo yum install -y nginx
要运行Nginx,请使用以下命令:
sudo service nginx start
要停止Nginx,请使用以下命令:
sudo service nginx stop
要重新启动Nginx,请使用以下命令:
# After each time you reconfigure Nginx, a restart
# or reload is needed for the new settings to come
# into effect.  
sudo service nginx restart

配置Nginx

在选择和设置一个web服务器来运行我们的应用程序后,我们可以继续对Nginx做同样的事情,并准备与后端服务器(运行WSGI应用程序)通信。 为了实现这一点,我们需要修改Nginx的配置文件:“nginx.conf” 运行以下命令来打开 nginx.conf并采用纳米文本编辑器编辑:
sudo nano /etc/nginx/nginx.conf
您可以使用以下示例配置替换文件,以使Nginx作为反向代理工作,与应用程序通信。 复制并粘贴以下示例配置:
注意:要了解结合SSL支持,请先看看这篇文章: 创建于Nginx的SSL证书
在下面的示例中,我们通过uwsgi线程协议利用了Nginx与uWSGI应用服务器的本机集成。 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 uwsgicluster {

        server 127.0.0.1:8080;
        # server 127.0.0.1:8081;
        # ..
        # .

    }

    # Configuration for Nginx
    server {

        # Running port
        listen 80;

        # Settings to by-pass for static files 
        location ^~ /static/  {

            # Example:
            # root /full/path/to/application/static/file/dir;
            root /app/static/;

        }

        # Serve a static file (ex. favico) outside static dir.
        location = /favico.ico  {

            root /app/favico.ico;

        }

        # Proxying connections to application servers
        location / {

            include            uwsgi_params;
            uwsgi_pass         uwsgicluster;

            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服务器

设置Python WSGI Web应用程序服务器

注意:要了解更多有关部署使用uWSGI Python的Web应用程序,看看我们的文章: 如何使用uWSGI Web服务器来部署

使用uWSGI服务应用程序

在本节中,我们将看到Python WSGI应用程序如何与uWSGI Web服务器配合使用。 uWSGI需要什么,就像其他服务器,是您的应用程序为它提供一个入口点(即一个 app对象)。在启动期间,这个可调用以及配置变量被传递给uWSGI,它开始执行它的工作。当请求到达时,它处理它并将其传递到应用程序的控制器来处理。

运行服务器

uWSGI有很多选项和配置,有许多可能的使用方法,由于它的灵活性。从一开始就没有复杂的事情,我们将开始使用它尽可能简单,并继续使用更先进的方法。 注意:请务必 “my_app应用”文件夹中执行命令之下,否则uwsgi将无法找到前 wsgi.py也不导入应用程序对象 的应用程序简单用法示例:
# Enter the application directory
cd ~/MyApplication

# Run uWSGI Installed inside the virtual environment
env/bin/uwsgi [option] [option 2] .. -w [wsgi file with app. callable]
要运行uWSGI开始投放从应用wsgi.py ,运行以下命令:
cd ~/MyApplication
env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app

# To get uWSGI communicate with Nginx using HTTP:
# env/bin/uwsgi --socket 127.0.0.1:8080 --protocol=http -w WSGI:app
这将在前台运行服务器。如果你想停止它,按CTRL + C。
要在后台运行服务器,请运行以下命令:
env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app &
当您在后台运行应用程序时,您需要使用进程管理器(例如htop)来终止(或停止)它。有关详细信息,请参阅下面的部分。
就这样!在使用Nginx连接应用程序服务器后,您现在可以使用您最喜欢的浏览器访问您的Droplet的IP地址来访问它。
http://[your droplet's IP adde.]/

# Hello, world!

深入阅读

如果您想了解有关Python Web应用程序部署的更多信息,建议您查看我们关于此主题的以下文章,以获得更好的一般性了解:
:提交 OS Tezer
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏