当前位置: 首页 > news >正文

基于Flask+Apache+WSGI等模块配置Deep Learning应用功能网站(Ubuntu 22.04服务器)

首先预设你已经在本地搭建好了网站,只需要放到服务器上,然后配置Apache / Nginx等反向代理软件,即可用服务器ip地址/域名进行访问。

因为操作不规范/坑太多,而反反复复配了至少10遍。接下来的教程主要是总结规范流程,讲解遇到常见的bug如何解决。

注意: 在服务器上建议装python env的虚拟环境,不建议装conda的虚拟环境,因为如何在wsgi后缀名的文件里激活conda的虚拟环境,本人还没有找到正确的教程 😦。

接下来进入正题:

  1. 服务器上建deep learning应用功能所需的虚拟环境:
python3 -m venv pytorch_env

激活虚拟环境

source pytorch_env/bin/activate

按需求装自己环境需要的软件包,例如我的环境需要:

pip install Flask
pip install Werkzeug
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install transformers
  1. 在虚拟环境中装以下两个包, 如果可以直接装mod_wsgi, 则直接跳过mod_wsgi-httpd, 如果有报错,则需要先装第一个:
pip install mod_wsgi-httpd
pip install mod_wsgi

mod_wsgi主要是wsgi和apache的中间件(官网原话:The mod_wsgi package implements a simple to use Apache module which can host any Python web application which supports the Python WSGI specification)。

  1. 全局安装libapache2-mod-wsgi-py3模块
 sudo apt-get install libapache2-mod-wsgi-py3

mod_wsgi 适配器, 为应用提供接口:Python 3 WSGI adapter module for Apache.

  1. 相信Apache你已经提前下载好了,并已经按照官方教程配置好了,可以开始使用。我们下面主要是讲如何配置应用的,在网站原目录下建一个“app.wsgi”文件:
#!/usr/bin/python
import sys
import logging
import os
logging.basicConfig(stream=sys.stderr)
#插入网站的根目录
sys.path.insert(0,"/var/www/html/ddi-website")#激活虚拟环境
activate_this = "/var/www/html/ddi-website/pytorch_env/bin/activate_this.py"
with open(activate_this) as file_:exec(file_.read(), dict(__file__=activate_this))path = os.path.join(os.path.dirname(__file__), os.pardir)
if path not in sys.path:sys.path.append(path)from app import app as application

本人设置的路由是app, 所以建的是app.wsgi, 最后也是import app。大家根据自己建立的flask应用灵活调整。

  1. 现在python建的虚拟环境已经没有activate_this.py这个文件了,但是还有activate文件。我试着用可用activate激活,还是会在deactivate这行内部文件代码报错。于是在网上找到了activate_this.py的原始版本,并加在了“"/var/www/html/ddi-website/pytorch_env/bin/”目录下:
"""By using execfile(this_file, dict(__file__=this_file)) you will
activate this virtualenv environment.
This can be used when you must use an existing Python interpreter, not
the virtualenv bin/python
"""try:__file__
except NameError:raise AssertionError("You must run this like execfile('path/to/active_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import osbase = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):if item not in prev_sys_path:new_sys_path.append(item)sys.path.remove(item)
sys.path[:0] = new_sys_path

直接复制到activate_this.py里即可,不需要任何改动。

  1. 接下来添加"站点名字.conf"后缀文件,例如"ddi-website.conf"在目录/etc/apache2/sites-available/下:

```python```python
<VirtualHost *:80>ServerName 176.22.88.44ServerAdmin hahahah@qq.email.comWSGIDaemonProcess ptb-ddi-website python-path=/var/www/html/ddi-website/pytorch_env/lib/python3.10/site-packages user=www-data group=www-data threads=5 WSGIScriptAlias / /var/www/html/ddi-website/app.wsgi<Directory /var/www/html/ddi-website>WSGIProcessGroup ddi-websiteWSGIApplicationGroup %{GLOBAL}Order allow,denyAllow from all</Directory>Alias /static /var/www/html/ddi-website/static<Directory /var/www/html/ddi-website/static/>Order allow,denyAllow from all</Directory>ErrorLog /var/www/html/ddi-website/logs/error.logCustomLog /var/www/html/ddi-website/logs/access.log combined</VirtualHost>

然后需要在自己网站目录下新建一个logs文件夹,用来存储错误日志和访问日志。
保存好后,接着执行下面的命令。

  1. 启动站点和服务
sudo a2ensite ddi-website.conf 
sudo systemctl reload apache2
sudo a2enmod wsgi
sudo apachectl configtest
sudo apachectl restart

然后访问"http:服务器ip:端口80/ddi-website"即可大功告成!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux 安装 Docker Compose
  • 百度文心4.0 Turbo开放,领跑国内AI大模型赛道!
  • 【RNN练习】天气预测
  • C# Winform 系统方案目录的管理开发
  • Go语言map并发安全,互斥锁和读写锁谁更优?
  • 【区分vue2和vue3下的element UI Collapse 折叠面板组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • Linux上如何安装ffmpeg视频处理软件
  • ChatGPT对话:如何制作静态网页?
  • 数据结构4.0——串的定义和基本操作
  • ConditionalOnResource注解使用介绍、应用场景以及示例代码
  • element如何实现自定义表头?
  • 图论基础概念(详细讲解)
  • 保证 WebSocket 连接之前的身份验证过程的安全性
  • 《A++ 敏捷开发》- 10 二八原则
  • go语言处理特定格式的时间 例如打印出来2024-07-12 12:22:22 -2024-07-12 12:52:22
  • ----------
  • Android Studio:GIT提交项目到远程仓库
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • canvas 五子棋游戏
  • Rancher-k8s加速安装文档
  • Selenium实战教程系列(二)---元素定位
  • Spring声明式事务管理之一:五大属性分析
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 力扣(LeetCode)22
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 微信小程序填坑清单
  • 我是如何设计 Upload 上传组件的
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 因为阿里,他们成了“杭漂”
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​【已解决】npm install​卡主不动的情况
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • ###项目技术发展史
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (二)windows配置JDK环境
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (一)UDP基本编程步骤
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)fock函数详解
  • (转)母版页和相对路径
  • (转载)hibernate缓存
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net和jar包windows服务部署
  • .NET中使用Protobuffer 实现序列化和反序列化
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Autowired注解的实现原理
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?