ubuntu Django + Uwsgi + Nginx 的生产环境部署
一、概述
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了。比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署
- WSGI是一种通信协议。
- uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
- 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
准备条件
默认ubuntu已经有了python3,但是pip没有安装。
apt-get install -y python3-pip
安装虚拟环境
pip3 install virtualenv
创建虚拟环境
sudo mkdir /virtualenvs
cd /virtualenvs
sudo /usr/local/bin/virtualenv -p /usr/bin/python3 --no-site-packages venv
安装django
/virtualenvs/venv/bin/pip3 install django
二、运行django项目
创建django项目
root@ubuntu:~# mkdir /www
root@ubuntu:~# cd /www/
root@ubuntu:/www# /virtualenvs/venv/bin/django-admin startproject mysite1
root@ubuntu:/www# cd mysite1/
root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/python manage.py startapp blog
root@ubuntu:/www/mysite1# mkdir static
编辑配置文件
root@ubuntu:/www/mysite1# vim mysite1/settings.py
允许监听所有IP,注意:'*'必须用引号包起来
ALLOWED_HOSTS = ['*']
原生启动方式
/virtualenvs/venv/bin/python manage.py runserver 0.0.0.0:
访问页面
效果如下:

三、基于uwsgi+django的实现
安装uwsgi
/virtualenvs/venv/bin/pip3 install uwsgi
使用命令启动uwsgi
先关闭上面启动的Django项目,使用Ctrl+c,就可以取消。
第一步:进入django项目
cd /www/mysite1/
第二步:命令测试启动
/virtualenvs/venv/bin/uwsgi --http 0.0.0.0: --file mysite1/wsgi.py --static-map=/static=static
参数说明:
--http 这个就和runserver一样指定IP 端口
--file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的
注意:mysite1是一个相对路径。--file它的绝对路径是/www/mysite1/mysite1/wsgi.py
--static 做一个映射,指定静态文件。
此时,访问http://192.168.10.104:8000/
如果访问正常,表示项目启动成功
uwsgi配置文件
使用Ctrl+c,取消uwsgi启动。
第一步:在django项目同级目录创建uwsgi目录,用于存放相关文件
cd /www/mysite1
mkdir uwsgi
项目结构如下:
mysite1/
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── manage.py
├── mysite1
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── uwsgi
└── static
第二步:进入script目录,创建一个uwsgi.ini文件
cd /www/mysite1/uwsgi
vim uwsgi.ini
编辑uwsgi.ini文件内容如下:
[uwsgi] # Django-related settings
# the base directory (full path)
chdir = /www/mysite1
# Django's wsgi file
module = mysite1.wsgi
# the virtualenv (full path)
home = /virtualenvs/venv
# process-related settings
# master
master = true
# maximum number of worker processes
processes =
# pid file
pidfile = /www/mysite1/uwsgi/uwsgi.pid
# The address and port of the monitor
http = :
# clear environment on exit
vacuum = true
#The process runs in the background and types the log to the specified log file
daemonize = /www/mysite1/uwsgi/uwsgi.log
注意几个很重要的参数
chdir 项目目录,写绝对路径
module Django的 wsgi 文件,表示mysite1/wsgi.py
home 虚拟环境目录,写绝对路径
daemonize 进程在后台运行,并将日志打到指定的日志文件
启动django项目
root@ubuntu:~# cd /www/mysite1/
root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/uwsgi --ini uwsgi/uwsgi.ini
[uWSGI] getting INI configuration from uwsgi/uwsgi.ini
查看文件
root@ubuntu:/www/mysite1# ll uwsgi/
总用量
drwxr-xr-x root root 8月 : ./
drwxr-xr-x root root 8月 : ../
-rw-r--r-- root root 8月 : uwsgi.ini
-rw-r----- root root 8月 : uwsgi.log
-rw-rw-rw- root root 8月 : uwsgi.pid
刷新页面,查看访问是否正常。
uwsgi 常用的启动命令
uwsgi --ini uwsgi.ini # 启动
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭
四、Nginx代理uwsgi
安装nginx
apt-get install -y nginx
编辑配置文件
cd /etc/nginx/sites-enabled
vim mysite1.conf
内容如下:
server {
listen ;
server_name localhost;
# 指定项目路径uwsgi
location / {
include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
uwsgi_connect_timeout ; # 设置连接uWSGI超时时间
uwsgi_pass unix:/www/mysite1/uwsgi/mysite1.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
}
# 指定静态文件路径
location /static/ {
alias /www/mysite1/static/;
}
}
更改uwsgi配置
改为socket方式
cd /www/mysite1/uwsgi
vim uwsgi.ini
内容如下:
[uwsgi] # Django-related settings
# the base directory (full path)
chdir = /www/mysite1
# Django's wsgi file
module = mysite1.wsgi
# the virtualenv (full path)
home = /virtualenvs/venv
# process-related settings
# master
master = true
# maximum number of worker processes
processes =
# pid file
pidfile = /www/mysite1/uwsgi/uwsgi.pid
# socket file path (full path)
socket = /www/mysite1/uwsgi/mysite1.sock
# clear environment on exit
vacuum = true
#The process runs in the background and types the log to the specified log file
daemonize = /www/mysite1/uwsgi/uwsgi.log
重新加载uwsgi
/virtualenvs/venv/bin/uwsgi --reload uwsgi.pid
加载nginx配置文件
nginx -s reload
查看端口,8000已经为nginx接管了
root@ubuntu:/etc/nginx/sites-enabled# netstat -anpt|grep 8000
tcp 0.0.0.0: 0.0.0.0:* LISTEN /nginx -g daem
tcp 192.168.10.102: 192.168.10.105: ESTABLISHED /nginx: worker
tcp 192.168.10.102: 192.168.10.105: ESTABLISHED /nginx: worker
刷新页面,效果同上!
进入目录 /www/mysite1/static ,放一张图片 girl.jpg
访问图片
http://192.168.10.102:8000/static/girl.jpg
效果如下:

本文参考链接:
http://www.py3study.com/Article/details/id/323.html
https://www.jianshu.com/p/07458e99198a
ubuntu Django + Uwsgi + Nginx 的生产环境部署的更多相关文章
- 10: Django + Uwsgi + Nginx 的生产环境部署
1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI: 最早的协议 2. FCGI: 比CGI快 ...
- Django + Uwsgi + Nginx 的生产环境部署实战
目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...
- Django + Uwsgi + Nginx 的生产环境部署
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...
- Django + Uwsgi + Nginx 实现生产环境部署
本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方 ...
- 11: Django + gunicorn + Nginx 的生产环境部署
1.1 gunicorn介绍 1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...
- Django + Uwsgi + Nginx 实现生产环境 项目部署
内容: uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django项目? Django项目的部署可以有很多方式,采用nginx+uwsg ...
- Django+uwsgi+nginx+angular.js项目部署
这次部署的前后端分离的项目: 前端采用angular.js,后端采用Django(restframework),他俩之间主要以json数据作为交互 Django+uwsgi的配置可以参考我之前的博客: ...
- django+nginx+python3 生产环境部署
一.安装python基础环境 1.安装各类基础模块 yum install gcc-c++ wget openssl-devel bzip2-devel expat-devel gdbm-devel ...
- Ubuntu+Django+uWSGI+Nginx部署Django项目
安装uWSGI,pip依据自己要使用的python版本自行选择,python2.x版本使用pip进行安装,python3.x版本使用pip3进行安装 pip install uwsgi 配置uWSGI ...
随机推荐
- 洛谷 P1786 帮贡排序 题解
P1786 帮贡排序 题目背景 在absi2011的帮派里,死号偏多.现在absi2011和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整. 题目描述 目前 ...
- Comet OJ - Contest #15 题解
传送门 \(A\) 咕咕 const int N=1005; int a[N],n,T; int main(){ for(scanf("%d",&T);T;--T){ sc ...
- mysql初始
数据(data) : -描述事物的符号记录称为数据,符号既可以是数据,文字,图片,声音,语言等,符号都可以经过数字化后存入计算机中 - 计算机中描述一个事物,就需要抽取这一事物的典型特征,组成一条记录 ...
- redis三种模式对比
模式类型 主从模式(redis2.8版本之前的模式).哨兵sentinel模式(redis2.8及之后的模式).redis cluster模式(redis3.0版本之后) 主从模式原理 同Mysql主 ...
- Nginx目录文件列表显示
项目中使用了tomcat,Nginx,测试阶段,生产阶段经常会有些bug需要调查.需要有些日志管理工具,在没有ELK的情况下,可以通过配置nginx来实现基本的日常查看.不需要登录到Linux服务器上 ...
- Spring Cloud Ribbon源码分析---负载均衡实现
上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...
- jdk 6-13最有价值新特性总结
355: Text Blocks (Preview) JDK 13的特性.简化了大段文本的换行,例如sql或xml段. Shenandoah GC. jdk 12作为实验特性引入. JEP330-启动 ...
- 微信小程序 获取地理位置信息
app.json "permission":{ "scope.userLocation": { "desc": "你的位置信息将用 ...
- java中为什么notify()可能会导致死锁,而notifyAll()则不会
简单的说,notify()只唤醒一个正在等待的线程,当该线程执行完以后施放该对象的锁,而没有再次执行notify()方法,则其它正在等待的线程 则一直处于等待状态,不会被唤醒而进入该对象的锁的竞争池, ...
- 原生微信小程序脚手架(支持npm)
微信小程序支持npm 为了支持生态扩展,社区贡献者可以提供更加丰富的功能,已经支持了第三方小程序开发功能,见如下地址. 微信小程序支持npm https://developers.weixin.qq. ...