背景

任务:

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

  因为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. Zabbix 监控服务介绍

    Zabbix 监控服务介绍 目录 Zabbix 监控服务介绍 一.Zabbix 监控服务介绍 1.1.1 Zabbix 监控服务介绍 1.1.2 如何去做监控 1.13 硬件监控 1.1.4 系统监控 ...

  2. PHP Redis 基本命令

    连接到 redis 服务 //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379);//查看服务是否运行 ...

  3. 开始 go

    为什么开始想转 go ? 毕业三年多,一直从事的是 Java , 大学学的也是 Java ,本来想一直干下去的,可是似乎 Java 水涨船高,面试要求也越来越高. 曾经一起毕业的同事自学 go ,已经 ...

  4. 内存模型和名称空间复习题(c++ prime plus )

    第一题 注意到setgolf()被重载,可以这样使用其第一个版本: golf ann; setgolf(ann, "Ann Birdfree", 24); 上述函数调用提供了存储在 ...

  5. 爱心代码_HTML

    直接上效果 <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  6. jupyter nbconvert --to FORMAT xxx

    $ jupyter nbconvert --to FORMAT notebook.ipynb This will convert the Jupyter notebook file notebook. ...

  7. OSIDP-多处理器和实时调度-10

    多处理器调度 多处理器系统分类: 1.松耦合.分布式多处理器(集群):一系列相对自治的系统组成,每个处理器有属于自己的内存和I/O通道. 2.专用处理器:有一个通用的主处理器,专用处理器由主处理器控制 ...

  8. swftools工具将pdf文件转换为swf文件 文字丢失

    开发客户网站时遇到了一个需求,客户要求后台上传pdf文件,前台能以翻书的形式直接访问. 首先想到的是使用js解决,用户访问前端页面时,php将文件路径发送给js,让js呈现出来翻书的效果.在网上百度了 ...

  9. 估计人数【最小路径重复点覆盖】【直接在(i,j)建一个新点】

    估计人数 题意 思路 用最少的人,走完这几条线.最小重复路径点覆盖问题 建图之后,跑一下二分图. 考虑建图:图中'1'连着完下.或者右走.我们把图中所有的1编号,然后建图,然后floly,然后匈牙利. ...

  10. Python MySQLdb连接被多线程共享引发的内核segfault段错误

    Python celery Worker exited prematurely: signal 11 (SIGSEGV) --一种解决方案 Python libmysqlclient segfault ...