如何在CentOS6.4上使用Nginx后面的uWSGI部署FlaskWeb应用程序
状态:已弃用
本文介绍了不再受支持的 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)。 这个对开发人员友好的框架是使用 Python 开始 Web 开发的好方法,尤其是当您尝试了解如何解决技术挑战时,这要归功于其干净且易于阅读的代码库 - 等待您来发现。
在这篇 DigitalOcean 文章中,我们将尝试向您展示如何部署您的应用程序并以类似的方式启动并运行它。 我们将从为 Python 准备运行 CentOS 6.4 的部署服务器开始,并了解如何正确使用设置为在 Nginx 反向代理后面运行的 uWSGI 应用程序服务器。
词汇表
1. 烧瓶简介
- Web 应用程序部署
- WSGI 简介
- 使用 Nginx 作为反向代理
- Python WSGI Web 应用服务器
- uWSGI 简介
2. 准备系统部署
- 更新系统
- 设置 Python、pip 和 virtualenv
- 准备开发系统
- 在 CentOS 上下载、编译和安装 Python
- 使用新的 Python 安装在 CentOS 上安装 pip
- 使用新的 Python 安装在 CentOS 上安装 virtualenv
3. 应用程序部署入门
- 为部署创建应用程序目录
- 创建虚拟环境
- 使用虚拟环境
- 在虚拟环境中下载和安装 uWSGI
- 下载和安装 Flask 库
- 创建示例 Flask 应用程序
4. 部署阶段:安装和设置 Nginx
- 安装 Nginx
- 配置 Nginx
5. 部署阶段:使用 uWSGI
- 运行服务器
6. 延伸阅读
烧瓶简介
鉴于 Flask 的性质,除了我们在介绍部分已经提到的内容外,没有什么可说的了。 它是一个编程精美、极简主义的 Web 应用程序开发库,只有两个直接依赖项:Jinja2 模板引擎和 Werkzeug WSGI 工具包。
使用 Flask,创建可以从单个文件扩展到数十个可重用模块(即 组件)使用蓝图构建。
在我们的文章中,我们将使用一个非常基本的示例 Flask 应用程序 - 严格创建用于演示部署。 要了解如何打包和上传应用程序,请查看我们的文章 如何打包和分发 Python 应用程序。 如果您有兴趣了解更多关于 Flask 和“变大”的信息,您可能会对我们的 如何构建大型 Flask 应用程序 感兴趣。
Web 应用程序部署
对于所有 Python WSGI Web 应用程序,部署包括准备一个 WSGI 模块,该模块包含对应用程序对象的引用,然后 Web 服务器将其用作入口点,以传递将由应用程序处理的请求控制器(或视图)。
在这里,我们将使用 uWSGI 作为 WSGI 应用程序服务器,它将包含 Flask 应用程序以在 Nginx 后面为其提供服务。 由于 Nginx 对 uWSGI 的首选和(广受赞誉的)更快的有线协议具有原生支持,因此我们将对其进行相应设置。
WSGI 简介
非常简单地说,WSGI 是 Web 服务器和应用程序本身之间的接口。 它的存在是为了确保各种服务器和应用程序(框架)之间以标准化的方式相互工作,在必要时允许互换性(例如 从开发环境切换到生产环境),这是当今的必备需求。
注意: 如果您有兴趣了解更多关于 WSGI 和 Python Web 服务器的信息,请查看我们的文章:基于 Python 的 Web 应用程序的 Web 服务器比较。
在 Flask 的例子中,WSGI 操作由底层的 Werkzeug 中间件库处理。
使用 Nginx 作为反向代理
Nginx 是一个非常高性能的 Web 服务器/(反向)代理。 由于重量轻、相对容易使用和易于扩展(使用附加组件/插件),它已经流行起来。 由于其架构,它能够处理 很多 的请求(几乎无限制),这取决于您的应用程序或网站负载 - 使用其他一些较旧的替代方案可能真的很难解决。
记住:“处理”连接在技术上意味着不丢弃它们,并且能够使用 something 为它们服务。 您仍然需要您的应用程序和数据库运行良好才能让 Nginx 为客户端 响应 而不是错误消息。
由于它的流行和成功,我们将部署在 Nginx 后面运行的 Flask 应用程序,以从其强大的功能中受益。 它对 uWSGI 应用服务器的原生支持也使其成为首选的上网方式。
Python WSGI Web 应用服务器
Python Web 应用服务器 [通常] 要么是独立的基于 C 的解决方案,要么是完全(或部分)基于 Python(即 纯Python)的。
它们通过接受一个 Python 模块进行操作,该模块包含 - 如前所述 - 一个可调用的应用程序 包含 网络应用程序并在网络上提供它。
虽然其中一些是可以直接使用的高能力服务器,但是前面提到的原因还是推荐使用Nginx(例如 更高的性能)。 同样,通常附带 Web 应用程序框架的开发服务器不建议在生产中使用,因为它们缺乏功能 - 当然也有少数例外 !
一些流行的 Python WSGI Web 服务器是:
- 樱桃派
- 独角兽
- uWSGI
- 女服务员
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,默认情况下,作为一个非常精简的服务器。 它的工具集很可能已经过时以满足您的需求, 不是 用于运行您的应用程序,而是为服务器的系统工具(例如 百胜)。
为了准备一个CentOS系统,需要设置Python(即 从源代码编译)和 pip / virtualenv 需要使用该特定解释器安装。
总而言之,我们将使用以下 Python 包:
- python-dev – 开发工具
- pip – 管理包
- virtualenv – 创建隔离的虚拟环境
注意: 以下是我们的如何在CentOs 6.4 上设置Python 2.7.6 和3.3.3 文章的一个总结(虽然很详尽)。 如果您想了解更多信息,建议您查看它。 如果您想了解更多关于 pip 和 virtualenv 的信息,请参阅我们的 常用 Python 工具:使用 virtualenv 和 pip 教程。
准备开发系统
CentOS 发行版不附带许多您可能需要的流行应用程序和工具 - ,这是一个有意的设计选择 。
对于我们的安装,我们将需要一些库和工具(即 开发[相关]工具)默认不发货。
因此,我们需要在继续之前下载并安装它们。
YUM 软件组由捆绑在一起的常用工具(应用程序)组成,通过执行单个命令并声明 组名称 ,可以同时下载所有工具。
注意: 使用YUM,你甚至可以同时下载多个群组。
为了获得必要的开发工具,运行以下命令:
yum groupinstall -y development
或者;
yum groupinstall -y 'development tools'
注意: 以前的(较短的)版本可能不适用于 CentOS 的 older 发行版。
要下载一些方便的附加软件包:
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 存档的内容:
# 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/local 不同的 path 来安装 Python,则需要执行以下操作才能在不明确说明其完整 [installation] 的情况下运行它] 路径 每次 。
# Example: export PATH="[/path/to/installation]:$PATH" export PATH="/usr/local/bin:$PATH"
要了解有关 PATH 的更多信息,请考虑阅读 Linux 信息项目中的 PATH 定义。
设置常用 Python 工具 pip 和 virtualenv
安装 Python 后,我们现在可以完成应用程序生产和部署的基础知识。 为此,我们将设置 ' 最常用的两个工具:pip 包管理器和 virtualenv 环境管理器。
如果您有兴趣进一步了解这两个工具或只是快速更新知识,请考虑阅读 常用 Python 工具:使用 virtualenv、使用 Pip 安装和管理包。
使用新的 Python 安装在 CentOS 上安装 pip
在安装 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
此命令将在应用程序模块 app
旁边创建一个名为 env
的新目录。
使用虚拟环境
有几种方法可以使用虚拟环境:
- 激活环境
- 明确说明 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
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
并使用 nano 文本编辑器进行编辑:
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
,也无法导入应用程序对象[ X187X]应用程序。
简单的使用示例:
# 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 应用程序部署的更多信息,建议您查看我们关于该主题的以下文章以获得更好的总体理解: