1.安装虚拟环境virtualenvwrapper,建立虚拟环境目录,进入虚拟环境,个人虚拟环境目录叫venv2html
[root@HH ~]# workon venv2 (venv2) [root@HH ~]# ls
2.cd进入到项目目录里面,安装项目必须的模块,例如django,djangorestframework,pymysql等等。node
3.修改settings.py的配置文件python
修改数据库配置mysql
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydjango', #数据库名 'HOST': '127.0.0.1', #这里服务器的ip地址 'PORT': 3306, #端口 'USER': 'root', #用户名 'PASSWORD': 'zou123456', #用户密码 } }
更改容许主机nginx
ALLOWED_HOSTS = ['*']
关闭debug程序员
debug=True
4.进入数据库建立mydjango数据库web
5.启动项目sql
python manage.py runserver 0.0.0.0:8008
注意点:检查mysql数据库是否启动,启动时加0.0.0.0,关闭防火墙,若是时云服务器,检查安全组数据库
WSGI是web服务器网关接口,它是一个规范,描述了web服务器如何与web应用程序通讯。以及web应用服务器如何连接在一块儿处理一个请求。django
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是对外的服务接口,外部浏览器经过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:好滴。我把响应交给用户。合做愉快
在前面咱们使用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
访问咱们的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; } } }
检查配置文件,加载配置文件
(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项目,而且静态文件是否正常
这样静态文件也加载上了