任务:php
视频翻译项目须要在两个服务器上进行通讯(国内&海外的阿里服务器)。html
由于python是主语言,选用了Django 来快速部署API。python
注:Django中文文档:https://docs.djangoproject.com/zh-hans/3.0/nginx
啰嗦:git
本地建立项目很轻松,但部署到服务器上困难重重。github
将过程记录下来,一来记录心得和经验,二来帮助后来者,少走弯路。web
PS:shell
MobaXterm安装使用详细说明:django
http://www.javashuo.com/article/p-sgbstrvj-ce.htmlsegmentfault
防止SSH断开链接:
https://blog.csdn.net/u014636245/article/details/83855860
重要提示:如下代码均没有加上sudo
,若是有哪里由于权限问题失败了,能够加上sudo再试一下。
更新一下系统(防止有的包找不到)
$ 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 ~
注意分清 : (当前用户家目录)和 / (系统根目录)的区别。
$ 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
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服务器
$ 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通了。
业务部分的包安装:(读者请跳过)
###------业务部分------ # 一、安装oss2 python3 -m pip install oss2 # 二、安装阿里云sdk python3 -m pip install aliyun-python-sdk-core-v3 # 三、安装youtube-dl python3 -m pip install youtube-dl # 四、安装依赖 python3 -m pip install six # 五、安装ffmpeg sudo apt-get install ffmpeg
若是你断开链接,那么服务也终止了,因此须要用配置ini文件来启动uwsgi,这样uwsgi能够后台贮存。
本地建立一个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拖拽进项目根路径下
目录结构:
### ------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
其次,查看阿里云安全组设置,是否开启相关的端口号。
由于公司把这个视频翻译的项目全权交给我,因此一切都是本身摸(踩)索(坑)。
从调研、选技术路径、MVP(最小单元试错)、测试对比分析结果、后端功能代码、部署,
甚至包括运维,一会儿学了不少,贼开心。
下面是此项目的心得:
一、参考文章的方法
跟着一个写的比较详细的 靠谱的博客做为主线,跟着一步步走,
遇到问题再去找别的教程或者去官网查,要多看,博采众长,毕竟博观才能约取。
二、进一步思考
每一个步骤的含义,每一个参数的含义,参数不设置成不成,会有哪些影响,
为何要用uwsgi,需不须要弄Nginx等等等等,都是提高能力的好机会。
三、耐心很重要
必定要有耐心,新接触一个东西,出各类问题很正常,要耐下心来逐一解决,多请教别人。
谢谢你们,祝各位部署顺利。
参考内容:
官方文档
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/
http://www.javashuo.com/article/p-educuzjx-gw.html
https://www.hongweipeng.com/index.php/archives/1814/
https://zhuanlan.zhihu.com/p/51012932
http://www.javashuo.com/article/p-kybrnntv-go.html
https://gaussic.github.io/2016/08/03/django-uwsgi-deploy/
http://www.javashuo.com/article/p-zvgxrelx-ep.html
https://www.jianshu.com/p/0e85cf58e677
https://zhuanlan.zhihu.com/p/29083368