在Raspberry Pi上的NGINX下运行Flask

8

本教程说明了如何使用NGINX Web服务器运行Flask应用程序。 Flask是Python的微框架,可让您在Raspberry Pi上创建基于Web的应用程序。它包括自己的Web服务器,但是开发人员建议您在更成熟的Web服务器(例如NGINX或Apache)下运行。这使Flask应用程序更强大,因为它可以处理更多的传入流量。

我强烈建议您使用提供的示例在全新的SD映像上运行本教程。一旦可行,您可以考虑使用该技术来升级自己的Flask应用程序。您将需要注意目录和文件名,以及对各种配置文件中那些位置的引用。

步骤1:建立新的SD卡

要开始使用官方Raspbian映像创建新的SD卡。我曾经用过Etcher和Raspbian Lite图像’不需要图形界面。卡准备好后,我将一个预先准备的wpa_supplicant.conf和一个空白的ssh文件添加到了启动分区。这使Pi Zero可以在启用SSH的情况下连接到我的WiFi,而无需将其他任何东西都连接到Pi上(除了电源)。

作为参考,您可能需要查看以下指南:

第2步:打开电源并更新Pi

将SD卡插入Pi并打开电源。使用键盘和连接的显示器,或通过SSH从另一台计算机连接。

如果你没有’t already 修改密码 从默认值开始。

使用以下命令更新软件包列表:

sudo apt-get update

现在,您应该具有可操作的Pi,并准备安装所需的软件。

步骤3:安装所需的软件

使用以下命令安装NGINX,pip3和uWSGI:

须藤apt-get install nginx
sudo apt-get install 蟒蛇3-pip
sudo pip3 install flask 乌斯吉

在安装过程中,您可能必须按Y / N提示符下的Y。

步骤4:建立Flask应用程式

使用以下命令确保您位于/ home / pi目录中:

cd ~

首先创建一个名为Flask的文件夹,以创建示例Flask应用“flasktest” :

mkdir 烧瓶测试

并将其组所有者设置为“www-data” :

sudo chown www数据 /home/pi/flasktest

导航到目录:

cd 烧瓶测试

然后直接下载 我的例子Flask App 使用:

sudo wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/flask/testSite1.py

请注意,此测试应用具有文件名“testSite1.py”.

步骤5:测试NGINX URL

使用以下命令查找您的Pi的IP地址:

ifconfig

我将使用示例“192.168.1.99”但是您应该使用Pi在ifconfig下显示的IP地址(对于有线连接使用eth0,对于无线连接使用wlan0)。

在您的PC(或其他配备浏览器的设备)上访问您的Pi’s IP address :

http://192.168.1.99

这应该显示默认的NGINX欢迎页面:

NGINX默认站点

Now test that 乌斯吉 is working properly using :

乌斯吉 --socket 0.0.0.0:8000 --protocol=http -w testSite1:app

这应该允许您访问与以前相同的IP地址,但是要访问8000端口:

http://192.168.1.99:8000

这应该显示Flask应用’s default page :

在Flask下运行的测试站点

回到终端,您可以使用CTRL-C返回到命令提示符。主要网址仍会显示NGINX默认页面,但是因为uwsgi不是’t现在运行,Flask应用将不再在端口8000上可用。

步骤6:创建uWSGI初始化文件

为了给uWSGI提供一些附加设置,现在创建一个初始化文件:

sudo nano 乌斯吉.ini

使用以下命令启动文件:

[uwsgi]

然后在下面添加以下内容:

chdir = /home/pi/flasktest
module = testSite1:app

master = true
processes = 1
threads = 2

uid = www数据
gid = www数据

socket = /tmp/flasktest.sock
chmod-socket = 664
vacuum = true

die-on-term = true

请注意,它包含对项目目录(/ home / pi / 烧瓶测试)和Flask 蟒蛇文件的引用“testSite1.py”. The “flasktest.sock” file doesn’t目前不存在,但是会在uWSGI需要时自动创建。

使用CTRL-X,Y和ENTER保存并退出Nano编辑器。

步骤7:测试uWSGI初始化文件

运行以下命令以使用初始化文件启动uwsgi:

乌斯吉 --ini 乌斯吉.ini

然后使用第二个SSH连接,通过使用以下命令检查是否已在tmp目录中创建了套接字文件:

ls /tmp

你应该看到“flasktest.sock”列为文件。该文件仅在uWSGI运行时存在。

此时,uWSGI还没有’t使用标准端口号,因此浏览器中只有NGINX页面可用。

使用CTRL-C停止运行uWSGI。

步骤8:配置NGINX以使用uWSGI

现在可以将NGINX配置为将流量传递给uWGI。这叫做“reverse proxy”.

删除默认站点:

sudo rm /etc/nginx/sites-enabled/default

现在创建一个名为“flasktest_proxy” :

sudo nano /etc/nginx/sites-available/flasktest_proxy

将此插入文件:

server {
listen 80;
server_name localhost;

location / { try_files $uri @app; }
location @app {
include 乌斯吉_params;
uwsgi_pass unix:/tmp/flasktest.sock;
}
}

使用CTRL-X,Y和ENTER保存并退出Nano编辑器。

最后,从该文件创建指向“sites-enabled” directory using :

sudo ln -s /etc/nginx/sites-available/flasktest_proxy /etc/nginx/sites-enabled

步骤9:重新启动NGINX

使用以下命令重新启动NGINX:

sudo systemctl restart nginx

如果您在浏览器中访问IP地址,则应该获得一个“502 Bad Gateway”错误。这是可以预期的,因为uWSGI不是’当前正在运行,并且NGINX尝试将浏览器请求传递给它。

Step 10 : Run 乌斯吉 When Pi Boots

每当Pi重启时,uWSGI需要启动。为此,我们可以使用systemd服务。

导航到系统目录:

cd /etc/systemd/system

为uWSGI创建一个单位文件:

sudo nano 乌斯吉.service

然后插入:

[Unit]
Description=uWSGI Service
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/home/pi/flasktest/
ExecStart = / usr / local / bin / 乌斯吉--ini /home/pi/flasktest/uwsgi.ini

[Install]
WantedBy=multi-user.target

使用CTRL-X,Y和ENTER保存并退出Nano编辑器。

重新启动守护程序,以便它拾取这个新单元:

sudo systemctl daemon-reload

现在启动服务:

sudo systemctl start 乌斯吉.service

最后检查服务状态:

sudo systemctl status 乌斯吉.service

希望您应该看到如下所示的内容:

uWSGI系统服务状态

重要的一点是显示的行“active (running)”。这表明我们的服务很愉快。按CTRL-C返回命令提示符。

要使其在每次重新启动时运行,请使用以下命令:

sudo systemctl enable 乌斯吉.service

它应该以

“创建的符号链接/etc/systemd/system/multi-user.target.wants/uwsgi.service /etc/systemd/system/uwsgi.service”

我们的配置完成。

步骤11:重新启动并测试

最后,我们可以使用以下命令重新启动Raspberry Pi:

sudo reboot

给Pi一个启动的机会。

在您的PC上访问Pi’像以前一样的IP地址。

现在,您应该看到浏览器中显示的Flask应用程序页面。

恭喜你’现在,有了NGINX提供的Flask应用程序。

第12步:触摸重新加载(可选)

在当前设置下,“testSite1.py” file won’即使刷新浏览器也不会显示。他们将要求重新启动uWSGI服务。

您可以通过添加以下内容来使uWSGI将更改自动加载到此文件:“touch-reload”uwsgi.ini文件的指令。

使用以下命令编辑文件:

sudo nano 乌斯吉.ini

将指令放在新行上:

触摸重载 = /home/pi/flasktest/testSite1.py

使用CTRL-X,Y和ENTER保存并退出Nano编辑器。

重新启动树莓派以获取新设置:

sudo reboot

树莓派启动后,刷新页面后,对testSite1.py文件的任何更改都将显示在浏览器中。


学分

感谢Pradeep Singh的文章 具有NGINX和uWSGI的Raspberry Pi上的Python Flask Web应用程序 这对我很有帮助。

感谢Ben Croston(@CrostonBen)在我为整个过程解决了一些问题的同时,帮助我保持了理智。

分享。

8条留言

  1. 简短的说明:在步骤6中创建的uwsgi.ini文件出现错误。我需要在[uwsgi]和chdir之间插入换行符才能正常工作。否则我会得到这个错误:
    警告:可以’t find section “uwsgi” in INI configuration file 乌斯吉.ini

    • 嗯,此页面上的格式不会保持换行!一世 ’ve重新设置了该部分的样式,以使其更清楚,[uwsgi]之后应有换行符。

  2. 峡谷布赖森

    在步骤10中,当检查我的服务器是否处于活动状态时,它说’不是因为它找不到文件usr / local / bin / 乌斯吉。有人知道为什么吗?

  3. 到目前为止,我发现的最简单的教程。我建议的唯一改进是关于如何为这些类型的应用程序激活虚拟环境的部分,而不是将安装库依赖于基本python。

  4. 安德烈亚斯

    是的,爱丹是对的!这个描述很好用,但是我不能’使其在虚拟环境中工作。加上这个会很棒!

    • 我认为venv和本教程存在的问题是,这里我们在系统级别安装uwsgi。要与venv一起使用,我们应该在venv中安装uwsgi。

      通过将步骤3更改为以下内容,我能够获得这个(出色的)教程以使用venv:
      须藤apt-get install nginx
      //在您的flask应用程序所在的文件夹中安装virtualenv
      蟒蛇 -m venv myvenv //假设您拥有python3 +
      源路径/ to / myvenv / bin / activate //激活虚拟环境
      pip install flask 乌斯吉 …项目需要的其他软件包

      Then in your 乌斯吉.ini file add the following line:
      virtualenv = /完整路径/到/文件夹/ myvenv
      在uwsgi.service文件中,修改ExecStart =行以指向venv中的uwsgi文件:
      ExecStart = / usr / local / bin / 乌斯吉–ini /home/pi/flasktest/uwsgi.ini更改为
      ExecStart = /路径/到/ myvenv / bin / uwsgi–ini /home/pi/flasktest/uwsgi.ini

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.