Django——项目部署(uWSGI+django+nginx)

关于 django ,uWSGI 与nginx的基本认识

  • django: 一个基于python的开源web框架,请确保自己熟悉它的框架目录结构。
  • uWSGI:一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关
  • nginx:常用高性能代理服务器
  • wsgi.py:django项目携带的一个wsgi接口文件

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服务器进行交换。
##项目流程
首先客户端请求服务资源,
nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
wsgi将返回值进行打包,转发给uWSGI,
uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换

作用:
  1. 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
  2. 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
  3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
  4. django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。

安装与配置

  • 确保你的django项目能够正确启动

保证你的项目已经可以正确的运行,即能够以 python manage.py runserver 0.0.0.0:8000方式启动且服务正常
打开浏览器,输入部署地址(如:http://127.0.0.1:8000/)(或http://内网ip:8000、或http://外网ip:8000)测试,确认是否可正常打开浏览。


  • 安装uWSGI

sudo pip install uwsgi
测试uWSGI: 新建文件test.py,写入以下内容

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

运行
sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
如果端口占用,使用
lsof -i :8000
列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序
sudo kill -9 pid
然后浏览 http://127.0.0.1:8000(或http://内网ip:8000、或http://外网ip:8000)查看效果,有”Hello World”输出即安装成功。

  • 安装nginx服务

sudo apt-get install nginx
使用nginx -v查看nginx版本,使用nginx -t查看nginx配置路径及检测语法错误

nginx -t
nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful

里面说明了nginx默认配置文件的路径是:/etc/nginx/conf/nginx.conf;

然后,确保nginx.conf的同目录下有uwsgi_params文件(/etc/nginx/conf/uwsgi_params),没有的话根据链接获取, 后面要用到。

django + uWSGI 服务搭建
  • 检查项目的setting文件中是否配置了 STATIC_URL 与 STATIC_ROOT
    static_url 是项目静态文件的在网址中的体现,它是定义了静态文件访问的路径
    static_root 是项目静态文件在磁盘上的位置体现,他是定义了静态文件存放的位置
  • 上传项目至服务器,并执行python manage.py collectstatic 收集静态文件(即将项目中的静态文件统一收集到static_root指定的目录下)
  • 进入项目根目录,创建ini文件,我这里就直接创建 uwsgi.ini 了,名字没有要求。
    为省事,以下uwsgi相关文件直接配置在项目根目录下,开发环境不要这样做,配置中的pidfile等最好指定存放路径
[uwsgi]
#socket = 127.0.0.1:8000 		# 使用nginx连接时使用,Django程序所在服务器地址
http = 192.168.252.123:8000		# uwsgi 直接做http服务器时使用
chdir=/opt/web_project/			# 项目的根路径
wsgi-file=web_demo/wsgi.py		# 项目的wsgi文件 与chdir拼接在一起即wsgi的完整路径 
processes=2						# 启用的进程数 不要大于你的cpu核心数
threads=2						# 启用的线程数
master=True						# 启用主进程
max-requests=2000				# 最大连接数
pidfile=uwsgi.pid				# 存放进程编号的文件,根据此文件停止,重启uwsgi
daemonize=uwsgi.log				# 日志文件
# 静态文件映射,不配置这个你的项目可能无法正确寻找到静态文件
static-map=<与static_url保持一致>=<与static_root保持一致>
# virtualenv=<你的虚拟环境路径>
# uid=root 用户名
# gid=root 用户组
  • 使用uWSGI启动项目
    到这里你就不需要使用python manage.py runserver这个命令了,直接使用uwsgi来控制
    启动: uwsgi --ini ‘配置文件路径’
    停止: uwsgi --stop ‘uwsgi.pid文件路径’
    重新加载: uwsgi --reload ‘uwsgi.pid文件路径’
    **如果你的项目有了静态文件的更改,千万记得重新collectstatic,然后reload一下。
    **详细配置参考博客园:Ju6y
nginx+uWSGI+django
  • uWSGI + NGINX 反向代理
    • uwsgi 配置 socket 连接
    • nginx配置location设置uwsgi接入
    • nginx配置设置静态文件路由
  • uWSGI + NGINX 分布式集群
    • uwsgi 配置 http 接入
    • nginx 配置upstream选项,收集所有分布主机 ip:port
    • nginx 配置location接收url转发给upstream

下面将此项目以 uWSGI + NGINX 反向代理模式部署

在自己的工程目录下,建立如project_test.conf的配置文件;复制nginx.conf里面全部的内容,全部写入project_test.conf中(为方便放在项目目录下,开发环境不要这样做)。
然后按照下面写的,把project_test.conf配置文件中的server段部分全部替换掉。

server {
    listen 80;						# 监听的端口
    server_name localhost;			# 虚拟域名(即你访问到此的url)
    charset     utf-8;				# 编码
    access_log      /opt/nginx/nginx_access.log;		# 日志文件(访问)
    error_log       /opt/nginx//nginx_error.log;		# 日志文件(错误)
    client_max_body_size 75M;							# 上传文件大小(根据需要配置)
    # 路由配置 
    # 假设你的static_url是 /static/ 你就配一个/static的路由指向静态文件
    location /static {
        alias /opt/web_project/projects_static;
    }
	# 根路由配置
    location / {
        include     /etc/nginx/conf/uwsgi_params;
        uwsgi_pass  127.0.0.1:8000;
    }
}

对于以上配置的详细解释:

  • listen 80 代表监听服务器开放80端口;
  • location [目录名] 代表项目路径的引导,即路由;
  • access_log 和error_log是定义nginx访问日志和错误日志的存放路径。
  • location /static 中的 /static 是自己定义的项目引用静态文件时,浏览器中显示的静态资源所在的根目录名;这样的话,用户在浏览器中查看到的所有image、css或js资源都是处在http://127.0.0.1/static下的。
    django静态文件的绝对路径是根据自己的实际情况来确定的,一般在自己的django的app名/static目录下,或自己python manage.py collectstatic后的路径下。
  • location / 是指访问项目根目录时,nginx要做的事。其中需要指定 uwsgi_params文件的绝对路径,上面已经提到了;如果还有media文件之类的静态目录,仿照static的写法,自己补充。
  • 127.0.0.1:8000是指uWSGI绑定的监听地址,这里使用了8000端口。
  • 需要注意的是,请确认自己django的静态文件目录所有者是www用户,如果不是,请用以下命令更改静态目录权限归属者:
    sudo chown -R www:www /opt/web_project/

nginx 与 uWSGI 对接

对于上一步的 uwsgi.ini 文件我们要做一点修改

[uwsgi]
socket = 127.0.0.1:8000
chdir=/opt/web_project/
wsgi-file=web_demo/wsgi.py
master = true         
processes=2
threads=2
max-requests=2000
chmod-socket=664
daemonize=uwsgi.log

其中的socket字段值”127.0.0.1:8000”必须要和上面写的project_test.conf配置文件中的uWSGI监听地址完全一样;

启动uWSGI
sudo uwsgi --ini uwsgi.ini
启动nginx
如果出现
nginx: [emerg] open() "/**/**/**/mime.types" failed (2: No such file or directory)
检查一下 include mime.types,改成绝对路径

如果nginx已经开启,先关闭nginx(service nginx stop或nginx -s stop),再执行以下命令:
nginx -c project_test.conf
这里的-c 表示加载配置文件启动

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ubuntu是一个自由开源的操作系统,其中有很多的工具和服务可以用于搭建与开发Web应用。其中,常用的Web应用栈是使用Nginx作为Web服务器,UWSGI作为应用程序服务器,Django作为Web框架,MySQL作为关系型数据库。 要安装和配置这些服务,需要进行以下步骤: 1. 安装Ubuntu操作系统,可以选择最新版本的Ubuntu LTS或者最新的Ubuntu发行版。 2. 安装Nginx服务,并配置Nginx服务器来处理并转发HTTP请求。这里可以使用apt-get install命令来安装Nginx包。 3. 安装UWSGI服务,并配置UWSGI服务器来处理Django应用程序。这里可以使用pip install命令来安装UWSGI包。 4. 安装Django,并编写一个基本的Django应用程序。然后配置UWSGI服务器以运行Django应用程序。可以使用pip install命令来安装Django包。可以使用此教程 - https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html 5. 安装MySQL数据库服务,并配置MySQL服务器以使用Django应用程序。可以使用apt-get install命令来安装MySQL包。 6. 在Django应用程序中配置MySQL数据库连接参数,并创建 MySQL数据库及表。 7. 配置Nginx服务器以使用UWSGI服务器来处理Django应用程序。可以使用上面的教程来完成这一步骤。 8. 启动NginxUWSGI服务器,并测试Django应用程序是否可以访问。 在进行以上的步骤时,需要注意安全措施,防止 Web 应用程序被攻击和入侵。同时,也需要进行充分的测试,保证 Web 应用程序的稳定性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值