详解Ubuntu环境下部署Django+uwsgi+nginx总结


Posted in Python onApril 02, 2020

前言

这是我在搭建Django项目时候的过程,拿来总结记录,以备不时之需。

项目采用nginx+uwsgi的搭配方式。

项目依赖包采用 requirements.txt 文件管理的方式。

本地准备工作

确认项目能够运行起来,没有 bug

将当前环境的包导出 pip freeze > requirements.txt

将项目上传到服务器上的 /srv 目录下。这里以 git 的形式为例, 打开终端, 依次输入如下命令:

$ git init
$ git remote add origin xxx.git  # 替换成你的项目git地址
$ git add .
$ git commit -m 'first commit'
$ git pull origin master --allow-unrelated-histories
$ git push origin master

部署项目到服务器

安装python

安装好项目用到的 python 。

$ sudo apt install python
$ sudo apt install python-pip
$ pip install --upgrade pip

安装 virtualenv 以及 virutalenvwrapper ,并创建虚拟环境。

$ pip install virtualenv
$ pip install virtualenvwrapper
$ sudo apt install vim

编辑文件 ~/.bashrc

$ vim ~/.bashrc

# 添加如下2行代码
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

# 保存文件,让文件成效
$ source ~/.bashrc

安装git:

$ sudo apt install git

# 为了方便XShell或者CRT连接服务器,建议安装OpenSSH
$ sudo apt install openssh-server openssh-client
$ service ssh restart

安装MySQL

$ sudo apt install mysql-server mysql-client
$ sudo apt-get install libmysqld-dev

测试配置

  1. 安装依赖包,进入虚拟环境 workon *** ,进入项目根目录,执行命令 pip install -r requirements.txt
  2. 创建数据库,新打开一个终端,登录数据库, mysql -uroot -p , 创建相应的数据库 CREATE DATABASE IF NOT EXISTS my_db default charset utf8mb4;
  3. 迁移数据, python manage.py migrate
  4. 收集静态文件, python manage.py collectstatic
  5. 启动服务器,执行 python manage.py runserver 0.0.0.0:8000 ,然后在你自己电脑上,在浏览器中输入 http://<your server ip>:8000 ,访问下网站所有页面,确保所有页面都没有错误。

注意:

  • 设置 ALLOW_HOST 为你的域名或 ip 地址。
  • 设置 DEBUG=False

安装uwsgi

uwsgi 是一个应用服务器,非静态文件的网络请求就必须通过他完成,他也可以充当静态文件服务器,但不是他的强项。

uwsgi 是使用 python 编写的,因此通过 pip install uwsgi 就可以了。( uwsgi 必须安装在系统级别的 Python 环境中,不要安装到虚拟环境中)。

命令行启动 uwsgi :

$ uwsgi --http :8000 --module test.wsgi --vritualenv=/root/.virtualenvs/django-env-py36

如果能够在浏览器中访问到测试的页面,说明uwsgi可以加载项目了。

配置文件方式启动 uwsgi :

在项目的根路径下面,创建一个文件 djangotest.ini ,填写以下代码:

[uwsgi]
# Django相关的配置
# 必须全部为绝对路径
# 项目的路径
chdir=/srv/djangotest

# Django的wsgi文件
module=djangotest.wsgi

# Python虚拟环境的路径
home=/root/.virtualenvs/django-env-py36

# 进程相关的设置
# 主进程
master=true

# 最大数量的工作进程
processes=10

# socket文件路径,绝对路径
socket=/srv/djangotest/djangotest.sock

# 设置socket的权限
chmod-socket=666

# 退出的时候是否清理环境
vacuum=true

然后使用命令uwsgi --ini djangotest.ini,看下是否还能启动这个项目。

安装nginx

nginx 是一个 web 服务器。用来加载静态文件和接收 http 请求的。

通过命令 sudo apt install nginx 即可安装。

nginx 常用命令:

  • 启动nginx:service nginx start
  • 关闭nginx:service nginx stop
  • 重启nginx:service nginx restart

收集静态文件:

静态文件应该让 nginx 来处理,而不是让 django 来做。

首先确保你的 settings.py 文件中有一个 STATIC_ROOT 配置,这个配置应该指定你的静态文件要放在哪个目录下。

那么我们可以执行以下命令: python manage.py collectstatic 来收集所有静态文件(已经执行过请忽略)。

编写nginx配置文件,在 /etc/nginx/conf.d 目录下,新建一个文件 djangotest.conf ,然后将以下代码贴进去:

upstream djangotest {
  server unix:///srv/djangotest/djangotest.sock; 
}

# 配置服务器
server {
  # 监听的端口号
  listen   80;
  # 域名
  server_name 192.168.0.101; 
  charset   utf-8;

  # 最大的文件上传尺寸
  client_max_body_size 75M; 

  # 静态文件访问的url
  location /static {
    # 静态文件地址
    alias /srv/djangotest/static_dist; 
  }

  # 最后,发送所有非静态文件请求到django服务器
  location / {
    uwsgi_pass djangotest;
    # uwsgi_params文件地址
    include   /etc/nginx/uwsgi_params; 
  }
}

测试配置文件: service nginx configtest 。注意:每次修改完配置需要重启 nginx : service nginx restart

使用supervisor

让supervisor管理uwsgi,可以在uwsgi发生意外的情况下,自动重启。

安装 supervisor :在系统级别的python环境下 pip install supervisor

在项目根目录下创建一个文件 my_supervisor.conf 。编写内容:

# supervisor的程序名字
[program:mysite]
# supervisor执行的命令
command=uwsgi --ini zlkt_uwsgi.ini
# 项目的目录
directory = /srv/djangotest 
# 开始的时候等待多少秒
startsecs=0
# 停止的时候等待多少秒
stopwaitsecs=0 
# 自动开始
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件
stdout_logfile=/srv/djangotest/log/supervisord.log
# 输出的错误文件
stderr_logfile=/srv/djangotest/log/supervisord.err

[supervisord]
# log的级别
loglevel=info

# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登录的地址和端口号
serverurl = http://127.0.0.1:9001

# 登录supervisorctl的用户名和密码
username = admin
password = 123

[inet_http_server]
# supervisor的服务器
port = :9001
# 用户名和密码
username = admin
password = 123

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

运行 supervisor ,执行 supervisord -c my_supervisor.conf 。

进入 supervisor 管理控制台, supervisorctl -c my_supervisor.conf

supervisor 管理控制台常用命令

# 查看状态
status

# 启动程序
start program_name

# 重新启动程序
restart program_name

# 关闭程序
stop program_name

# 重新加载配置文件
reload

# 退出控制台
quit

到此这篇关于Ubuntu环境下部署Django+uwsgi+nginx总结的文章就介绍到这了,更多相关Ubuntu环境下部署Django+uwsgi+nginx总结内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中正则表达式的用法实例汇总
Aug 18 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
python将字符串转换成json的方法小结
Jul 09 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
Python内存映射文件读写方式
Apr 24 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 Python
在 Pycharm 安装使用black的方法详解
Apr 02 #Python
Python Numpy中数据的常用保存与读取方法
Apr 01 #Python
Python PyQt5整理介绍
Apr 01 #Python
django之导入并执行自定义的函数模块图解
Apr 01 #Python
在脚本中单独使用django的ORM模型详解
Apr 01 #Python
Python视频编辑库MoviePy的使用
Apr 01 #Python
python json.dumps中文乱码问题解决
Apr 01 #Python
You might like
PHP应用JSON技巧讲解
2013/02/03 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
vue中父子组件的参数传递和应用示例
2021/01/04 Vue.js
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python实现泊松图像融合
2018/07/26 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
行政管理专业求职信
2014/07/06 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书