如何在 CentOS 7 上使用 Gunicorn 和 Nginx 服务 Flask 应用程序

介绍

在本指南中,我们将使用Flask微框架在CentOS 7上设置一个简单的Python应用程序。

前提条件

在开始本指南之前,您应该在您的服务器上配置一个非根用户。该用户需要具有sudo权限,以便执行管理功能。

要了解更多关于我们的应用程序服务器将使用的 WSGI 规格与我们的 Flask 应用程序进行通信,您可以阅读链接的部分 本指南

当你准备好继续阅读时,继续阅读。

安装 CentOS 和 EPEL 存储库的组件

我们的第一步将是从存储库中安装我们需要的所有零件,我们将需要添加包含一些额外包的EPEL存储库,以便安装我们需要的一些组件。

您可以通过键入启用 EPEL repo:

1sudo yum install epel-release

一旦在我们的系统上配置了对EPEL存储的访问,我们就可以开始安装所需的软件包。我们会安装Pip,Python包管理器,以便安装和管理我们的Python组件。我们还会得到一个编译器和Gunicorn所需的Python开发文件。我们现在也会安装Nginx。

您可以通过键入安装所有这些组件:

1sudo yum install python-pip python-devel gcc nginx

创建 Python 虚拟环境

接下来,我们将设置一个虚拟环境,以便将我们的Flask应用程序与系统上的其他Python文件隔离。

开始使用pip安装virtualenv包:

1sudo pip install virtualenv

现在,我们可以为我们的 Flask 项目创建一个母目录. 在您创建后移动到目录:

1mkdir ~/myproject
2cd ~/myproject

我们可以创建一个虚拟环境来存储我们的Flask项目的Python要求,通过键入:

1virtualenv myprojectenv

这将安装Python的本地副本和pip到项目目录中的名为myprojectenv的目录中。

在我们在虚拟环境中安装应用程序之前,我们需要激活它,您可以通过键入:

1source myprojectenv/bin/activate

您的提示将更改,表示您现在在虚拟环境中运行,它将看起来像(myprojectenv)user@host:~/myproject$

创建一个Flask应用程序

现在你在你的虚拟环境中,我们可以安装Flask和Gunicorn,并开始设计我们的应用程序:

安装Flask和Gunicorn

我们可以使用本地实例pip来安装 Flask 和 Gunicorn. 输入以下命令来获取这两个组件:

1pip install gunicorn flask

创建样本应用程序

现在我们有Flask可用,我们可以创建一个简单的应用程序. Flask是一个微框架. 它不包括更多功能框架可能的许多工具,并且主要是作为一个模块,您可以导入到您的项目,以帮助您初始化Web应用程序。

虽然您的应用程序可能更复杂,但我们将创建我们的Flask应用程序在一个文件中,我们将其命名为myproject.py:

1nano ~/myproject/myproject.py

在此文件中,我们将放置我们的应用程序代码. 基本上,我们需要导入 flask 并实例化一个 Flask 对象. 我们可以用此来定义需要执行特定路径时的函数。

1from flask import Flask
2application = Flask(__name__)
3
4@application.route("/")
5def hello():
6    return "<h1 style='color:blue'>Hello There!</h1>"
7
8if __name__ == "__main__":
9    application.run(host='0.0.0.0')

这基本上定义了在访问根域时要呈现的内容。

您可以通过键入测试您的 Flask 应用程序:

1python myproject.py

请访问您的服务器的域名或 IP 地址,然后在您的 Web 浏览器的终端输出中指定的端口号码(最有可能是 :5000)。

Flask sample app

完成后,在终端窗口中按 CTRL-C 几次来停止 Flask 开发服务器。

创建 WSGI 入口点

接下来,我们将创建一个文件,它将作为我们的应用程序的入口点,这将告诉我们的Gunicorn服务器如何与应用程序进行交互。

我们将文件命名为wsgi.py:

1nano ~/myproject/wsgi.py

文件非常简单,我们可以简单地从我们的应用程序中导入Flask实例,然后运行它:

1from myproject import application
2
3if __name__ == "__main__":
4    application.run()

保存并关闭文件,当你完成。

测试 Gunicorn 服务项目的能力

在继续前,我们应该检查Gunicorn能否正确。

我们还将指定接口和端口,以便它在公开可用的接口上启动:

1cd ~/myproject
2gunicorn --bind 0.0.0.0:8000 wsgi

如果您访问您的服务器的域名或 IP 地址,在您的 Web 浏览器的末端附有:8000,您应该看到一个看起来像这样的页面:

Flask sample app

当您确认它正常工作时,请在终端窗口中按 CTRL-C。

我们现在已经完成了我们的虚拟环境,所以我们可以禁用它:

1deactivate

任何操作现在都将被执行到系统的Python环境中。

创建系统单元文件

创建一个Systemd单元文件将允许CentOS的 init系统自动启动Gunicorn并在服务器启动时为我们的Flask应用程序提供服务。

/etc/systemd/system目录中创建一个以.service结束的文件,开始:

1sudo nano /etc/systemd/system/myproject.service

内部,我们将从一个[单位]部分开始,用于指定元数据和依赖性,我们将在这里列出我们的服务的描述,并告诉 init 系统在实现网络目标后才启动:

1[Unit]
2Description=Gunicorn instance to serve myproject
3After=network.target

接下来,我们将打开[服务]部分,我们将指定我们希望该进程运行的用户和组,我们将给我们的常规用户帐户拥有该进程,因为它拥有所有相关的文件,我们将给 Nginx 用户组拥有,以便它可以轻松与 Gunicorn 进程进行通信。

然后我们将绘制工作目录并设置PATH环境变量,以便 init 系统知道我们的进程的可执行位置(在我们的虚拟环境中)。

我们会告诉它启动3个工人流程(根据需要调整)。我们还会告诉它在我们的项目目录中创建并绑定一个名为myproject.sock的Unix接口文件。

 1[Unit]
 2Description=Gunicorn instance to serve myproject
 3After=network.target
 4
 5[Service]
 6User=user
 7Group=nginx
 8WorkingDirectory=/home/user/myproject
 9Environment="PATH=/home/user/myproject/myprojectenv/bin"
10ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi

我们需要添加到文件的最后一个部分是[安装]。这将告诉Systemd如果我们允许该服务在启动时启动,该服务将连接到什么。

 1[Unit]
 2Description=Gunicorn instance to serve myproject
 3After=network.target
 4
 5[Service]
 6User=user
 7Group=nginx
 8WorkingDirectory=/home/user/myproject
 9Environment="PATH=/home/user/myproject/myprojectenv/bin"
10ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi
11
12[Install]
13WantedBy=multi-user.target

这样,我们的 Systemd 服务文件就完成了. 现在保存并关闭它。

我们现在可以启动我们创建的Gunicorn服务,并启用它,以便它在启动时开始:

1sudo systemctl start myproject
2sudo systemctl enable myproject

将 Nginx 配置为 proxy 请求

我们的Gunicorn应用程序服务器现在应该运行,在项目目录中等待接口文件上的请求。

首先,打开 Nginx 的默认配置文件:

1sudo nano /etc/nginx/nginx.conf

打开在文件中已经存在的另一个服务器 {} 块上方的服务器块:

 1http {
 2    . . .
 3
 4    include /etc/nginx/conf.d/*.conf;
 5
 6    server {
 7    }
 8
 9    server {
10        listen 80 default_server;
11
12        . . .

我们将把我们Flask应用程序的所有配置放在这个新区块中,我们将首先指定该区块应该听到默认端口80,并应响应我们的服务器的域名或IP地址:

1server {
2    listen 80;
3    server_name server_domain_or_IP;
4}

我们需要添加的唯一东西是匹配每个请求的位置块. 在这个块中,我们将设置一些标准的代理 HTTP 标题,以便 Gunicorn 可以有一些关于远程客户端连接的信息。

 1server {
 2    listen 80;
 3    server_name server_domain_or_IP;
 4
 5    location / {
 6        proxy_set_header Host $http_host;
 7        proxy_set_header X-Real-IP $remote_addr;
 8        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 9        proxy_set_header X-Forwarded-Proto $scheme;
10        proxy_pass http://unix:/home/user/myproject/myproject.sock;
11    }
12}

保存并关闭文件,当你完成。

默认情况下,CentOS非常严格地锁定每个用户的主目录,所以我们会将nginx用户添加到我们的用户组中,以便我们可以打开提供访问所需的最低权限。

您可以通过以下命令将nginx用户添加到您的用户组中,在命令中代替自己的用户名为用户:

1sudo usermod -a -G user nginx

现在,我们可以给我们的用户组在我们的主目录上执行权限,这将允许 Nginx 进程进入和访问内容:

1chmod 710 /home/user

使用设置的权限,我们可以测试我们的 Nginx 配置文件以检测语法错误:

1sudo nginx -t

如果返回不表示任何问题,我们可以启动并启用 Nginx 流程,以便它在启动时自动启动:

1sudo systemctl start nginx
2sudo systemctl enable nginx

您现在应该能够访问您的服务器的域名或 IP 地址,并查看您的应用程序:

Flask sample app

结论

在本指南中,我们在Python虚拟环境中创建了一个简单的Flask应用程序。我们创建了一个WSGI入口点,以便任何具有WSGI能力的应用程序服务器都可以与其进行交互,然后配置了Gunicorn应用程序服务器以提供此功能。

Flask 是一个非常简单但非常灵活的框架,旨在为您的应用提供功能,而不会过于限制结构和设计。

Published At
Categories with 技术
comments powered by Disqus