金钱(警告)
状态: 被贬低
本文涵盖了不再受支持的 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
- Web 应用程序部署 2. WSGI 简要 3. 使用 Nginx 作为反向代理 4. Python WSGI Web 应用程序服务器 5. uWSGI 简要
2. Preparing The System For Deployment
- 更新系统 2. 设置 Python、pip 和 virtualenv 3. 准备系统进行开发 4. 在 CentOS 上下载、编译和安装 Python 5. 使用新 Python 安装在 CentOS 上安装 pip 6. 使用新 Python 安装在 CentOS 上安装 virtualenv
3. Getting Started With Application Deployment
- 创建应用程序目录用于部署 2. 创建虚拟环境 3. 与虚拟环境一起工作 4. 在虚拟环境中下载和安装 uWSGI 5. 下载和安装 Flask 库 6. 创建样本 Flask 应用程序
4. Deployment Stage: Installing And Setting Up Nginx
- 安装 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 应用程序部署的信息,建议您查看以下有关该主题的文章,以获得更全面的了解: