uwsgi + nginx为django提供高并发
分为两部分:
一部分写django,链接不能断开,在这时配置uwsgi;
另一部分部署nginx.
做这个实验我们要启动两个xshell终端连接.
第一部分(配置uwsgi):
第一步,配置虚拟环境并进行相应的安装.
虚拟环境创建命令:mkvirtualenv 想要起的虚拟环境名字
虚拟环境应该自带最基本的工具,包括pip3.
如果发现命令 pip3 list无法使用的话就应该删掉虚拟环境重建.
在刚进入的时候发现虚拟环境中没有django和uwsgi
(在物理环境中下载没什么卵用,在虚拟环境中要重新安装)
django下载命令: pip3 install -i https://pypi.douban.com/simple django==1.11.9
uwsgi下载命令:pip3 install -i https://pypi.douban.com/simple uwsgi
(此时可以进行展示pip3 list查看是否下载成功)
第二步,在/etc创建uwsgi.ini,写入内容.
命令:vim /etc/uwsgi.ini
下面的内容是写入uwsgi.ini的:
[uwsgi]
# Django-related settings
# the base directory (full path)
#项目的绝对路径,定位到nbcrm的第一层
chdir = /opt/NBcrm
# Django's wsgi file
# 找到项目第二层的wsgi文件
module = NBcrm.wsgi
# the virtualenv (full path)
# 找到虚拟环境的绝对路径
home = /root/Envs/nbcrm
# process-related settings
# master
# 主进程
master = true
# maximum number of worker processes
# 开启uwsgi的多进程数,根据cpu核数来定义
processes = 16
# the socket (use the full path to be safe
# 基于socket链接运行crm,只有与nginx结合的时候,才使用socket形式
socket = 0.0.0.0:8000
# 当你没用nginx,调试项目的时候,使用http形式
#http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
#指定一个参数,日志放在哪
#如果你使用了supervisor,请注释掉这个参数
#守护进程在后台运行,且将日志信息,输出到uwsgi.log日志中
#daemonize = uwsgi.log(也可以写为true)
第三步,启动配置文件:
命令:/root/Envs/uwsgi/bin/uwsgi --ini uwsgi.ini
(第一个是uwsgi命令的绝对路径(也可以写相对路径),写到uwsgi,执行配置文件)
(第二个是--ini,即执行ini文件格式的内容)
(第三个是uwsgi.ini,也就是需要执行的文件的路径,建议写绝对路径 /etc/uwsgi.ini)
以上,django项目启动完成.
此外,第二步和第三步也可以使用别的方法来启动django.
总共有2种方式:
1. 基于配置文件形式启动django.,运行mycrm. ---上文就是用的这种方法.
2. 命令启动django.
命令:
uwsgi --http :8088 --module mysite.wsgi
# --module 找到django项目的第二层里面的wsgi.py文件
#假如我们有一个django项目是 mysite,那么第一层的文件夹是mysite,
第二层的文件夹是mysite,manage.py,app01(应用程序),静态文件,templates等.
mysite.wsgi说的就是含有wsgi的mysite文件夹.
命令方式的热加载:
uwsgi --http :9000 --module mycrm.wsgi --py-autoreload=1
但是,无论哪种方式,uwsgi默认不支持静态文件解析,
所以我们要使用nginx去解析静态文件.
第二部分(配置nginx):
第一步,修改django里面的settings.py文件
命令:vim settings.py(路径)
写入的文本内容(汉字不写入,mycrmstatic是收集的静态文件夹,换个别的名字):
添加如下参数
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_ROOT='/opt/mycrmstatic'
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'statics'),
]
第二步,执行命令,收集crm的静态文件 (自己修改路径,不要死记硬背,collectstatic是django的命令)
命令:python3 /opt/mycrm/manage.py collectstatic
第三步,配置nginx的location路径匹配,找到crm这些静态文件
在nginx.conf中找到server{}标签,添加如下参数
#当我的请求url是 192.168.16.142:80/static/xxxxxxxx
location /static {
alias /opt/s20static/;
}
命令:
vim /opt/nginx/conf/nginx.conf
在location / {
...
}
下面写入
location /static {
alias /opt/s20static/;
}
即可.
第四步,启动nginx,访问nginx的80,看是否可以转发到crm
注意,上述操作结束后,只能访问端口为80的,不能访问端口为8000的.
如果访问不成功可能是因为防火墙没关闭,命令:iptables -F
如果提示ALLOWED_HOSTS,那么就去settings.py里面修改ALLOWED_HOSTS=["*"]
全部操作命令展示:
mkvirtualenv uwsgi
pip3 list
pip3 install -i https://pypi.douban.com/simple django==1.11.9
pip3 install -i https://pypi.douban.com/simple uwsgi
pip3 list
vim /etc/uwsgi.ini
ls
mv -t /opt mycrm/
ls
cd ..
ls
rm -rf allenv/
ls
cd mycrm/
ls
cd luffy_permission/
pwd
vim /etc/uwsgi.ini
/root/Envs/uwsgi/bin/uwsgi --ini /etc/uwsgi.ini
ls
cd ..
/root/Envs/uwsgi/bin/uwsgi --ini /etc/uwsgi.ini
vim /etc/uwsgi.ini
/root/Envs/uwsgi/bin/uwsgi --ini /etc/uwsgi.ini
history
补充1:
WSGI
WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),
它不是服务器、python模块、框架、API或者任何软件,
只是一种描述web服务器(如nginx,uWSGI等服务器)如何
与web应用程序(如用Django、Flask框架写的程序)通信的规范。
server和application的规范在PEP3333中有具体描述,
要实现WSGI协议,必须同时实现web server和web application,
当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。
uWSGI
uWSGI是一个全功能的HTTP服务器,
实现了WSGI协议、uwsgi协议、http协议等。
它要做的就是把HTTP协议转化成语言支持的网络协议。
比如把HTTP协议转化成WSGI协议,让Python可以直接使用。
uwsgi
与WSGI一样,是uWSGI服务器的独占通信协议,
用于定义传输信息的类型(type of information)。
每一个uwsgi packet前4byte为传输信息类型的描述,
与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
Nginx
Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,
但是Nginx还可以用作更多用途,比如最常用的反向代理功能。
Django
Django是一个Web框架,框架的作用在于处理request和 reponse,
其他的不是框架所关心的内容。
所以如何部署Django不是Django所需要关心的。
Django所提供的是一个开发服务器,这个开发服务器,没有经过安全测试,
而且使用的是Python自带的simple HTTPServer 创建的,
在安全性和效率上都是不行的。
补充2:
热部署:直接重新加载整个应用(生产环境),清空内存重新打包,重新解压war包
热加载:在运行时重新加载class(开发环境),基于字节码的更改,不释放内存开发可用,上线不可用,热加载不重启tomcat,不重新打包
举例:pycharm中写django,自动重启,这是pycharm的机制.
懒加载:延迟加载,
实现方法:先在页面中把所有的图片统一使用一张占位图进行占位,地址存放到其它属性(data-original)中,把正真的路径存在元素的“data-url”属性里,根据scrollTop判断图片是否在用户的视野内,如果在,则将data-original属性中的值取出存放到src属性中。
**预加载:**提前加载图片,当用户需要查看时可直接从本地缓存中渲染
实现方法:
用CSS和JavaScript实现预加载
仅使用JavaScript实现预加载
使用Ajax实现预加载
具体实现
热更新:热更新就是当你在开发环境修改代码后,不用刷新整个页面即可看到修改后的效果
实现方法
热部署和热加载的联系
不重启服务器编译/部署项目
基于Java的类加载器实现
热部署和热加载的联系
部署方式
热部署在服务器运行时重新部署项目
热加载在运行时重新加载class
运行tomcat项目需要3步
打包并指定给tomcat
启动tomcat
解压war包并运行(第三步和第二步一起的)