如何在CentOs 6.4 上使用uWSGI+Nginx部署Flask Web服务器

介绍

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

Flask是一个极简主义但极其功能强大的框架,非常受欢迎,并且可以通过多种第三方库(例如Flask-WTF或Flask-SQLAlchemy)进行扩展。这个开发人员友好的框架是使用Python开始Web开发的好方法,特别是如果你正在尝试了解技术挑战是如何解决的,这要归功于它干净且易于阅读的代码库 - 等待你的发现。

在这篇文章中,我们将尝试向你展示如何部署应用程序并以类似方式启动它。我们将首先准备运行CentOS 6.4 for Python的部署服务器,并了解如何正确使用uWSGI应用程序服务器集以在Nginx反向代理之后运行。

目录

1.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应用程序 - 严格创建演示部署。

Web应用程序部署

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

在这里,我们将使用uWSGI充当WSGI应用程序服务器,该服务器将包含Flask应用程序以在Nginx后面提供服务。由于Nginx本身支持uWSGI的首选和(广受好评的)更快的线路协议,因此我们将其设置为相应的工作。

WSGI简介

简单地说,WSGI是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
  • waitress

uWSGI简介

尽管它的命名约定非常混乱,但uWSGI本身是一个包含许多组件的庞大项目,旨在为构建托管服务提供完整的软件堆栈。其中一个组件是uWSGI服务器,它运行Python WSGI应用程序。它能够使用各种协议,包括它自己的uwsgi线协议,它与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)供电。

需要设置Python从源代码编译安装,并且需要使用该特定解释器安装pip / virtualenv。

我们将使用以下Python包:

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

准备系统进行开发

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。你只需要将所需的版本(在下面的示例中为2.7.6)替换为你需要的版本(例如3.3.3)。你可以同时安装和使用多个版本。但是,你需要在执行期间指定它们的版本(即代替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存档的内容:

# 让我们解码(-d) XZ编码的tar存档:
xz -d Python-2.7.6.tar.xz


#现在我们可以进行提取:
tar -xvf Python-2.7.6.tar

使用./configure验证代码库:

# 进入文件目录:
cd Python-2.7.6

# 开始配置 (设置安装目录)
# 默认情况下是安装在 /usr/local.
# 更改prefix .
./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

可选步骤向PATH添加新的Python安装位置:

注意:如果你使用默认设置按照说明操作,则无需完成此部分。但是,如果你选择了一个不同的路径不是在/ usr /local安装Python,你将需要执行以下才能够没有明确说明其完全安装路径运行它每次

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

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

设置常见的Python工具pip和virtualenv

安装了Python之后,我们现在可以完成应用程序生产和部署的基础知识。为此,我们将建立两个最常用的工具:PIP包管理系统和virtualenv中的环境管理。

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

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

执行以下命令安装setuptools:

这将为Python 2.7.6版安装它

# 使用wget下载安装文件:
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz

# 解压下载的文件:
tar -xvf setuptools-1.4.2.tar.gz

# 进入解压后的文件:
cd setuptools-1.4.2

# 使用我们安装的python2.7运行 setup.py安装文件
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 -

在CentOS上安装virtualenv

使用pip下载并安装virtualenv:

pip install virtualenv

应用程序部署入门

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

创建部署的应用程序目录

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

  • 我们的应用模块
  • 虚拟环境目录
  • 服务器需要的WSGI文件
# 创建文件夹
mkdir ~/MyApplication     # 文件名可以替换成其他你喜欢的名字
mkdir ~/MyApplication/app # 应用 (模块)文件

# 应用文件
touch ~/MyApplication/WSGI.py          # 服务器入口点
touch ~/MyApplication/app/__init__.py  # 应用文件

创建虚拟环境

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

运行以下命令以在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文件夹将包含主应用程序模块 - 我们在一个文件中汇总。此应用程序模块与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

先安装EPEL

由于yum包管理器在其默认存储库中不包含最新版本的nginx,因此安装EPEL将确保CentOS上的nginx保持最新。

sudo yum install epel-release

然后再安装Nginx:

sudo yum install nginx

要运行Nginx,请使用以下命令:

sudo service nginx start

要停止Nginx,请使用以下命令:

sudo service nginx stop

要重新启动Nginx,请使用以下命令:

# 每次配置完Nginx
# 或者需要重新加载Nginx配置
# 都需要重启Nginx,才能使配置文件生效.  
sudo service nginx restart

配置Nginx

在选择并设置Web服务器以运行我们的应用程序之后,我们可以继续对Nginx执行相同操作并准备与后端服务器运行WSGI应用程序进行通信。

为此,我们需要修改Nginx的配置文件:nginx.conf

使用nano文本编辑器打开并编辑nginx.conf

sudo nano /etc/nginx/nginx.conf

你可以使用以下示例配置替换该文件,以使Nginx作为反向代理工作,与你的应用程序通信。

复制并粘贴以下示例配置:

在下面的示例中,我们通过其uwsgi wire-protocol利用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

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

使用uWSGI服务应用程序

在本节中,我们将了解Python WSGI应用程序如何与uWSGI Web服务器一起使用。与其他服务器一样,uWSGI需要的是为你的应用程序提供入口点(即app对象)。在启动期间,此可调用项以及配置变量将传递给uWSGI,并开始执行其工作。当请求到达时,它会处理它并将其传递给应用程序的控制器进行处理。

运行服务器

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

注:请确保是“my_app”文件夹执行以下命令,否则uwsgi将无法找到之前wsgi.py也没有导入应用程序对象的应用程序

简单用法示例:

# 先进入之前创建的文件
cd ~/MyApplication

# 运行安装在虚拟环境中的uWSGI
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

# 使用HTTP使uWSGI与Nginx通信:
# 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连接后,你现在可以使用你喜欢的浏览器访问服务器的IP地址来访问它。

http://[your droplet's IP adde.]/

# Hello, world!

总结

到此就安装结束了,现在就可以为所欲为了~,您也可以访问腾讯云+社区查看更多关于Flask 的相关内容


参考文献:《How To Deploy Flask Web Applications Using uWSGI Behind Nginx on CentOS 6.4》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏地方网络工作室的专栏

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(五)配置 Axios api 接口调用文件

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(五)配置 Axios api 接口调用文件 前情回顾 在上一篇《Vue2...

32680
来自专栏黑泽君的专栏

解决:Setting property 'source' to 'org.eclipse.jst.jee.server 的问题

  警告: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.ecli...

10220
来自专栏Zachary46

Android使用Jenkins自动化构建测试打包apk

Jenkins这东西搭建起来真是一点也不省心啊,看着别人的教程摸着石头过河,配置的东西有点多啊,稍有不慎,就构建不成功啦!即使步骤跟别人一样也会报各种乱七八糟的...

92220
来自专栏SpringBoot 核心技术

第一章:Maven环境下如何配置QueryDSL环境

23430
来自专栏云计算教程系列

如何使用Prometheus监视您的Ubuntu 14.04服务器

Prometheus是由SoundCloud开发的开源监控系统。与其他监控系统(如InfluxDB和Graphite)一样,Prometheus将其所有数据存储...

22100
来自专栏木头编程 - moTzxx

CentOS下如何更改默认的启动方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

11520
来自专栏python学习之旅

Python Appium笔记(一):Appium Android环境配置及示例

19850
来自专栏逸鹏说道

Javascript缓存投毒学习与实战

0x00 起因 不久前@三好学生师傅买了一个wooyun wifi,然后聊到了缓存投毒: ? 然后看到wooyun wifi的这个说明: 默认情况下该功能附带缓...

46750
来自专栏Android干货

Android项目实战(二十四):项目包成jar文件,并且将工程中引用的jar一起打入新的jar文件中

9240
来自专栏向治洪

解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题

对于这个问题,我相信我的方法已经能帮90%的人解决了! 当你用Eclipse运行web项目的时候,你就会看到控制台出现: WARNING: [SetPrope...

25470

扫码关注云+社区

领取腾讯云代金券