RockyLinux/AlmaLinux8上安装配置Flask和Gunicorn

本文介绍如何在RockyLinux8/AlmaLinux8系统上安装配置Flask和Gunicorn的方法。

操作步骤

步骤1、安装所需的软件包

我们将首先安装所需的软件包。其中一些软件包在需要启用的EPEL存储库中提供:

sudo dnf -y install epel-release

现在安装所需的包,包括Python包管理器(PIP)、编译器和Gunicorn所需的Python开发包:

sudo dnf install python3-pip python3-devel gcc -y

您还需要安装Nginx,它将用于代理:

sudo dnf install nginx -y

步骤2、创建Python环境

为了将此项目与系统上其他可用的Python项目隔离,需要虚拟Python环境。使用PIP安装virtualenv:

sudo pip3 install virtualenv

为Flask项目创建目录:

sudo su -

mkdir /myproject && cd /myproject

为Python需求创建虚拟环境:

virtualenv projectenv

此命令在projectenv目录中启动PIP和Python的副本。激活环境:

source projectenv/bin/activate

步骤3、配置Flask应用程序

一旦环境被激活,我们将使用Flask创建Python应用程序。首先安装Flask和Gunicorn,如下所示:

pip3 install gunicorn flask

继续使用Flask创建应用程序。作为Python模块存在的Flask可以很容易地导入并用于初始化web应用程序。

例如,在本文中,我们将创建一个应用程序,如下所示:

vim /myproject/hello.py

添加代码并将Flask作为模块导入。例如:

from flask import Flask

application = Flask(__name__)

@application.route("/")

def hello():

    return "<h1 style='color:green'>Hello World, Flask is amazing!</h1>"

if __name__ == "__main__":

    application.run(host='0.0.0.0')

这是一个简单的网页,当查询根域时将显示内容。允许端口5000通过防火墙:

sudo firewall-cmd --add-port=5000/tcp --permanent

sudo firewall-cmd --reload

通过发出以下命令测试应用程序:

$ python hello.py

 * Serving Flask app 'hello' (lazy loading)

 * Environment: production

   WARNING: This is a development server. Do not use it in a production deployment.

   Use a production WSGI server instead.

 * Debug mode: off

 * Running on all addresses.

   WARNING: This is a development server. Do not use it in a production deployment.

 * Running on http://192.168.205.2:5000/ (Press CTRL+C to quit)

在web服务器上,使用显示的端口,您应该能够看到:

RockyLinux/AlmaLinux8上安装配置Flask和Gunicorn

步骤4、配置Gunicorn

我们将创建一个WSGI入口点,指导Gunicorn如何与我们创建的应用程序交互。此文件将按如下方式创建:

vim /myproject/wsgi.py

我们只需导入Flask实例:

from hello import application

if __name__ == "__main__":

    application.run()

保存文件并验证Gunicorn是否能够为应用程序提供服务。允许端口8080通过防火墙:

sudo firewall-cmd --add-port=8080/tcp --permanent

sudo firewall-cmd --reload

我们将指定要使用的接口和端口。例如:

cd /myproject

gunicorn --bind 0.0.0.0:8080 wsgi

现在使用URL访问页面,地址格式是http://IP_Address:8080,如下图所示:

RockyLinux/AlmaLinux8上安装配置Flask和Gunicorn

我们已经验证了Gunicorn的功能。现在按CTRL+C并停用虚拟环境:

deactivate

步骤5、创建系统服务文件

为了能够在系统启动时自动启动Gunicorn并为Flask应用程序提供服务,我们需要创建一个systemd服务文件。

可以按如下所示创建服务文件:

sudo vim /etc/systemd/system/myapp.service

在文件中,定义以下行:

[Unit]

Description=The Gunicorn instance to serve Flask Project

After=network.target

[Service]

WorkingDirectory=/myproject

Environment="PATH=/myproject/projectenv/bin"

ExecStart=/myproject/projectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi

[Install]

WantedBy=multi-user.target

记住用步骤2中创建的项目的实际路径替换/myproject。Gunicorn将创建一个名为myproject.sock的Unix套接字,其umask值为007。保存文件并配置SELinux,以访问上面的路径:

chcon -R -t bin_t /myproject/projectenv/bin/

重新加载系统守护程序:

sudo systemctl daemon-reload

启动并使服务在启动时自动启动:

sudo systemctl start myapp

sudo systemctl enable myapp

验证服务是否正在运行:

$ systemctl status myapp

步骤6、配置Nginx代理

Nginx web服务器用于代理传递HTTP请求。我们还将为Gunicorn捕获额外的HTTP头,以获取有关客户端的一些信息。

由于Nginx已经安装,请为应用程序创建Virtualhost文件:

sudo vim /etc/nginx/conf.d/myapp.conf

在文件中,添加以下行:

server {

    listen 80;

    server_name myapp.example.com;

    location / {

        proxy_set_header Host $http_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-Proto $scheme;

        proxy_pass http://unix:/myproject/myproject.sock;

    }

}

请记住,在上述步骤中,用创建Unix套接字替换server_domain_or_IP和/myproject/myproject.sock。

保存文件并允许Nginx组在项目目录中执行命令:

sudo chgrp -R nginx /myproject/

现在检查Nginx配置的语法:

$ sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

启动并启用Nginx:

sudo systemctl start nginx

sudo systemctl enable nginx

配置SELinux以避免错误“连接到上游时Nginx权限被拒绝(Nginx Permission denied while connecting to upstream)”。这允许Nginx访问Gunicorn sock:

sudo dnf install policycoreutils-python-utils -y

sudo semanage permissive -a httpd_t 

允许端口80通过防火墙:

sudo firewall-cmd --add-port=80/tcp --permanent

sudo firewall-cmd --reload

使用URL访问应用程序,地址格式为http://domain_name,如下图所示:

RockyLinux/AlmaLinux8上安装配置Flask和Gunicorn

至此,凭以上内容,现在就可以用于创建使用Gunicorn和Nginx的Flask应用程序。更可贵的是,Flask是一个轻量级且功能强大的Python模块,可用于开发web应用程序,而不必担心结构和设计。

栏目相关文章