Linux--部署Django项目
简单部署
1.安装虚拟环境virtualenvwrapper,创建虚拟环境目录,进入虚拟环境,我的虚拟环境目录叫venv2
[root@HH ~]# workon venv2
(venv2) [root@HH ~]# ls
2.cd进入到项目目录里面,安装项目必须的模块,例如django,djangorestframework,pymysql等等。
3.修改settings.py的配置文件
修改数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydjango', #数据库名
'HOST': '127.0.0.1', #这里服务器的ip地址
'PORT': 3306, #端口
'USER': 'root', #用户名
'PASSWORD': 'zou123456', #用户密码
}
}
更改允许主机
ALLOWED_HOSTS = ['*']
关闭debug
debug=True
4.进入数据库创建mydjango数据库
5.启动项目
python manage.py runserver 0.0.0.0:8008
注意点:检查mysql数据库是否启动,启动时加0.0.0.0,关闭防火墙,如果时云服务器,检查安全组
什么是wsgi
WSGI是web服务器网关接口,它是一个规范,描述了web服务器如何与web应用程序通信。以及web应用服务器如何链接在一起处理一个请求。
django的主要部署平台是WSGI,这是用于web服务器和应用程序的python标准。django的startproject管理命令设置一个简单的WSGI配置,可以根据需要为你的项目进行调整。使用WSGI部署的关键概念是应用服务器用于与代码通信的application可调用。它通常在服务器可访问的python模块中作为名为application的对象提供。
startproject命令创建包含这样的application可调用的文件<project_name>/wsgi.py,它被django的开发服务器和生产WSGI部署使用。WSGI服务器从配置中获取application可调用的路径,django的内置服务器,既runservre命令,从WSGI_APPLICATION设置读取它。
为什么要用nginx+uwsgi
nginx是对外的服务接口,外部浏览器通过url访问nginx,nginx接收到浏览器发送来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件资源。
如果不是静态文件,而是一个动态的请求。那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式。并发给wsgi,wsgi根据请求调用 应用程序的某个文件的某个函数。处理完将返回值在交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接受的格式,uwsgi接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。
nginx并不是必须的,uwsgi完全可以完成整个和浏览器交互的流程,但要考虑到某些情况
1.安全问题:程序不能直接被浏览器访问到。而是通过nginx,nginx只开放某个接口。uwsgi本身是内网接口,在nginx上加上安全性的限制,可以达到保护程序的作用。
2.负载均衡:一个uwsgi很可能不够用, 即使开了多个work也不行,毕竟一台机器的cpu和内存是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
3.静态文件:用django或者uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个 静态文件的处理都由nginx完成,静态文件的访问完全不经过uswgi以及后面的东西。
uwsgi # 和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型 uWSGI # 是一个web服务器,实现了WSGI协议,uwsgi协议。a nginx # web服务器,更加安全,更好的处理处理静态资源,缓存功能,负载均衡,因此nginx的强劲性能,配合uWSGI服务器会更加安全,性能有保障。 django # 高级的python web框架,用于快速开发,解决web开发的大部分麻烦,程序员可以更专注业务逻辑,无须重新造轮子
如果将一次通信转化为“对话”的过程
Nginx:hello wsgi,我刚收到一个请求,你准备下然后让django来处理吧
WSGI:好的nginx,我马上设置环境变量,然后把请求交给django
Django:谢谢WSGI,我处理完请求马上给你响应结果
WSGI:好的,我在等着
Django:搞定啦,麻烦wsgi吧响应结果传递给nginx
WSGI:太棒了,nginx,响应结果请收好,已经按照要求传递给你了
nginx:好滴。我把响应交给用户。合作愉快
Django+Nginx+uwsgi 安装配置
在前面我们使用python manage.py runserver 0.0.0.0:8008来运行服务器,这只适用于测试环境中使用。正式发布的服务,需要一个可以稳定而持续的服务器。
在使用Django+Nginx+uwsgi部署时,请确保简单部署没问题。还是在虚拟环境venv2里部署。
1.进入虚拟环境venv2,安装uwsgi,Apitest为我的django项目名,表明我现在在项目的根目录下。
(venv2) [root@HH Apitest]# pip3 install -i https://pypi.douban.com/simple uwsgi
检查uwsgi的版本
(venv2) [root@HH Apitest]# uwsgi --version
2.0.18
2.通过uwsgi启动django项目(uwsgi不处理static静态文件的配置)
确保当前的路径为项目根目录下,也就是和manage.py文件同级,注意--http后面有空格
(venv2) [root@HH Apitest]# uwsgi --http :9001 --module Apitest.wsgi
*** Starting uWSGI 2.0.18 (64bit) on [Sun Oct 6 14:33:07 2019] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-39) on 06 October 2019 05:24:14
os: Linux-3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019
nodename: HH
machine: x86_64
clock source: unix
- --http 指明是http协议
- :9001 指定端口号
- --module Apitest.wsgi 加载指定的wsgi模块,根据自己的项目名称自己指定
访问我们的django自带的后台,静态文件不加载
启动后查看进程
[root@HH ~]# ps -ef | grep uwsgi
补充:大家都知道pycharm会自动检测django项目,如果代码有变动,会自动重启,uswgi也可以,加上一个参数就可以了
(venv2) [root@HH Apitest]# uwsgi --http :9001 --module Apitest.wsgi --py-autoreload=1
--py-autoreload是告诉uwsgi自动重启加载django项目,1表示为True
我们可以把上面的配置也在文件里,通过配置文件启动,uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在项目的根目录下(和manage.py)创建一个uwsgi.ini文件,写入下面内容
[uwsgi]
# 项目的绝对路径,定位到项目的第一层,我的项目是放在tmp下
chdir = /tmp/Apitest# 指明项目的wsgi文件路径
module =Apitest.wsgi
# 指明你的虚拟解释器的第一层路径
home = /root/Envs/venv2
#指明通过uwsgi,启动多少个进程
processes = 5 #如果你已经配置了nginx(启动了nginx服务,配置了uwsgi_pass),请用这个socket连接
#socket = 0.0.0.0:8000 #如果你没用nginx,想通过uwsgi直接启动web服务,指明http协议
http = 0.0.0.0:9999 #在退出uwsgi环境后,清空环境变量
vacuum = true
然后就可以通过下面命令启动了
(venv2) [root@HH Apitest]# uwsgi --ini uwsgi.ini
注意uwsgi不会处理静态文件,如果有,也是浏览器的缓存
3.配置django的settings.py,收集所有Apitest项目所需的静态文件
在settings.py配置文件加下面一行
STATIC_ROOT='/tmp/static/' # 路径自己指定
执行命令
python manage.py collectstatic
此时Apitest的所有静态文件,都跑到/tmp/static/底下了
4.配置nginx
配置一个网站入口,当用户访问192.168.88.67:80 这个web应用时,自动将请求转发给uwsgi,uwsgi处理后,返回给nginx,返回给用户
当请求是192.168.88.67:80的时候,其实访问的是192.168.88.67:9999 这是动态请求,因为我是找到的uwsgi
确保nginx启动的
配置文件
nginx.conf配置如下
#定义负载均衡池,里面放入uwsgi的地址
upstream Api{
server 127.0.0.1:8000;
} server {
listen 80;
server_name localhost;
# 将nginx入口的请求,直接反向代理给uwsgi
location / {
uwsgi_pass Api;
include /opt/nginx1-16/conf/uwsgi_params;
}
# 通过nginx处理nbcrm的静态文件
location /static {
alias /tmp/static/;
}
}
#user nobody;
worker_processes 1; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout 0;
keepalive_timeout 65; #gzip on;
# 定义负载均衡池,里面放入uwsgi的地址
upstream Api {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name localhost;
# 将nginx入口的请求,直接反向代理给uwsgi
location / {
uwsgi_pass Api;
include /opt/nginx1-16/conf/uwsgi_params;
}
#通过nginx处理nbcrm的静态文件
location /static{
alias /tmp/static/;
}
location /status {
stub_status on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} }
server {
listen 80;
server_name www.balabala.com;
location / {
root /data/balabala;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} }
}
我的nginx的配置文件,仅供参考
检查配置文件,加载配置文件
(venv2) [root@HH sbin]# ./nginx -t
(venv2) [root@HH sbin]# ./nginx -s reload
(venv2) [root@HH sbin]# ./nginx
5.更改uwsgi.ini ,指明socket连接,结合uwsgi 和nginx
如果你已经配置了nginx,请用这个socket连接socket = 0.0.0.0:8000
[uwsgi]
#项目的绝对路径,定位到项目的第一层
chdir = /tmp/LuffyBoy
#指明项目的wsgi文件路径
module =LuffyBoy.wsgi
#指明你的虚拟解释器的第一层路径
home = /root/Envs/venv2
#指明通过uwsgi,启动多少个进程
processes = 5 #如果你已经配置了nginx(启动了nginx服务,配置了uwsgi_pass),请用这个socket连接
socket = 0.0.0.0:8000 # 使用这个,将下面的http注释掉 #如果你没用nginx,想通过uwsgi直接启动web服务,指明http协议
#http = 0.0.0.0:9999 #在退出uwsgi环境后,清空环境变量
vacuum = true
6.启动uwsgi.ini
(venv2) [root@HH Apitest]# uwsgi --ini uwsgi.ini
7.并且访问nginx的域名入口,查看是否能访问到uwsgi项目,并且静态文件是否正常
这样静态文件也加载上了
Linux--部署Django项目的更多相关文章
- linux ---部署django项目篇
uWSGI + nginx+ django + virtualenv + supervisor发布web服务器 项目部署步骤 1.项目准备阶段 1.准备项目代码,从本地拷贝 2.将项目上传到linux ...
- linux部署django项目流程(全)
1.python3和python2共存配置 流程在下面网址中 https://www.cnblogs.com/vinic-xxm/p/11358894.html 2.安装依赖包 yum install ...
- Linux 下部署Django项目
Linux 下部署Django项目 说明:本文所使用的环境为CentOS 6+Python2.7+Django1.11 安装Django.Nginx和uWSGI 1.确定已经安装了2.7版本的Py ...
- linux上使用nginx、uwsgi部署django项目
参考:CentOS7下部署Django项目详细操作步骤 注意事项: 在虚拟环境中操作,虚拟环境中安装nginx.uwsgi,虚拟环境外需安装uwsgi -- 临时关闭防火墙:systemctl sto ...
- mac osx 上面部署Django项目 apache+mysql+mod_wsgi
1.安装Xcode command line tools 首先,编译mysql和Homebrew需要用到Xcode command line tools,所以首先安装command line tool ...
- CentOS 6.8 部署django项目一
CentOS 6.8 部署django项目二 1.安装python3.5(默认是2.6) 参考:http://blog.csdn.net/shaobingj126/article/details/50 ...
- 使用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 ...
- 在裸机centos7系统中部署django项目的过程
概要 本文用一台安装了centos7.5系统的裸奔Linux机器(当然是虚拟机)详细讲解从无到有部署django项目的过程. 安装必要的工具 配置yum源 至于什么是yum源大家请自行百度,本人用的是 ...
- Nginx 和 Gunicorn 部署 Django项目
目录 Nginx 和 Gunicorn 部署 Django项目 配置Nginx 安装配置Gunicorn 通过命令行直接启动 Gunicorn 与 uwsgi 的区别,用哪个好呢 Gunicorn u ...
随机推荐
- [ZJOI2019] 开关 (一种扩展性较高的做法)
[ZJOI2019] 开关 (一种扩展性较高的做法) 题意: 有n个开关,一开始状态都为关闭.每次随机选出一个开关将其状态改变,选出第i个开关的概率为${ p_i \over \sum_{i=1}^n ...
- QMap::remove操作,并不会调用值的析构,跟QTreeWidget同类,需要主动去释放
void test_MapRemvoe() { DBOperator * painter = new DBOperator; QMap<int , DBOperator*> map; ma ...
- 十一、Spring之事件监听
Spring之事件监听 ApplicationListener ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成Applica ...
- Course: ISA 414
Assignment #4Course: ISA 414Points:100Due date: November 18th, 2019, before 11:59 pmSubmission instr ...
- redis之线程IO模型
非阻塞 IO 当我们调用套接字的读写方法,默认它们是阻塞的,比如 read 方法要传递进去一个参数n,表示读取这么多字节后再返回,如果没有读够线程就会卡在那里,直到新的数据到来或者连接关闭了,read ...
- spring的@primary和@qualifier注解解决一个接口多个实现的注入问题
Spring中提供了@Primary和@Qualifier注解来解决一个接口多个实现的注入问题. @Primary注解 Spring中有提供一个@Primary注解,具体的作用是在一个接口有多个实现类 ...
- Kubernetes Deployment(部署无状态应用)
Kubernetes Deployment(部署无状态应用) Pod与controllers的关系 • controllers:在集群上管理和运行容器的对象 • 通过label-selector相关联 ...
- OpenGL入门1.3:着色器 GLSL
前言 经过之前一段时间的学习(渲染管线简介)我们已经知道了着色器(Shader)是运行在GPU上的程序,这些小程序为图形渲染管线的某个特定部分而运行,着色器只是一种把输入转化为输出的程序,着色器也是一 ...
- C# 嵌套循环
一.简介 嵌套循环:while.for和do...while循环使用一个或者多个嵌套. 二.实例 输出九九乘法表(循环的嵌套) //乘法口诀 for (int i = 1; i <= 9; i+ ...
- echarts白色实心环形图(空心饼图)的编写
// 数据接入机构统计let myDom = document.getElementById('myChart');let myWidth = myDom.offsetWidth - 5; // 获取 ...