前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在CentOs 6.4 上使用uWSGI+Nginx部署Flask Web服务器

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

原创
作者头像
藕丝空间
发布2018-08-06 17:37:38
1.5K0
发布2018-08-06 17:37:38
举报

介绍

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系统:

代码语言:txt
复制
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,你甚至可以将多个组一起下载。

要获得必要的开发工具,请运行以下命令:

代码语言:txt
复制
yum groupinstall -y development

或者:

代码语言:txt
复制
yum groupinstall -y 'development tools'

注意:前(较短)版本可能不适用于较旧CentOS发行版。

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

代码语言:txt
复制
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

代码语言:txt
复制
wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz

使用XZ库压缩此文件。你的系统可能没有它,具体取决于其版本。如果是这种情况,请运行以下命令以安装XZ库:

代码语言:txt
复制
 yum install xz-libs

解码XZ存档,并解压缩tar存档的内容:

代码语言:txt
复制
# 让我们解码(-d) XZ编码的tar存档:
xz -d Python-2.7.6.tar.xz


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

使用./configure验证代码库:

代码语言:txt
复制
# 进入文件目录:
cd Python-2.7.6

# 开始配置 (设置安装目录)
# 默认情况下是安装在 /usr/local.
# 更改prefix .
./configure --prefix=/usr/local    

构建并安装Python 2.7.6:

代码语言:txt
复制
# Let's build (compile) the source
# This procedure can take awhile (~a few minutes)
make && make altinstall

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

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

代码语言:txt
复制
# 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版安装它

代码语言:txt
复制
# 使用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版安装它

代码语言:txt
复制
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2.7 -

在CentOS上安装virtualenv

使用pip下载并安装virtualenv:

代码语言:txt
复制
pip install virtualenv

应用程序部署入门

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

创建部署的应用程序目录

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

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

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

创建虚拟环境

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

运行以下命令以在MyApplication目录中启动新环境:

代码语言:txt
复制
cd ~/MyApplication
virtualenv env

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

使用虚拟环境

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

  • 激活环境
  • 明确说明Python解释器在环境中的位置。

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

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

要使用pip安装uWSGI,请运行以下命令:

代码语言:txt
复制
~/MyApplication/env/bin/pip install uwsgi

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

下载并安装Flask库

要使用pip安装Flask,请运行以下命令:

代码语言:txt
复制
~/MyApplication/env/bin/pip install flask

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

创建Flask示例应用程序

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

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

代码语言:txt
复制
nano ~/MyApplication/app/__init__.py

输入以下内容以定义简单的Flask应用:

代码语言:txt
复制
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文件:

代码语言:txt
复制
nano ~/MyApplication/WSGI.py

输入以下内容:

代码语言:txt
复制
from app import app

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

部署阶段:安装和设置Nginx

无论选择何种服务器,我们的CherryPy应用程序都将在Nginx后面上线,原因我们在前面几节中提到过。因此,让我们首先下载并配置Nginx,然后继续使用应用程序服务器。

基本服务器体系结构的示例:

代码语言:txt
复制
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保持最新。

代码语言:txt
复制
sudo yum install epel-release

然后再安装Nginx:

代码语言:txt
复制
sudo yum install nginx

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

代码语言:txt
复制
sudo service nginx start

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

代码语言:txt
复制
sudo service nginx stop

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

代码语言:txt
复制
# 每次配置完Nginx
# 或者需要重新加载Nginx配置
# 都需要重启Nginx,才能使配置文件生效.  
sudo service nginx restart

配置Nginx

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

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

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

代码语言:txt
复制
sudo nano /etc/nginx/nginx.conf

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

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

在下面的示例中,我们通过其uwsgi wire-protocol利用Nginx与uWSGI应用程序服务器的本机集成。

Web应用程序的配置示例:

代码语言:txt
复制
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:

代码语言:txt
复制
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也没有导入应用程序对象的应用程序

简单用法示例:

代码语言:txt
复制
# 先进入之前创建的文件
cd ~/MyApplication

# 运行安装在虚拟环境中的uWSGI
env/bin/uwsgi [option] [option 2] .. -w [wsgi file with app. callable]

要运行uWSGI以开始提供应用程序wsgi.py,请运行以下命令:

代码语言:txt
复制
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.

要在后台运行服务器,请运行以下命令:

代码语言:txt
复制
env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app &

当你在后台运行应用程序时,你将需要使用进程管理器(例如htop)来终止(或停止)它。

将应用程序服务器与Nginx连接后,你现在可以使用你喜欢的浏览器访问服务器的IP地址来访问它。

代码语言:txt
复制
http://[your droplet's IP adde.]/

# Hello, world!

总结

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


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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 目录
    • 1.Flask简介
      • 2.准备部署系统
        • 3.应用程序部署入门
          • 4.部署阶段:安装和设置Nginx
            • 5.部署阶段:使用uWSGI
              • 6.进一步阅读
              • Flask简介
                • Web应用程序部署
                  • WSGI简介
                    • 使用Nginx作为反向代理
                      • Python WSGI Web应用程序服务器
                        • uWSGI简介
                        • 准备部署系统
                          • 更新系统
                            • 设置Python,pip和virtualenv
                              • 准备系统进行开发
                                • 在CentOS上下载,编译和安装Python
                                  • 设置常见的Python工具pip和virtualenv
                                    • 使用新的Python安装在CentOS上安装pip
                                      • 在CentOS上安装virtualenv
                                      • 应用程序部署入门
                                        • 创建部署的应用程序目录
                                          • 创建虚拟环境
                                            • 使用虚拟环境
                                              • 在虚拟环境中下载和安装uWSGI
                                                • 下载并安装Flask库
                                                  • 创建Flask示例应用程序
                                                    • 创建导入应用程序的示例WSGI文件
                                                    • 部署阶段:安装和设置Nginx
                                                      • 安装Nginx
                                                        • 配置Nginx
                                                        • 设置Python WSGI Web应用程序服务器
                                                          • 使用uWSGI服务应用程序
                                                            • 运行服务器
                                                            • 总结
                                                            相关产品与服务
                                                            消息队列 TDMQ
                                                            消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                                                            领券
                                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档