项目部署: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

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w