Armin Ronacher的Flask是过去几年中为Python创建的Web应用程序框架领域中发生过的最伟大的事情之一。
Flask是一个极简主义但极其功能强大的框架,非常受欢迎,并且可以通过多种第三方库(例如Flask-WTF或Flask-SQLAlchemy)进行扩展。这个开发人员友好的框架是使用Python开始Web开发的好方法,特别是如果你正在尝试了解技术挑战是如何解决的,这要归功于它干净且易于阅读的代码库 - 等待你的发现。
在这篇文章中,我们将尝试向你展示如何部署应用程序并以类似方式启动它。我们将首先准备运行CentOS 6.4 for Python的部署服务器,并了解如何正确使用uWSGI应用程序服务器集以在Nginx反向代理之后运行。
鉴于Flask的性质,除了我们在介绍部分已经提到的内容之外,其实就没有什么可说的了。它是一个编程精美,极简主义的Web应用程序开发库,只有两个直接依赖:Jinja2模板引擎和Werkzeug WSGI工具包。
使用Flask,可以非常轻松地创建可以从单个文件扩展到使用蓝图构建的数十个可重用模块(即组件)的网站。
在我们的文章中,我们将使用一个非常基本的示例Flask应用程序 - 严格创建演示部署。
对于所有Python WSGI Web应用程序,部署包括:准备一个WSGI模块,该模块包含对应用程序对象的引用,然后将其用作Web服务器的入口点,以传递应用程序要处理的请求。控制器(或视图)。
在这里,我们将使用uWSGI充当WSGI应用程序服务器,该服务器将包含Flask应用程序以在Nginx后面提供服务。由于Nginx本身支持uWSGI的首选和(广受好评的)更快的线路协议,因此我们将其设置为相应的工作。
简单地说,WSGI是Web服务器和应用程序本身之间的接口。它的存在是为了确保各种服务器和应用程序(框架)之间的标准化方式相互协作,在必要时允许互换(例如从开发环境切换到生产环境),这是当今必须要求的。
在Flask的案例中,WSGI操作由底层的Werkzeug中间件库处理。
Nginx是一个性能非常高的Web服务器/(反向)-proxy。它因其重量轻,易于使用和易于扩展(附加/插件)而受到欢迎。由于其架构,它能够处理大量请求(几乎无限制),这取决于你的应用程序或网站负载 - 使用其他一些较旧的替代品可能真的很难解决。
请记住: “处理”连接在技术上意味着不要丢弃它们并能够用某些东西为它们提供服务。你仍然需要你的应用程序和数据库正常运行才能让Nginx为客户端提供非错误消息的响应。
由于其受欢迎程度和成功,我们将部署在Nginx后面运行的Flask应用程序,以便从其强大的功能中受益。它对uWSGI应用服务器的原生支持也使其成为上网的首选方式。
Python Web应用程序服务器通常是独立的基于C的解决方案或完全(或部分)基于Python(即纯Python)的解决方案。
它们通过接受一个Python模块来运行,该模块包含 - 如前所述 - 一个可调用的应用程序,用于包含 Web应用程序并在网络上提供。
虽然其中一些是可以直接使用的高性能服务器,但由于上述原因(例如更高的性能),建议在前面使用Nginx。同样,由于缺乏功能,建议不要在生产中使用通常随Web应用程序框架一起提供的开发服务器 - 当然也有一些例外!
一些流行的Python WSGI Web服务器是:
尽管它的命名约定非常混乱,但uWSGI本身是一个包含许多组件的庞大项目,旨在为构建托管服务提供完整的软件堆栈。其中一个组件是uWSGI服务器,它运行Python WSGI应用程序。它能够使用各种协议,包括它自己的uwsgi线协议,它与SCGI准几何相同。为了满足在应用服务器前使用独立HTTP服务器的可理解需求,NGINX和Cherokee Web服务器进行了模块化,以支持uWSGI 自己最佳性能的uwsgi协议,以直接控制其进程。
uWSGI亮点
为了拥有稳定的部署服务器,保持最新和良好维护是至关重要的。
为了确保我们拥有最新的默认应用程序版本,我们需要更新我们的系统。
运行以下命令以更新CentOS系统:
yum -y update
注意:本教程适用于CentOS 6.5版以及5.8和6.4版。
默认情况下,CentOS / RHEL是一个非常精简的服务器。它的工具集可能会根据你的需求进行过时,不是为了运行你的应用程序而是为服务器的系统工具(例如YUM)供电。
需要设置Python从源代码编译安装,并且需要使用该特定解释器安装pip / virtualenv。
我们将使用以下Python包:
CentOS发行版没有许多你可能需要的流行应用程序和工具 - 这是一个有意的设计选择。
对于我们的安装,我们将需要一些默认情况下未提供的库和工具(即开发工具)。
因此,我们需要在继续之前下载并安装它们。
YUM软件组由一堆捆绑在一起的常用工具(应用程序)组成,可以通过执行单个命令并声明组名来同时下载所有这些工具。
注意:使用YUM,你甚至可以将多个组一起下载。
要获得必要的开发工具,请运行以下命令:
yum groupinstall -y development
或者:
yum groupinstall -y 'development tools'
注意:前(较短)版本可能不适用于较旧的CentOS发行版。
要下载一些方便的附加软件包:
yum install -y zlib-devel openssl-devel sqlite-devel bzip2-devel
注意:此处给出的说明可用于下载任何版本的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中的环境管理。
在安装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 -
使用pip下载并安装virtualenv:
pip install virtualenv
在我们开始创建示例应用程序并实际下载(和安装)我们的服务器之前,我们需要(不必,但需要)创建一个虚拟环境来包含与应用程序相关的库和数据。
让我们从构建应用程序目录开始,包含:
# 创建文件夹
mkdir ~/MyApplication # 文件名可以替换成其他你喜欢的名字
mkdir ~/MyApplication/app # 应用 (模块)文件
# 应用文件
touch ~/MyApplication/WSGI.py # 服务器入口点
touch ~/MyApplication/app/__init__.py # 应用文件
开始使用虚拟环境非常容易。
运行以下命令以在MyApplication
目录中启动新环境:
cd ~/MyApplication
virtualenv env
此命令将env
在应用程序模块旁边创建一个名为- 的新目录app
。
有几种方法可以使用虚拟环境:
为了简单起见,我们将遵循第二个选项并明确说明Python解释器和pip的位置。
要使用pip安装uWSGI,请运行以下命令:
~/MyApplication/env/bin/pip install uwsgi
此命令将在我们的虚拟环境中安装uWSGI。
要使用pip安装Flask,请运行以下命令:
~/MyApplication/env/bin/pip install 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确认。
在正常情况下,我们创建的app文件夹将包含主应用程序模块 - 我们在一个文件中汇总。此应用程序模块与app对象一起将由要提供的WSGI文件导入。在此步骤中,我们将创建WSGI文件,该文件将导入应用程序,并在下一步中将其提供给uWSGI应用程序服务器。
让我们创建(编辑)WSGI.py文件:
nano ~/MyApplication/WSGI.py
输入以下内容:
from app import app
if __name__ == "__main__":
app.run()
无论选择何种服务器,我们的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
先安装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
在选择并设置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应用程序如何与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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。