一.环境准备
Linux主机1台
Python环境
已安装django模块
二.储备知识
· django
一个基于python的开源web框架,请确保自己熟悉它的框架目录结构。
· uWSGI
一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关
· nginx
常用高性能代理服务器
· wsgi.py
django项目携带的一个wsgi接口文件
如果项目名叫hello的话,此文件就位于[hello/hello/wsgi.py]
三.请求流程
首先客户端请求服务资源,
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,wsgi将返回值进行打包,转发给uWSGI,
uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换
四.安装
4.1 django项目测试
1.请保证已经安装了django模块,具体测试方法为:
如果导入成功,则不会报错。
2.找到自己django项目的路径,然后执行命令:pythonmanage.py runserver ip:端口
结果如下,说明项目已经启动
使用浏览器浏览
我虚拟机的地址为19.168.164.137,使用8001端口,后面的/watch/test是在url配置的,详情可见https://blog.csdn.net/weixin_38942791/article/details/80673872。这个结果就说明,django运行正常啦。
4.2 uwsgi+django结合
4.2.1.安装uwsgi
安装命令如下:
我已经安装好了,所以报这个。这台虚拟机使用的是python2.7,我本人一般在python3上码代码,这里不用纠结2/3,主要是做一个测试,把环境跑起来。
4.2.2.配置uwsgi
在项目下面新建一个文件叫uwsgi.ini,然后添加如下信息:
[uwsgi]
# 项目目录
chdir=/root/hello/
# 指定项目的application
module=hello.wsgi:application
# 指定sock的文件路径
socket=/root/hello/uwsgi.sock
# 进程个数
workers=5
pidfile=/root/hello/uwsgi.pid
# 指定IP端口
http=192.168.164.137:9000
# 指定静态文件
static-map=/static=/root/hello/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize = /root/hello/uwsgi.log
这里我配置了192.168.164.137:9000,访问的时候可以访问这个。
4.2.3 运行uwsgi+django
依然是运行测试项目,运行命令为:
uwsgi --ini uwsgi.ini
浏览器截图如下:
目前已经成功的完成了uwsgi+django的方式了。Nginx的出现是为了提供更好的网页性能,更安全的访问网页,但他不是必须的。Uwsgi处理动态请求效果较好,处理静态请求nginx性能较高。因此下面将增加nginx。
4.3 nginx+uwsgi+django结合
4.3.1 安装运行nginx
可通过yum方式安装:
yum -y install nginx
安装好后,执行:
/etc/init.d/nginx start
确保Nginx已经正常运行。
4.3.2 nginx+uwsgi+django
1. 创建配置文件hello.conf。名字无所谓,我的这个项目叫hello,起名为hello.conf。
里面的内容为:
upstream django {
server unix:///root/hello/uwsgi.sock; # for a file socket
#server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server
{ # 这个server标识我要配置了
listen 9090; # 我要监听那个端口
server_name 192.168.164.137; # 你访问的路径前面的url名称
access_log /var/log/nginx/access.log; # Nginx日志配置
charset utf-8; # Nginx编码
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/jso
n image/jpeg image/gif image/png application/octet-stream; # 支持压缩的类型
error_page 404 /404.html; # 错误页面
error_page 500 502 503 504 /50x.html; # 错误页面
# 指定项目路径uwsgi
location / { # 这个location就和咱们Django的url(r'^admin/', admin.site.urls),
include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass unix:///root/hello/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
}
# 指定静态文件路径
location /static/ {
alias /root/hello/static/;
index index.html index.htm;
}
}
这个我是参考别人的。地址:端口是192.168.164.137:9090。参数具体干啥的,里面大部分已经写得很清楚了。
放在/etc/nginx/sites-available/目录下,其实这个放在自己的项目主目录下也挺好的,方便配置管理。放完之后最重要的一步是在/etc/nginx/sites-enabled/目录下建立一个软链接:ln –s hello.conf 刚刚配置文件的绝对路径。
截图如下:
2.重新启动nginx
3.把项目中的uwsgi.ini中,图中这一行给注释掉:
在执行uwsgi –ini uwsgi.ini启动项目。如果不注释掉,如果nginx也在用这个端口,将会导致程序两者中后者起不来。启动项目之后,访问网页
显示正常,以上三次运行我分别使用了三个端口号,但运行项目都是同一个。
这时我们可以查看nginx日志。
没问题。至此整个项目搭建完毕。
主要参考的两篇博客,感谢分享。
1. https://www.cnblogs.com/Xjng/p/aa4dd23918359c6414d54e4b972e9081.html
2. https://www.cnblogs.com/chenice/p/6921727.html