Django项目部署

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. 环境配置

  1. python环境
    这里使用虚拟环境,关于虚拟环境这里不做详细介绍。
    1. 获取原虚拟环境中的python包列表
      pip freeze > plist.txt
      
    2. 将plist.txt与项目代码上传至服务器
    3. 创建python虚拟环境,还原python包
      mkvirtualenv 虚拟环境名称
      source /虚拟环境名称/bin/activate 	#切换至虚拟环境
      pip install -r plist.txt	
      
  2. uwsgi
    1. 安装
      pip install uwsgi
      
    2. 配置
      [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
      
    3. 运行
      uwsgi --ini uwsgi.ini
      
    4. 查看
      ps aux | grep uwsgi
      
    5. 停止
      uwsgi --stop uwsgi.pid
      
    6. 注意:当配置文件中使用的是 http=127.0.0.1:8000时,运行后就可以在浏览器中进行访问项目了,但是此时的静态文件是不能访问的
  3. Nginx
    1. 安装:看了很多的安装方式,感觉都比较麻烦,而且很容易出错,突然发现直接用apt-get居然可以安装,意不意外!
      sudo apt-get install nginx
      
    2. 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       详细版本信息,包括编译参数 
      
    3. 配置:默认配置文件路径一般在/etc/nginx/nginx.conf,可以通过nginx -t 命令找到
      1. 可以直接在默认配置文件中编写自己 的配置文件,也可以在默认配置文件目录下的子目录 conf.d 下编写单独的配置文件,因为nginx.conf中默认导入了该目录下所有的配置文件:include /etc/nginx/conf.d/*.conf;
      2. 配置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/;			#静态文件路径,任意指定,需要将静态文件收集在此目录下
        	        }
        	}
        
      3. 启动
        nginx
        
  4. 静态文件收集
    1. 在项目的配置文件中添加静态文件收集路径
    STATIC_ROOT='/var/www/myproject/static/'
    2. 执行manage.py收集静态文件
    python manage.py collectstatic
    3. 注意:执行完后在该目录下可能没有收集项目文件static下的所有文件,只有admin,不知道为啥,但是我这儿遇到了,我是直接这些文件cp过去,效果一样,没有遇到问题。

3. 负载均衡

我的理解是同一个项目使用uwsgi启动多个服务,然后使用Nginx统一代理,然后将请求分发给这些服务,默认是循环遍历服务,逐个分发,也可以指定权重。

  1. 实现
    1. 编写两个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 	#日志文件
      
    2. Nginx中使用upstream反向代理服务
        upstream myproj{
      				server 127.0.0.1:8000;		#uwsgi的启动Django项目时启动的端口
      				server 127.0.0.1:8010;		#uwsgi1的启动Django项目时启动的端口
      	}
      
    3. 启动Nginx和uwsgi
      #启动顺序没有影响
      nginx
      uwsgi --ini uwsgi.ini
      uwsgi --ini uwsgi1.ini
      
    4. 查看服务
      如图,Nginx正常启动,uwsgi和uwsgi1都正常运行
      在这里插入图片描述
    5. 查看uwsgi日志文件
      在两个终端查看便于比较
      tail -f uwsgi.log
      tail -f uwsg1.log
      
    6. 多次发起请求,比较uwsgi日志文件
      从访问时间可以看出:每次访问的uwsgi服务是交替分发的
      在这里插入图片描述

4. 总结

  1. Nginx+uwsgi+Django个人理解类似于任务管理系统。
    Nginx:即是一个用于接收任务的,然后分发任务。
    uwsgi:web服务器,用于运行Django项目
    Django:worker,用于处理任务
  2. Nginx也可以理解为一个跟高级的路由系统。
  3. Nginx+uwsgi+Django结构
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章