Nginx+uwsgi+Django实现简单的项目部署
自己看了很多Nginx+uwsgi相关配置的教程,但是总是不明白各个配置的用意所在。这里简单总结自己的理解,以及简单的实现。
1. 创建项目
在开始前首先要保证项目能正常运行,这里我创建了一个简单的Django项目,只有一个视图,页面效果如图。
index.html
<html>
<head>
<title>第三方包</title>
</head>
<body>
<h1>第三方包</h1>
<hr>
<h1>布署</h1>
<img src="/static/image/mv.jpg"/>
</body>
</html>
注意:静态文件的路径采用静态访问方式:
访问方式为:127.0.0.1:8000/static/image/mv.jpg
2. 环境配置
- python环境
这里使用虚拟环境,关于虚拟环境这里不做详细介绍。- 获取原虚拟环境中的python包列表
pip freeze > plist.txt
- 将plist.txt与项目代码上传至服务器
- 创建python虚拟环境,还原python包
mkvirtualenv 虚拟环境名称 source /虚拟环境名称/bin/activate #切换至虚拟环境 pip install -r plist.txt
- 获取原虚拟环境中的python包列表
- uwsgi
- 安装
pip install uwsgi
- 配置
[uwsgi] # 配合Nginx使用 socket=127.0.0.1:8000 #直接作为web服务器使用 #http=127.0.0.1:8000 #项目的绝对路径 chdir=/home/shu/Desktop/ProjectDeploy/ProjectDeployment #项目中wsgi.py,相对路径 wsgi-file=ProjectDeployment/wsgi.py processes=4 threads=2 master=True pidfile=uwsgi.pid #日志文件 daemonize=uwsgi.log #python虚拟环境路径,一般可以不写 virtualenv=/home/shu/Desktop/ProjectDeploy/venv
- 运行
uwsgi --ini uwsgi.ini
- 查看
ps aux | grep uwsgi
- 停止
uwsgi --stop uwsgi.pid
- 注意:当配置文件中使用的是 http=127.0.0.1:8000时,运行后就可以在浏览器中进行访问项目了,但是此时的静态文件是不能访问的
- 安装
- Nginx
- 安装:看了很多的安装方式,感觉都比较麻烦,而且很容易出错,突然发现直接用apt-get居然可以安装,意不意外!
sudo apt-get install nginx
- Nginx常用命令,亲测可用!
nginx -c filename #指定配置文件,也可以直接使用nginx命令使用默认配置文件 nginx -s quit 优雅停止nginx,有连接时会等连接请求完成再杀死worker进程 nginx -s reload 优雅重启,并重新载入配置文件nginx.conf nginx -s reopen 重新打开日志文件,一般用于切割日志 nginx -v 查看版本 nginx -t 检查nginx的配置文件 nginx -h 查看帮助信息 nginx -V 详细版本信息,包括编译参数
- 配置:默认配置文件路径一般在/etc/nginx/nginx.conf,可以通过nginx -t 命令找到
- 可以直接在默认配置文件中编写自己 的配置文件,也可以在默认配置文件目录下的子目录 conf.d 下编写单独的配置文件,因为nginx.conf中默认导入了该目录下所有的配置文件:include /etc/nginx/conf.d/*.conf;
- 配置Nginx
upstream myproj{ server 127.0.0.1:8000; #uwsgi的启动Django项目时启动的端口 server 127.0.0.1:8010; #uwsgi的启动Django项目时启动的端口 } server { listen 80; #Nginx监听端口,用于访问Nginx server_name 127.0.0.1; #访问Nginx的地址,用于访问Nginx location / { include /etc/nginx/uwsgi_params; #uwsgi_pass 127.0.0.1:8000; #直接指定被代理的服务器地址 uwsgi_pass myproj; #寻找upstream指定多个被代理服务器地址,实现负载均衡 } location /static { alias /var/www/myproject/static/; #静态文件路径,任意指定,需要将静态文件收集在此目录下 } }
- 启动
nginx
- 安装:看了很多的安装方式,感觉都比较麻烦,而且很容易出错,突然发现直接用apt-get居然可以安装,意不意外!
- 静态文件收集
1. 在项目的配置文件中添加静态文件收集路径
STATIC_ROOT='/var/www/myproject/static/'
2. 执行manage.py收集静态文件
python manage.py collectstatic
3. 注意:执行完后在该目录下可能没有收集项目文件static下的所有文件,只有admin,不知道为啥,但是我这儿遇到了,我是直接这些文件cp过去,效果一样,没有遇到问题。
3. 负载均衡
我的理解是同一个项目使用uwsgi启动多个服务,然后使用Nginx统一代理,然后将请求分发给这些服务,默认是循环遍历服务,逐个分发,也可以指定权重。
- 实现
- 编写两个uwsgi配置文件
区别如下,其他配置相同#uwsgi.ini socket=127.0.0.1:8000 pidfile=uwsgi.pid #关闭时使用的文件 daemonize=uwsgi.log #日志文件 #uwsgi1.ini socket=127.0.0.1:8010 pidfile=uwsgi1.pid #关闭时使用的文件 daemonize=uwsgi1.log #日志文件
- Nginx中使用upstream反向代理服务
upstream myproj{ server 127.0.0.1:8000; #uwsgi的启动Django项目时启动的端口 server 127.0.0.1:8010; #uwsgi1的启动Django项目时启动的端口 }
- 启动Nginx和uwsgi
#启动顺序没有影响 nginx uwsgi --ini uwsgi.ini uwsgi --ini uwsgi1.ini
- 查看服务
如图,Nginx正常启动,uwsgi和uwsgi1都正常运行
- 查看uwsgi日志文件
在两个终端查看便于比较tail -f uwsgi.log tail -f uwsg1.log
- 多次发起请求,比较uwsgi日志文件
从访问时间可以看出:每次访问的uwsgi服务是交替分发的
- 编写两个uwsgi配置文件
4. 总结
- Nginx+uwsgi+Django个人理解类似于任务管理系统。
Nginx:即是一个用于接收任务的,然后分发任务。
uwsgi:web服务器,用于运行Django项目
Django:worker,用于处理任务 - Nginx也可以理解为一个跟高级的路由系统。
- Nginx+uwsgi+Django结构