• 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日志。

  • 相关阅读:
    Oracle 数据库管理脚本 命名规范
    Oracle 插入大量数据
    9i Data Gurad 报ORA12154: TNS:could not resolve service name 错误
    Oracle OCM 认证指南
    Redo Log 和Checkpoint not complete
    自己录制的Oracle 相关视频(陆续更新)
    自己录制的Oracle 相关视频(陆续更新)
    Oracle Rman 命令详解(List report backup configure)
    linux下手动删除数据库实例
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
  • 原文地址:https://www.cnblogs.com/suzan/p/11927439.html
Copyright © 2020-2023  润新知