前言
献给和我一样懵懂中不断汲取知识,进步的人们。
霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光
理论铺垫
1,
wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。uWSGI :一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web
server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。
因为apache、nginx等,它们自己都没有解析动态语言如php的功能,而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。
Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
2.项目流程和每个组件的用途
首先客户端请求服务资源,
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
wsgi将返回值进行打包,转发给uWSGI,
uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换
3.作用
- 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
- 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
- uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
- django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。
准备工作
1.dajngo项目, (home目录下有一个runyi文件夹,runyi文件夹下面是django项目runyi,django项目runyi下面就是manage.py文件和子应用runyi)
2.打包生成的vue文件,也就是dist文件(把dist文件放到和子应用同级的目录)
3.uwsgi
4.nginx
备注:django只提供接口,没有用到django的模板
配置
##1.uwsgi配置
在django项目,manage.py同级目录下,新建uwsgi.ini文件,写入下面代码
[uwsgi]
# 项目目录
chdir=/home/runyi/runyi/
# 指定项目的application
module=runyi.wsgi:application
# 指定sock的文件路径,用于和 nginx 进行数据交互的端口,一定要和nginx配置保持一致!!
socket=127.0.0.1:8080
# 进程个数
workers=5
pidfile=/home/runyi/runyi/uwsgi.pid
# 指定IP端口 云服务器需要改成 0.0.0.0, # 对外提供 http 服务的端口
# http=127.0.0.1:8001
# 指定静态文件
# static-map=/static=/opt/pro/pro/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录, 设置这个的话,日志全部会出现在日志文件中,不会出现在启动uwsgi命令下面
daemonize=/home/runyi/runyi/uwsgi.log
# 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中
disable-logging=true
# 以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize=10000000 就是10M一个日志文件
log-maxsize=10000000
# 在每一个日志行中都打印时间信息。你可以传入一个strftime()格式的参数,来格式化时间的格式
logdate=true
# ... with appropriate permissions - may be needed
chmod-socket=666
# auto restart uwsgi when *.py was changed.只适用于开发环境
py-auto-reload = 1
uwsgi操作命令
# 后台运行
uwsgi -d --ini uwsgi.ini
# 单纯启动
uwsgi --ini uwsgi.ini
# 查看对应程序的进程号码
ps aux|grep uwsgi
# 关闭
uwsgi --stop uwsgi.pid
# 杀死进程
pkill -f uwsgi -9
# 重启uwsgi
uwsgi --reload uwsgi.pid
当出现下面代码说明启动成功
runyi@hecs01:~/runyi$ uwsgi -d --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
当然为了万无一失,可以查看uwsgi的进程情况
runyi@hecs01:~/runyi$ ps aux|grep uwsgi
runyi 402757 0.8 0.8 163368 73252 ? S 10:07 0:00 uwsgi -d --ini uwsgi.ini
runyi 402761 0.0 0.7 237100 58088 ? Sl 10:07 0:00 uwsgi -d --ini uwsgi.ini
runyi 402763 0.0 0.7 237100 58088 ? Sl 10:07 0:00 uwsgi -d --ini uwsgi.ini
runyi 402765 0.0 0.7 237100 58088 ? Sl 10:07 0:00 uwsgi -d --ini uwsgi.ini
runyi 402767 0.0 0.7 237100 58088 ? Sl 10:07 0:00 uwsgi -d --ini uwsgi.ini
runyi 402810 0.0 0.0 8900 736 pts/1 S+ 10:09 0:00 grep --color=auto uwsgi
这样的话,uwsgi就成功开始运行了,uwsgi成功的接管了django,也就不需要使用python manage.py runserver来启动django,django会运行在和uwsgi一样的8080端口?(此处有待考究,有人知道的话,还请留言告知)
2.nginx配置
server {
listen 80; # 网站访问的监听端口,需要到阿里云控制中心开放80端口
server_name www.fullmedbank.cn; # 如果服务器已经被域名解析,必须填域名
charset utf-8;
# 指定项目路径uwsgi
location /api { #此处的api,指的是关于vue的跨域配置,跟随前端vue而变
include uwsgi_params;
uwsgi_connect_timeout 30;
uwsgi_pass 127.0.0.1:8080 ; #跟uwsgi的sock匹配
uwsgi_param UWSGI_CHDIR /home/runyi/runyi/; #django 项目参考地址
uwsgi_param UWSGI_SCRIPT runyi.wsgi; # wsgi模块导入
}
# 对vue的配置
location / {
root /home/runyi/runyi/dist/; #dist文件的位置
try_files $uri $uri/ /index.html;
}
}
}
nginx命令
# 杀死nginx进程
killall -9 nginx
# 检查nginx配置是否有问题
nginx -t
# 启动nginx
nginx
记得重启nginx
配置完成,就可以在通过域名进行访问了
理论知识截取自:https://blog.csdn.net/c465869935/article/details/53242126