flask + nginx + uwsgi + ubuntu18.04部署python restful接口

@

参考链接

如果你从来没有弄过python restful api 请参考以下链接入门。

如何在Ubuntu 18.04上使用uWSGI和Nginx服务Flask应用程序
注意: 以上链接有一些坑,可能会踩到:

  1. 如何在.ini文件中指定项目中的wsgi的路径
  2. nginx配置好后无法访问项目,报权限问题或者连接被拒
    以上问题我都遇到过,而且也花了很长时间解决。我的教程里会指明如何解决以上问题,在使用的过程中,有任何问题,可以加群:821605718 或者加我个人qq:2768861003

效果展示

已一个简单的helloword为例
在这里插入图片描述

一、准备工作

  • linux 环境: ubuntu18.04
  • 准备一个可运行的python restful api

1.1 可运行的python demo:

在这里插入图片描述
app.py:

    #!/usr/bin/python
# -*- coding: UTF-8 -*-   
from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)


class HelloWorld(Resource):
    """
    api: /api/HelloWorld
    restful 接口调用测试
    """
    def get(self):
        print('Hello world of RESTful api!')
        return {'hello': 'world'}


api.add_resource(HelloWorld, '/api/HelloWorld')

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

wsgi.py:

#!/usr/bin/python
# -*- coding: UTF-8 -*-   
import sys
import os
FATHER_DIRECTORY = os.path.dirname(
    os.path.split(os.path.realpath(__file__))[0])
sys.path.append(FATHER_DIRECTORY)
from restfulServer.app import app

if __name__ == '__main__':
    app.run()

1.2 更新系统环境

sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

二、创建python虚拟环境

我们将建立一个虚拟环境,以将Flask应用程序与系统上的其他Python文件隔离

  1. 安装venv模块
    安装python3-vene软件包,此时会安装venv模块
sudo apt install python3-venv
  1. 创建目录:test,进入test,复制上面可运行的python demo到这里
mkdir ~/test
cd ~/test
cp -r ~/flaskTest ./.
  1. 创建虚拟环境
python3.6 -m venv testenv
  1. 激活虚拟环境
source testenv/bin/activate

此时您已处于虚拟环境中, 界面会展示为:

(testenv)user@host:~/test$

注意:: 在激活的虚拟环境里,一律使用:pip,而不是pip3

三、设置flask应用程序

以下操作都是在虚拟环境中的操作

pip install wheel
pip install uwsgi flask
  1. 启用防火墙,允许5000端口被访问。
    注意: 也要观察linux服务器的安全组允许5000端口可以被访问,才可以通过域名+端口访问。
sudo ufw allow 5000

测试访问:

cd ~/test/flaskTest/restfulServer
python app.py

注意: 如果有没有安装的包,请安装上,安装命令为:

pip install 包名字

执行后会看到以下输出:

Output
* Serving Flask app "test" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

访问:

http://your_server_ip:5000

你会看到以下内容
在这里插入图片描述

四、配置uWSGI

以上虽然可以运行,但是ctrl + c结束后就没有了,因此我们需要一个程序的入口点:wsgi.py,以便交互

  1. 测试uwsgi是否可以正常运行:
    我们可以通过简单地向其传递入口点的名称来实现。模块的名称(减去.py扩展名)加上应用程序中可调用名称的名称构成。我这里是wsgi:app。
cd ~/test/flaskTest/restfulServer
uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app

访问:

http://your_server_ip:5000

你会看到以下内容
在这里插入图片描述
2. 创建一个uWSGI配置文件

如果你想长期使用的话,请执行以下操作

nano ~/test/test.ini
[uwsgi]
chdir=/home/ubuntu/test
module = flaskTest.restfulServer.wsgi:app

master = true
processes = 5

socket = test.sock
chmod-socket = 664
vacuum = true

die-on-term = true                 

[uwsgi]: 知道以下配置属于uwsgi
chdir: 定义你的项目目录
module :.就类似linux里的/,我们将指定两件事: 模块本身(通过引用wsgi.py减去扩展名的文件)和文件中的可调用项app
master : 告诉uwsgi以master模式启动
processes :生成5个进程
socket : 生成Unix套接字,放在chdir指定的目录里。这里的socket文件将用于和nginx进行配合访问
chmod-socket: 更改socket文件的权限
vacuum :当进程停止时,使用这个关键字清理socket
die-on-term: 这可以帮助确保init系统和uWSGI对每个过程信号的含义具有相同的假设

五、设置系统启动

创建一个.service以/etc/systemd/system目录结尾的单元文件用来启动:

sudo nano /etc/systemd/system/test.service
[Unit]
Description=uWSGI instance to serve pythonRestfulApiServer
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/test
Environment="PATH=/home/ubuntu/test/testenv/bin"
ExecStart=/home/ubuntu/test/testenv/bin/uwsgi --ini /home/ubuntu/test/test.ini

[Install]
WantedBy=multi-user.target


到这里,我们的systemd服务文件就完成了,接下来启动uWSGI服务

sudo systemctl start test
sudo systemctl enable test

检查状态:

sudo systemctl status test

输出:

Output
● test.service - uWSGI instance to serve test
   Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-07-13 14:28:39 UTC; 46s ago
 Main PID: 30360 (uwsgi)
    Tasks: 6 (limit: 1153)
   CGroup: /system.slice/myproject.service
           ├─30360 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
           ├─30378 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
           ├─30379 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
           ├─30380 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
           ├─30381 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini
           └─30382 /home/ubuntu/test/testEnv/bin/uwsgi --ini myproject.ini

六、配置nginx代理

sudo nano /etc/nginx/sites-available/test
server {
  listen 80;
  server_name 94.191.19.28;

  location / {
    include uwsgi_params;
    uwsgi_pass unix:/home/ubuntu/test/test.sock;
  }
}

sudo ln -s /etc/nginx/sites-available/test /etc/nginx/sites-enabled
sudo nginx -t
sudo nginx -s reload

访问:
http://your_domain

如果遇到任何错误请检查:
sudo less /var/log/nginx/error.log:检查Nginx错误日志。

sudo less /var/log/nginx/access.log:检查Nginx访问日志。

sudo journalctl -u nginx:检查Nginx进程日志。

sudo journalctl -u myproject:检查Flask应用的uWSGI日志。

原文地址:https://www.cnblogs.com/suzan/p/11927439.html