O servidor Alibaba Cloud ECS implanta aplicativos da web, usa flask + uwsgi + nginx para implantar serviços

Aqui está um método de implantação de serviço da web que fornece serviços de interface. Implementação de implantação de aplicativo web com base em flask + uwsgi + nginx, a lógica de implementação é mostrada na figura a seguir: O
Insira a descrição da imagem aqui
projeto é implantado com base em dois servidores Alibaba Cloud ECS e a topologia física é a seguinte:
Insira a descrição da imagem aqui
Em seguida, o processo de implementação do projeto é introduzido em três aspectos.

1. Aplicativo Python baseado em Flask

Existem dois scripts run.py e main.py

run.py:

#!usr/bin/env python
# _*_ coding:utf-8 _*_
"""python
Created on 2020/8/19
@author: 
@theme:接口开发
"""
from main import app
if __name__ == "__main__":
    app.run()
    # app.run(host="0.0.0.0", port=8080, debug=True, threaded=True)  

main.py

#!usr/bin/env python
# _*_ coding:utf-8 _*_
# pylint: disable=no-member
"""python
Created on 2019/2/10
@author: 
@theme:接口开发
"""
import datetime
import time
import pandas as pd
from flask import Flask, jsonify, request
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
#from flask_redis import FlaskRedis
from utilities import log
from utilities.mysql_conn import get_conn
import config
import get_data_funs
import AES_funs

app = Flask(__name__)
#redis_client = FlaskRedis(app)
limiter = Limiter(
    app,
    key_func=get_remote_address,   # 根据访问者的IP记录访问次数
    default_limits=["10000 per day", "1000 per hour"], # 默认限制,一天最多访问1000次,一小时最多访问100次
    #storage_uri="redis://localhost:6379/0"  #需开启redis服务器
)

# 查询接口apikey账号所拥有的权限列表
@app.route('/queryStationID', methods=['POST'])
def get_station_id():
    sub_log = log.logger.getChild("get_station_id")
    # 获取用户的ip、访问客户端类型、访问url
    user_ip = request.remote_addr
    # user_agent = request.headers.get("User-Agent")
    visit_url = request.url
    proc_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 获取当前系统时间
    # 默认返回内容
    return_dict = {
    
    'return_code': 200, 'return_msg': 'success', 'proc_time': proc_time, 'station_id_list': ''}

    # 获取入参并判断入参是否填写
    params = request.get_json(force=True)  # 获取请求体body为raw的参数
    apikey = params['apikey']

    if (apikey): # 参数全部填写
        # 判断apikey的状态是否正常且是否过期失效
        sql_valid_apikey = "SELECT * from table WHERE status = 1 and DATEDIFF(invalid_time,NOW())>=0 " \
                           "and apikey='{}';".format(apikey)
        apikey_record = pd.read_sql(sql_valid_apikey, con=get_conn(config.username, config.password, config.hostname,
                                                                   config.port, config.database))

        if (apikey_record.empty is False):  # apikey 有效
            # 查询该apikey对应的station_id
            sql_valid_authority = "select * from table1 where status =1 and apikey='{}' " .format(apikey)
            authority_record = pd.read_sql(sql_valid_authority,
                                           con=get_conn(config.username, config.password, config.hostname,
                                                        config.port, config.database))
            if (authority_record.empty is False): #station_id  有效
                station_id = authority_record['station_id'].tolist()
                return_dict['station_id_list'] = station_id
                return jsonify(return_dict)       

Parte do conteúdo é deletada no script main.py, que envolve a privacidade do projeto, apenas um exemplo para ilustrar o desenvolvimento da interface do flask

2 ws uwsgi

Com base em um arquivo de configuração como uwsgi.ini, execute o serviço no servidor ECS 1 #.
Crie um novo texto uwsgi.ini no diretório onde o script python acima está localizado, o conteúdo do texto:

[uwsgi]

module = run:app    #要注意服务器默认python解释器能否执行run.py中的app  可指定python解释器

master = true

processes = 3

chdir = /home/restful

socket = %(chdir)/myproject.sock

socket = 192.168.23.22:5000     # 这里的ip必须是ECS1#服务器的内网地址

daemonize = %(chdir)/myapp_uwsgi.log

chmod-socket = 660

vacuum = true

stats = %(chdir)/uwsgi.status

pidfile = %(chdir)/uwsgi.pid

Os comandos relevantes do uwsgi são resumidos da seguinte forma:

# 启动uwsgi服务命令
uwsgi --ini uwsgin.ini

# 查看一下uwsgi的进程
ps aux | grep uwsgi

# 重启uwsgi服务命令
uwsgi --reload uwsgi.pid

# 显示进程和worker的状态
uwsgi --connect-and-read uwsgi/uwsgi.status

# 停止uwsgi服务命令
uwsgi --stop uwsgi.pid

3 、 nginx

Inicie o serviço nginx por meio do arquivo de configuração nginx.conf. O conteúdo do arquivo de configuração é o seguinte:

worker_processes 6;
events{
    
    worker_connections 6144;}
http{
    
    
    include /etc/nginx/mime.types;
    default_type application/octet_stream;
    server{
    
    
        listen 1543;
        access_log /home/project_nginx/logs/access.log combined;
        error_log /home/project_nginx/logs/error.log error;
        location / {
    
    
            include /etc/nginx/uwsgi_params;
            uwsgi_pass 102.24.12.12:5000;   //ECS1#服务器的外网ip
        }
    }
}

Os comandos relacionados usados ​​pelo nginx são os seguintes:

#nginx启动
nginx -c /home/project_nginx/nginx.conf

# nginx重载
nginx -s reload -c /home/project_nginx/nginx.conf

# nginx 停止
nginx -s stop

# 日志切割
0 0 * * * sh /home/project_nginx/nginx_log.sh

O conteúdo do script de corte de log nginx_log.sh é o seguinte:

#!/bin/bash
#设置日志文件存放目录

LOG_HOME="/home/project_nginx/logs/"
#备分文件名称
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".access.log
#重命名日志文件
mv ${
    
    LOG_HOME}/access.log ${
    
    LOG_HOME}/${
    
    LOG_PATH_BAK}.log
#向nginx主进程发信号重新打开日志
kill -USR1 `cat /run/nginx.pid`

resumo

Depois que esse projeto iniciar os serviços uwsgi e nginx, normalmente você pode chamar a interface por meio do ip da rede externa do servidor ECS 2 #, o número da porta de escuta 1543 e o endereço da rota de solicitação.
Os parâmetros no arquivo de configuração mencionado aqui podem ser ajustados. Os servidores Alibaba Cloud ECS são diferenciados por endereços de rede internos e externos, e atenção especial deve ser dada à parte do endereço IP do arquivo de configuração.

Acho que você gosta

Origin blog.csdn.net/qq_43314560/article/details/113041364
Recomendado
Clasificación