Ubuntu+uWSGI部署Django项目【鸿篇巨制,事无巨细】
背景
任务:
视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器)。
因为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用户下
步骤
- Python3 & Pip的安装
- 创建Django项目(或者导入)
- 安装与配置uWSGI
- 安装与配置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://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项目【鸿篇巨制,事无巨细】的更多相关文章
- nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!
前言:自己在windows上用PyCharm编写的Django项目,编写完后在windows上运行一点问题都没有,但是部署到服务器上时却Bug百出.百度,CSDN,sf,各种搜索寻求解决方案在历时3天 ...
- 使用uWSGI部署django项目
先说说什么是uWSGI吧,他是实现了WSGI协议.uwsgi.http等协议的一个web服务器,那什么是WSGI呢? WSGI是一种Web服务器网关接口.它是一个Web服务器(如nginx)与应用服务 ...
- 使用Nginx+uWSGI部署Django项目
1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...
- nginx + uwsgi 部署django项目
因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...
- linux上使用nginx、uwsgi部署django项目
参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...
- ubuntu服务器上用Nginx和Uwsgi部署django项目
开发环境:ubuntu系统,python3环境 django项目目录: fast_foot 为项目根目录,app为项目应用 现在,我们登陆远程服务器 安装Nginx 安装好了,我们看一下nginx的配 ...
- 基于Nginx和uWSGI在Ubuntu上部署Django项目
前言: 对于做Django web项目的童鞋,重要性不言而喻. 参考:https://www.cnblogs.com/alwaysInMe/p/9096565.html https://blog.cs ...
- Nginx + uWSGI 部署Django 项目,并实现负载均衡
一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...
- nginx+uwsgi部署django项目
1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...
随机推荐
- 人体和电脑的关系——鸟哥的LINUX私房菜基础学习篇读书笔记
CUP=脑袋: 每个人会做的事情都不一样(指令集的差异),但主要都是通过脑袋来判断与控制身体各部分的行动 内存=脑袋中存放正在思考的数据区块: 在实际活动过程中,我们的脑袋需要有外界刺激的数据(例如光 ...
- ASP.NET Core Razor Pages 初探
最近新建 Asp.net Core MVC 项目的时候不小心选错了个模板,发现了一种新的项目模板.它使用cshtml视图模板,但是没有Controller文件夹.后来才发现这是ASP.NET Core ...
- js 异或加密
// 按位异或 加密 var posNo = 'C0041710190002' // 特殊字符不进行 与或 加密 (因为A,a,Z,z,转换后会变成符号,不方面用户输入 ...
- js的属性监听
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- css之单位
css之单位 角度<angle> 用于<gradient>s和某些transform功能中 deg表示以度为单位的角度.一整圈就是360deg. 例如:0deg,90deg,1 ...
- 怎样实现App安装来源追踪
众所周知,国内的应用商店存在一定的限制,开发者很难有效监测到App安装来源的精准数据.但在实际推广中,广告效果.用户行为.付费统计.邀请关系等不同渠道的指标却是衡量渠道价值的关键,对App的运营推广和 ...
- 《例说51单片机(C语言版)(第3版)》——1-3 认识MCS-51的存储器结构
本节书摘来异步社区<例说51单片机(C语言版)(第3版)>一书中的第1章,第1.3节,作者:张义和,王敏男,许宏昌,余春长,更多章节内容可以访问云栖社区"异步社区"公众 ...
- vue elementui table 双击单元格实现编辑,聚焦,失去焦点,显示隐藏input和span
<el-table :data="tableData" class="tb-edit" style="width: 100%" ref ...
- POJ 1176 Party Lamps&& USACO 2.2 派对灯(搜索)
题目地址 http://poj.org/problem?id=1176 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都 ...
- 图论--最小生成树--Kruscal 模板
#include<iostream> #include<queue> #include<algorithm> #include<set> #includ ...