背景

任务:

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

  因为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项目【鸿篇巨制,事无巨细】的更多相关文章

  1. nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!

    前言:自己在windows上用PyCharm编写的Django项目,编写完后在windows上运行一点问题都没有,但是部署到服务器上时却Bug百出.百度,CSDN,sf,各种搜索寻求解决方案在历时3天 ...

  2. 使用uWSGI部署django项目

    先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...

  3. 使用Nginx+uWSGI部署Django项目

    1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...

  4. nginx + uwsgi 部署django项目

    因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...

  5. linux上使用nginx、uwsgi部署django项目

    参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...

  6. ubuntu服务器上用Nginx和Uwsgi部署django项目

    开发环境:ubuntu系统,python3环境 django项目目录: fast_foot 为项目根目录,app为项目应用 现在,我们登陆远程服务器 安装Nginx 安装好了,我们看一下nginx的配 ...

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

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

  8. Nginx + uWSGI 部署Django 项目,并实现负载均衡

    一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...

  9. nginx+uwsgi部署django项目

    1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...

随机推荐

  1. CISCN love_math和roarctf的easy_clac学习分析

    Love_math 题目源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ show ...

  2. pytorch LSTM情感分类全部代码

    先运行main.py进行文本序列化,再train.py模型训练 dataset.py from torch.utils.data import DataLoader,Dataset import to ...

  3. 【Linux常见命令】seq命令

    seq - print a sequence of numbers seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式.宽度.分割符号进行 ...

  4. UVA10599:Robots(II)(最长上升子序列)

    Your company provides robots that can be used to pick up litter from fields after sporting events an ...

  5. Angular 7开发环境配置

    目录 前言 一.搭建项目  1.安装Angular CLI  2.创建项目  3.集成Element Angular 二.设置路由  1.创建路由模块  2.导入.导出RouterModule类  3 ...

  6. 以内存级速度实现存储?XPoint正是我们的计划

    随着计算能力虚拟化技术的普及,存储机制在速度上远逊于内存这一劣势开始变得愈发凸显. 这一巨大的访问速度鸿沟一直是各项存储技术想要解决的核心难题:纸带.磁带.磁盘驱动器乃至闪存记忆体等等,而如今最新一代 ...

  7. qemu-img压缩磁盘操作

    2019独角兽企业重金招聘Python工程师标准>>> qemu-img convert -c -f qcow2 -O qcow2 /data/data1.disk /opt/dat ...

  8. resetlogs 打开数据库时新生成日志位置问题

    若系统中缺少联机日志,以resetlogs方式重建控制文件,那么当我们以alter database open resetlogs方式打开数据库时,新生成的联机日志会位于何处? 一:下面分别讨论几种情 ...

  9. Java_Web--JDBC 增加记录操作模板

    如果不能成功链接数据库,我的博客JAVA中有详细的介绍,可以看一下 import java.sql.Connection; import java.sql.DriverManager; import ...

  10. 2019-2020 ICPC, Asia Jakarta Regional Contest A. Copying Homework (思维)

    Danang and Darto are classmates. They are given homework to create a permutation of N integers from  ...