背景

任务:

  视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器)。

  因为python是主语言,选用了Django 来快速部署API。

  注:Django中文文档:https://docs.djangoproject.com/zh-hans/3.0/

啰嗦:

  本地创建项目很轻松,但部署到服务器上困难重重。

  将过程记录下来,一来记录心得和经验,二来帮助后来者,少走弯路。

准备

  • 本地跑通的项目。
  • 一台服务器(阿里云、腾讯云、AWS、Vultr等等)
  • 连接Linux的ssh工具(MobaXterm或xshell 国内服务器都可以,国外建议xshell 更稳定)
  • 百折不挠的精神(非常重要!)

PS:

MobaXterm安装使用详细说明:

https://segmentfault.com/a/1190000000483148

防止SSH断开连接:

https://blog.csdn.net/u014636245/article/details/83855860

环境

  • Local

    • OS:  Windows 10 Pro (64bit)
    • Terminal:  xshell
    • Hosting service: 阿里云
  • Server
    • Ubuntu 18.04
    • root用户下

步骤

  1. Python3 & Pip的安装
  2. 创建Django项目(或者导入)
  3. 安装与配置uWSGI
  4. 安装与配置Nginx

重要提示:以下代码均没有加上sudo,如果有哪里因为权限问题失败了,可以加上sudo再试一下。

-----Python3 与 Pip 的安装-----

更新一下系统(防止有的包找不到)

$ apt-get update
$ apt-get upgrade

安装依赖库

$ apt-get install build-essential libtool
$ apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl

  

安装python3和pip3

$ apt-get install python3.7 
$ apt-get install python3-pip

----创建、启动虚拟环境-----

安装虚拟环境

python3 -m pip install virtualenv

  

创建存放虚拟环境和项目的文件夹 

确保当前目录是root目录

cd ~  

注意分清 : (当前用户家目录) ~ 和 / (系统根目录)的区别。

简单说,cd ~就是各回各家,各找各妈;而/是党,是我们所有人的妈。

$ mkdir -p /root/www/project/env
$ mkdir -p /root/www/project/【ytb_api】

注: -p 递归创建目录,即使上级目录不存在,会按目录层级自动创建目录

【ytb_api】修改为你的项目名

创建虚拟环境 

# virtualenv -p [python3路径] [项目路径]
$ cd /root/www/project/env
$ virtualenv -p /usr/bin/python3 ENV

注:如果不知道python3路径,可以用 which python3

如果不了解虚拟环境的使用,看这两篇文章就够了:

http://kuanghy.github.io/2015/12/04/virtualenv

https://docs.python.org/zh-cn/3/tutorial/venv.html

启动虚拟环境

$ source /root/www/project/env/ENV/bin/activate

命令行的最前面出现(ENV)即代表处于虚拟环境下。

注:

source: 执行文件并从文件中加载变量及函数到执行环境。

-----安装Django 并导入项目-----

安装Django

python3 -m pip install django

注意此处pip前 要加python3 -m 的原因:

直接pip会安装到python2上,需要通过pip去指定安装到Python3.x下

详见文章:https://blog.csdn.net/Cloudox_/article/details/78616378

测试Django项目是否正常

将本地项目文件夹拖拽进www/project/ 目录下。

runserver 运行一下,看看程序是否正常

$ python3 manage.py runserver

有如下显示,说明没问题

Django version 2.2, using settings 'firstpage.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

-----Uwsgi 安装和配置-----

安装uWSGI服务器

$ python3 -m pip install uwsgi

开启阿里云安全组和防火墙

# 防火墙部分,开启8000端口访问权限
sudo ufw status
sudo ufw allow 8000

阿里云用户需要在控制台打开入方向的8000端口权限。

测试 uwsgi监听端口是否成功 

在项目根目录下,创建一个test.py文件,内容如下

def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]

运行uWSGI,确保当前工作目录在你创建并安装uwsgi的虚拟环境下:

$ uwsgi --http :8000 --wsgi-file test.py

特别注意:阿里云用户需要提前打开入方向的8000端口权限。
如果默认80端口开,可以将下面的8000端口,改成80端口测试

在地址栏中输入 你的域名:端口号,网页上显示Hello World则表示uWSGI成功运行

同时代表了以下通讯是正常进行的

web client < -- > uWSGI < -- > Python App

  

将Django项目指定给uWSGI

$ uwsgi --http :8000 --wsgi-file /www/project/ytb_api/ytb_api/wsgi.py

如果此处卡住了,看后面的常见问题

外网浏览器访问端口,如果显示出小火箭,说明uWSGI<-->Django通了。

业务部分的包安装:(读者请跳过)

###------业务部分------
# 1、安装oss2
python3 -m pip install oss2 # 2、安装阿里云sdk
python3 -m pip install aliyun-python-sdk-core-v3 # 3、安装youtube-dl
python3 -m pip install youtube-dl # 4、安装依赖
python3 -m pip install six # 5、安装ffmpeg
sudo apt-get install ffmpeg

如果你断开连接,那么服务也终止了,所以需要用配置ini文件来启动uwsgi,这样uwsgi可以后台贮存。

创建uWSGI ini配置文件

本地创建一个uwsgi.ini文件

内容如下(请一定珍惜,因为参考了很多,摸索了很多,踩坑了很多,总结出来的一份配置):

[uwsgi]
### Django-related settings # socket = :8000 # 如果需要配置nginx,则需要此项
http = :8000 # the base directory (full path)
# 项目路径,项目的根目录
chdir = /root/www/project/local_api # Django's wsgi file
# 配置项目路径,项目的所在目录
module = local_api.wsgi # the virtualenv (full path)
# 虚拟环境。注意这里不是env,而是home
home = /root/www/project/env/ENV ### process-related settings # maximum number of worker processes
# 最大进程个数
# 同时启动uwsgi进程的个数,这个进程与nginx中的workers是不一样的,
# uwsgi中的每个进程每次只能处理一个请求(进程越多可以同时处理的请求越多),
# nginx采用的异步非阻塞的方式来处理请求的,每个进程可以接受处理多个请求。
processes = 10
# 每个进程的线程数
threads = 4 # 启动一个主进程来管理其他进程,processes的进程都是这个master进程的子进程,如果kill这个master进程,相当于杀死所有的uwsgi进程
master = true # 允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
enable-threads=true # clear environment on exit
#当服务器退出的时候自动删除unix socket文件status和pid文件
vacuum = true # 设置日志目录
daemonize = /root/www/project/local_api/uwsgi.log # 设置最大日志文件大小
log-maxsize = 5000000 # 设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
buffer-size = 32768 # 为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏
max-requests = 5000 # 通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
# limit-as = 256 # 一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
http-timeout = 500
harakiri = 500 # uwsgi.pid文件用来重启和停止uwsgi服务
pidfile = %(chdir)/uwsgi/uwsgi.pid

在项目根路径下,新建个uwsgi文件夹(用于存放uwsgi服务的pid文件)

将刚才本地创建的uwsgi.ini拖拽进项目根路径下

目录结构:

文件启动和终止uwsgi

### ------ini运行uwsgi------
# 启动
uwsgi --ini uwsgi.ini # 停止
uwsgi --stop uwsgi/uwsgi.pid

运行成功有此提示:

启动成功会有个uwsgi.log文件,是记录请求的文件。

好了,如果顺利走到这,那么恭喜你。

关于不用Nginx:

由于我只是国内国外各部署一个API用以接收请求,然后之间相互通信,不涉及静态页面,

而且uwsgi服务器性能目前业务就可以满足,所以不上Nginx,但是以后业务量上来了,

Nginx的负载均衡和大并发的异步非阻塞的处理请求,就可能需要了。

如果需要,以后再弄。

常见问题:

(1) 未在Django中未设置设置被允许的域名

DisallowedHost at /
Invalid HTTP_HOST header: ..... You may need to add "你的域名" to ALLOWED_HOSTS  

需要在settings.py中设置被允许的域名字

ALLOWED_HOSTS = ['XXX.XXX.XXX.XXX']

(2) 没有报错,远程就是无法访问

解决方法:
查看防火墙状态

sudo ufw status

开启对应的端口号,如8000端口

sudo ufw allow 8080

其次,查看阿里云安全组设置,是否开启相关的端口号。

小结

  因为公司把这个视频翻译的项目全权交给我,所以一切都是自己摸(踩)索(坑)。

  从调研、选技术路径、测试对比分析、后端功能代码、部署,

  甚至包括运维,一下子学了很多,贼开心。

  下面是此项目的心得:

  1、参考文章的方法

  跟着一个写的比较详细的 靠谱的博客作为主线,跟着一步步走,

  遇到问题再去找别的教程或者去官网查,要多看,博采众长,毕竟博观才能约取。

  2、进一步思考

  每个步骤的含义,每个参数的含义,参数不设置成不成,会有哪些影响,

  为什么要用uwsgi,需不需要弄Nginx等等等等,都是提升能力的好机会。

  3、耐心很重要

  一定要有耐心,新接触一个东西,出各种问题很正常,要耐下心来逐一解决,实在弄不出就请教别人。

  

  谢谢大家,祝各位部署顺利。

参考内容:

官方文档

uwsgi:

https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html

https://docs.djangoproject.com/zh-hans/3.0/howto/deployment/wsgi/uwsgi/

https://uwsgi-docs.readthedocs.io/en/latest/Options.html

Django:

https://docs.djangoproject.com/zh-hans/3.0/

文章:

https://blog.csdn.net/Lo_Bamboo/article/details/80141880

https://www.chuangzhidou.com/2019/04/02/django-deploy/

https://segmentfault.com/a/1190000014361352

https://www.hongweipeng.com/index.php/archives/1814/

https://blog.csdn.net/zhf0425/article/details/102662417?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

https://zhuanlan.zhihu.com/p/51012932

https://www.cnblogs.com/fnng/p/5268633.html

https://gaussic.github.io/2016/08/03/django-uwsgi-deploy/

https://www.cnblogs.com/zhuminghui/p/9212998.html

https://www.jianshu.com/p/0e85cf58e677

https://zhuanlan.zhihu.com/p/29083368

https://blog.csdn.net/Miss_Audrey/article/details/81874038

https://www.runoob.com/django/django-nginx-uwsgi.html

Ubuntu+uWSGI部署基于Django的API【鸿篇巨制,事无巨细】的更多相关文章

  1. 项目部署(ubuntu+uwsgi+nginx+supervisor+django)

    一.在开发机上的准备工作 1. 确认项目没有bug. 2.设置`ALLOW_HOST`为你的域名,以及ip地址. 4.设置`DEBUG=False`,避免如果你的网站产生错误,而将错误信息暴漏给用户. ...

  2. 在IIS上部署基于django WEB框架的python网站应用

    django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...

  3. Ubuntu+uWSGI部署Django项目【鸿篇巨制,事无巨细】

    背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...

  4. python基于django编写api+前端后端分离

    有用 https://segmentfault.com/a/1190000016049962#articleHeader2 python的前后端分离(一):django+原生js实现get请求 htt ...

  5. 基于 ArcGIS Silverlight API开发的WebGIS应用程序的部署

    部署流程概述 在微软的iis服务器上部署基于ArcGIS  Silverlight API的应用程序,主要包括以下几个步骤: 1)(可选)部署GIS服务 如果需要将GIS服务也部署在Web服务器上,则 ...

  6. 基于Nginx和uWSGI在Ubuntu上部署Django项目

    前言: 对于做Django web项目的童鞋,重要性不言而喻. 参考:https://www.cnblogs.com/alwaysInMe/p/9096565.html https://blog.cs ...

  7. 跨过Nginx上基于uWSGI部署Django项目的坑

    先说说他们的关系,Nginx和uWSGI都是Web服务器,Nginx负责静态内容,uWSGI负责Python这样的动态内容,二者配合共同提供Web服务以实现提高效率和负载均衡等目的.uWSGI实现了多 ...

  8. ubuntu+nginx+uwsgi部署django web项目

    前言 将本地开发的django项目部署至linux上的uwsgi服务器,并配置nginx,完成基于ubuntu+nginx+uwsgi的上线运行.下面整理相关步骤. 服务器配置virtualenv 如 ...

  9. 基于nginx和uWSGI在Ubuntu上部署Djan

    http://www.jianshu.com/p/e6ff4a28ab5a 文/Gevin(简书作者)原文链接:http://www.jianshu.com/p/e6ff4a28ab5a著作权归作者所 ...

  10. 基于腾讯云CentOS7.4+MySQL5.7+Python3+uwsgi+nginx的Django项目部署

    准备知识 1.django一个基于python的开源web框架,请确保自己熟悉它的框架目录结构. 2.uWSGI一个基于自有的uwsgi协议.wsgi协议和http服务协议的web网关 3.nginx ...

随机推荐

  1. 解决linux时间转换为yyyy-MM-dd

    linux时间显示为:Tue Nov 30 09:33:04 CST 2021 SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd ...

  2. 后台http请求

    HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear(); resp ...

  3. 为什么你需要升级 pip

    更新软件版本可以修复bug,增加新功能和提升性能.例如,NumPy 1.20 添加了类型注释,并在可能的情况下通过使用SIMD来提高性能.如果您要安装NumPy,则可能要安装最新版本. 相反,如果您使 ...

  4. springboot pom文件引入本地jar包

    记录maven引用本地jar包 配置 及打包的其中一个方法,作为个人笔记,供参考: <dependency> <groupId>gdin</groupId> < ...

  5. 小梅哥课程学习——串口发送应用之发送数据(可在vivado中仿真出现正确波形)

    //1.底层代码源代码发送10位数据 module uart_pr( clk, reset_n, send_go, data, baud_set, tx_done, uart_tx ); input ...

  6. 如何找到并使用makecert.exe

    如果安装visual studio 后,visual studio command  仍然无法识别 makecert.exe 命令. 则需要手动安装 Windows Software Developm ...

  7. css3样式pointer-events,点击穿透和海市蜃楼的效果

    css样式pointer-events pointer-events 是CSS3的一个属性,支持的值非常多,其中大部分都是和SVG有关.目前只了解 none 这个值, 其他值后续要补上. pointe ...

  8. redis缓存lua脚本过多导致内存占用很多问题

    现象 生产某集群各节点已使用内存比较大,在清理了大量业务无用数据后,节点已使用内存却未下降. 排查与分析 通过info memory命令查看,内存碎片率略高,但是对某个主节点新添加的从节点内存使用依然 ...

  9. dosbox debugger

    通过中断看程序运行过程 最终目的是要找到数据保存位置,如何保存到文件的.

  10. Istio思考往前一小步~系列一

    思考起源于现实应用需求,随着微服务理念普及,基础设施从单机到容器到Kubernetes,体验过集群的各种好处之后,我们还缺少什么?为什么还要在kubernetes的基础上部署Istio?个人认为Ist ...