项目部署:flask+gunicorn/uwsgi/mod_wsgi+nginx/apache

2024-02-08 11:48

本文主要是介绍项目部署:flask+gunicorn/uwsgi/mod_wsgi+nginx/apache,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

flask应用程序

#flask_test.py
import os
from urllib.request import urlretrieve
import logging
from logging.handlers import RotatingFileHandler
from flask import Flask, request, jsonify
import requests
import json
import timedef generate_log(log_dir):if not os.path.exists(log_dir):os.makedirs(log_dir)now_time = time.strftime('%Y-%m-%d-%H-%M-%S')formatter_base = '%(asctime)s: %(levelname)s %(message)s'logging.basicConfig(level=logging.DEBUG)formatter = logging.Formatter(formatter_base)Rthandler = RotatingFileHandler(filename='%s' % os.path.join(log_dir, now_time + '.log'), \maxBytes=50 * 1024 * 1024, backupCount=1)Rthandler.setLevel(logging.DEBUG)Rthandler.setFormatter(formatter)logging.getLogger('').addHandler(Rthandler)app = Flask(__name__)
generate_log('/mnt/disk2/xxx/work/test/log/')
@app.route('/Test', methods=['GET', 'POST'])def test():try:strs = request.values.get('strs')except Exception as e:return jsonify({'result': 'ERR', 'message' : 'hello %s faild: %s' % (strs, e)})return jsonify({'result': 'OK', 'message' : 'hello %s ' % strs})
if __name__ == '__main__':app.run(host='0.0.0.0', port='7000')

flask+gunicorn+nginx方式

  • 安装
# nginx
apt-get install nginx #安装
apt-get remove nginx #卸载
# uwsgi
pip3 install gunicorn --user #安装
pip3 uninstall gunicorn #卸载
  • 创建flask应用程序
  • 创建gunicorn配置文件
    在项目目录下创建gunicorn的配置文件config.py
# config.py
import os
import gevent.monkey
gevent.monkey.patch_all()import multiprocessingdebug = Truebind = '0.0.0.0:7000'
pidfile = 'log/gunicorn.pid'
accesslog = 'log/access.log'
errorlog = 'log/error.log'
capture_output = True
loglevel = 'warning'daemon = True #后台启动
reload = True#workers = multiprocessing.cpu_count()
workers = 1
worker_class = 'gevent'
x_forwarded_for_header = 'X-FORWARDED-FOR'
  • 启动gunicorn
# 添加配置文件后的启动方式
gunicorn -c config.py flask_test:app
  • 通过端口号查看程序是否启动
fuser -v -n tcp 端口号 #查看端口号
fuser -k 端口号/tcp  #关闭端口号
  • 测试gunicorn
    浏览器中输入http://10.27.1.20:7000/Test?strs=gunicorn-flask,如果返回{"message":"hello gunicorn-flask ","result":"OK"}则成功。

  • 创建nginx配置文件
    在/etc/nginx/sites-enabled/目录下创建nginx_gunicorn文件,并写入以下内容。

vim nginx_gunicorn #创建文件
server{listen 8002 default_server;listen [::]:8002 default_server;server_name 10.27.1.20;location / {proxy_pass http://127.0.0.1:7000;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
  • 启动nginx
cd /etc/sbin
./nginx -t #测试配置
./nginx #启动
./nginx -s reload #重新加载
./nginx -s stop #停止
  • 查看进程是否起来
fuser -v -n tcp 端口号 #查看端口号
fuser -k 端口号/tcp  #关闭端口号
  • 测试nginx
    浏览器中输入http://10.27.1.20:8002/Test?strs=nginx-gunicorn-flask,如果返回{"message":"hello nginx-gunicorn-flask ","result":"OK"}则成功。

flask+uwsgi+nginx方式

  • 安装
# nginx
apt-get install nginx #安装
apt-get remove nginx #卸载
# uwsgi
pip3 install uwsgi --user #安装
pip3 uninstall uwsgi #卸载
  • 创建flask应用程序
  • 创建uwsgi配置文件
    在项目目录下创建uwsgi的配置文件uwsgi.ini,跟flask的启动脚本放在同一目录下。
[uwsgi]
#使用nginx时需要该关键字
#socket = 0.0.0.0:7000
#不使用nginx是需要该关键字
http = 0.0.0.0:7000 
pythonpath = /mnt/disk2/xxx/work/xxx/
module = flask_test:app
#起用process manager,管理worker进程,worker进程都是这个master进程的子进程
master = true
# 进程
processes = 2
# 每个worker进程中创建两个线程
threads = 2
#不设置该关键字,请求超过4k就会报错
buffer-size = 65536
#使进程在后台运行,并将日志打到指定的日志文件或udp服务器
daemonize = ./log/uwsgi.log
#指定pid文件
pidfile = ./log/uwsgi.pid
#设置最大日志文件大小
log-maxsize = 50000000
#禁用请求日志记录
#disable-logging = true 
#只在开发时使用,监控项目的py文件的mtime来出发重载,py-autoreload表示多长时间检测一次,单位秒
python-autoreload = 1 
#在每个worker而不是master中加载应用,默认为false,表示先加载应用,再fork出worker,这样可以让work尽量共用内存,只有当写时才copy。
#由于先加载再fork,单有些东西是不支持fork的,比如socket连接,所以lazy-apps=false时,不要在加载应用时自动创建数据连接等
lazy-apps = true 
#为每个工作进程设置请求数的上限,当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启),可以使用这个选项俩默默对抗内存泄露。
max-requests = 5000
  • 启动uwsgi
    uwsgi.ini在项目目录下,所以在项目目录下运行下面的命令。
uwsgi --ini uwsgi.ini #启动
uwsgi -d --ini uwsgi.ini #后台启动
uwsgi --reload ./log/uwsgi.pid #重启
uwsgi --stop ./log/uwsgi.pid #停止
  • 通过端口号查看程序是否启动
fuser -v -n tcp 端口号 #查看端口号
fuser -k 端口号/tcp  #关闭端口号
  • 测试uwsgi
    在uwsgi.ini中配置http方式才可以用浏览器访问,sock方式不可以。
    浏览器中输入http://10.27.1.20:7000/Test?strs=uwsgi-flask,如果返回{"message":"hello uwsgi-flask ","result":"OK"}则成功。

  • 创建nginx配置文件
    在/etc/nginx/sites-enabled/目录下创建nginx_uwsgi文件,并写入以下内容。

vim nginx_uwsgi #创建文件
server{listen 8001 default_server;listen [::]:8001 default_server;server_name 10.27.1.20;location / {include uwsgi_params;uwsgi_pass 127.0.0.1:7000;}
}
  • 启动nginx
cd /etc/sbin
./nginx -t #测试配置
./nginx #启动
./nginx -s reload #重新加载
./nginx -s stop #停止
  • 查看进程是否起来
fuser -v -n tcp 端口号 #查看端口号
fuser -k 端口号/tcp  #关闭端口号
  • 测试nginx
    浏览器中输入http://10.27.1.20:8001/Test?strs=nginx-uwsgi-flask,如果返回{"message":"hello nginx-uwsgi-flask ","result":"OK"}则成功。

flask+mod_wsgi+apache方式

  • 安装
#apache2
apt-get install apache2
apt-get remove apache2
#mod_wsgi
apt-get install libapache2-mod-wsgi #python2
apt-get install libapache2-mod-wsgi-py3 #python3
  • 创建flask应用程序
  • 创建.wsgi配置文件
    在项目test目录下创建mod_wsgi.wsgi,因为test目录在非root用户下,需要用chmod 777 mod_wsgi.wsgi命令将mod_wsgi.wsgi文件改成可读可写模式,是root用户下,apache运行后能调用该文件。
#mod_wsgi.wsgi
#!/usr/bin/python3import sys
import os
import logging
import sitelogging.basicConfig(level=logging.DEBUG, stream=sys.stderr)
site.addsitedir('/home/xxx/.local/lib/python3.5/site-packages')
sys.path.insert(0, '/mnt/disk2/xxx/work/test')#logging.info(sys.path)#import torch
#logging.debug(torch.__version__)#def application(environ,start_response):
#    status='200 OK'
#    output=b'Hello wsgi!'
#    print(environ['wsgi.errors'], sys.path)
#    print (environ['wsgi.errors'], sys.prefix)
#    print (environ['wsgi.errors'], sys.executable)
#    response_headers=[('Content-type','text/plain'),
#                       ('Content-Length',str(len(output)))]
#    start_response(status,response_headers)
#    return[output]from test_hello import app as application
  • 创建apache2配置文件
    在/etc/apache2/sites-available/目录下创建flask_app.conf配置文件,在该文件中同样需要对mod_wsgi.wsgi文件、项目test目录、日志test/log目录设置可读写权限,并且还需要用命令chmod 777 xxx修改可读写权限。
#flask_app.conf
WSGIPythonHome /home/xxx/.local/lib/python3.5/site-packages
ServerName 10.27.1.20
Listen 7000
<VirtualHost *:7000>ServerAdmin webmaster@localhostWSGIDaemonProcess test python-path=/mnt/disk2/xxx/work/test:/home/xxx/.local/lib/python3.5/site-packages python-home=/home/xxx/.local/lib/python3.5/site-packages display-name=%{GROUP}WSGIScriptAlias / /mnt/disk2/xxx/work/test/mod_wsgi.wsgi process-group=test application-group=%{GLOBAL}<Directory /home/xxx/.local/lib/python3.5/site-packages/>Require all granted</Directory><Directory /mnt/disk2/xxx/work/test/>WSGIScriptReloading OnRequire all granted<Files mod_wsgi.wsgi>Require all granted</Files></Directory><Directory /mnt/disk2/xxx/work/test/log/>Require all granted</Directory>LogLevel debugErrorLog /mnt/disk2/xxx/work/test/log/apache_error.logCustomLog /mnt/disk2/xxx/work/test/log/apache_access.log combined
</VirtualHost>
  • 启动站点配置文件
    可在任意目录下启动
a2ensite flask_app.conf # 激活站点
a2dissite flask_app.conf # 屏蔽站点
  • 启动mod_wsgi
    可在任意目录下启动
a2enmod wsgi # 查看是否启动
a2dismod wsgi # 禁用
  • 启动apache服务
apache2ctl start # 启动
apache2ctl configtest #检测配置
apache2ctl restart # 重启
apache2ctl reload # 重新加载站点
apache2ctl stop # 关闭
  • 通过端口号查看服务是否运行
    关闭该端口网络站点和wsgi都会被关闭。
fuser -v -n tcp 7000 # 查看端口服务
fuser -k 7000/tcp #关闭端口,关闭该端口网络站点和wsgi都会被关闭
  • 测试
    浏览器中输入http://10.27.1.20:7000/Test?strs=apache-wsgi-flask,如果返回{"message":"hello apache-wsgi-flask ","result":"OK"}则成功。

参考资料
项目部署:flask+mod_wsgi+apache
项目部署:nginx+uwsgi+flask
深度学习多线程部署—学习笔记
Flask—学习笔记

这篇关于项目部署:flask+gunicorn/uwsgi/mod_wsgi+nginx/apache的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690936

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5