我可不是为了被全人类喜欢才活着的,只要|

王陸

园龄:6年11个月粉丝:2052关注:178

uWSGI+Nginx部署Django项目

第一章 WEB发展史

早期的Web Server

中期的时候

现在

第二章 uWSGI

 wsgi: Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。

简而言之就是,标准。
一个德国人和一个法国人聊天,他们要想聊天可以通过一个标准的国际语言:英语~
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 

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服务器进行交换。

常见的Python HTTP服务器:

第三章 uWSGI+Nginx+Django架构图

首先客户端请求服务资源,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来处理更加高效。

第四章 部署流程

首先,确保你已经安装好了nginx并可以正常使用,参考之前的博客https://www.cnblogs.com/wkfvawl/p/15293938.html
其次,确保自己安装完成了python,并已经完成了pip的安装。如果没有,请先安装。
接着,别忘了确认自己项目所需的django已经完成安装并正常工作。
没有的话参考以下命令安装django , 建立一个工程或利用已经写好的工程,打开浏览器,输入部署地址(如:http://127.0.0.1:8000/)(或http://内网ip:8000、或http://外网ip:8000)测试,确认是否可正常打开浏览。

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver 0.0.0.0:8000

安装uWSGI

pip install uwsgi

如果安装失败,参考:https://www.jianshu.com/p/90f453a14cb3

运行

uwsgi --http 0.0.0.0:8000 --chdir /home/project_remis/DLU_REMIS/ --wsgi-file DLU_REMIS/wsgi.py --static-map=/static=static --master --processes 4 --threads 2

--chdir是项目的绝对地址

--wsgi是Django项目wsgi.py文件的相对地址

-- static 做一个映射,指定静态文件

如果端口占用,使用

lsof -i :8000

列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序

sudo kill -9 pid

然后浏览 http://127.0.0.1:8000(或http://内网ip:8000、或http://外网ip:8000)查看效果

基于uwsgi的配置文件启动Django项目

直接在命令行启动加入环境参数,比较繁琐,可通过在配置文件中放置这些环境参数,方便启动,新建一个目录script,与本项目同级,存放uwsgi的启动文件,后续生成的日志以及进程号等。

mkdir -p /home/project_remis/script

在script目录下新建启动文件uwsgi.ini,并编辑配置

vim uwsgi.ini  

uwsgi.ini文件

复制代码
[uwsgi]
#项目目录
chdir=/home/project_remis/DLU_REMIS
#指定项目application 项目下同名目录下的wsgi.py文件
module=DLU_REMIS.wsgi
#指定sock的文件路径(nginx使用)
socket=127.0.0.1:8000
# 指定IP端口,web访问入口
# http=0.0.0.0:8000
# 进程个数
processess = 2
# 线程数
theads = 2
#指定启动时的pid文件路径
pidfile=/home/project_remis/script/uwsgi.pid
#指定ip及端口(配置nginx就不需要单独启动uwsgi需要填写)
#http=0.0.0.0:8000
#启动uwsgi的用户名和用户组
#uid=root
#gid=root
#启用主进程
master=true
# 启用线程
enable-threads=true
#自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
#设置日志目录
daemonize=/home/project_remis/script/uwsgi.log
# 日志文件的权限权限不能太低,那样的话就无法写入了。
logfile-chmod = 666 
#不记录信息日志,只记录错误以及uwsgi内部消息
disable-logging=true
复制代码

启动uwsgi服务

uwsgi --ini uwsgi.ini 

停止uwsgi服务

uwsgi --stop uwsgi.pid

配置Nginx

参考

https://blog.csdn.net/pysense/article/details/100063015

https://blog.csdn.net/wtwcsdn123/article/details/88653179

然后去配置nginx,按照源码安装的话,你就是要进入/usr/local/nginx/conf目录。然后ls你就可以看到该目录下有一个叫nginx.conf的文件。里面有一些默认的东西。现在我们就在该目录下新建一个文件nginx.conf,在这儿之前,你要先删除原有的那个文件,但是保守起见,还是将其重命名吧,使用命令:mv nginx.conf nginx.conf.bak(一个小常识,.bak文件一般都是一个副本)。

cd /usr/local/nginx/conf
mv nginx.conf nginx.conf.bak

然后新建一个配置文件

vim nginx.conf

nginx.conf文件

复制代码
# mysite_nginx.conf
worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    upstream django {
        server 127.0.0.1:8000;  # 该端口号一定要和之前uwsgi的那个文件里的socket对应的端口一致。
    }
    server {
        listen 80;
        server_name 152.136.110.161:80;  # 这儿如果你有域名的话,就将127.0.0.1:80换成你的域名,没有的话就用这个。
        charset utf-8;
        location /static {
        alias /home/project_remis/DLU_REMIS/static;  #  静态文件的路径(注意,这儿的allstatic是执行了python manage.py collectstatic之后,自动产生的一个目录,该目录下收集了你项目中所有的静态文件。其实就是将你的静态文件复制了一遍过来)
        }
        location / {
         # nginx转发动态请求到uWSGI
        include /usr/local/nginx/conf/uwsgi_params;
        uwsgi_connect_timeout 20;
        uwsgi_pass 127.0.0.1:8000;
       }
    }
}
复制代码

重新加载Nginx 运行

 cd /usr/local/nginx/sbin/
 ./nginx -s reload

然后回到项目目录下,也就是你的uwsgi配置文件所在的目录。如果你的这个配置文件在其他地方,那你就回到那个目录就可以了。使用命令如下命令启动uwsgi配置文件,

uwsgi —ini uwsgi.ini  # 保证uwsgi.ini在当前目录,不在的话,请先切换到它所在的目录。

到这里项目算是部署成功,可以正常访问了。

 

启动、停止nginx

cd /usr/local/nginx/sbin/
./nginx 
./nginx -s stop
./nginx -s quit
./nginx -s reload

./nginx -s quit:此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s stop:此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。

查询nginx进程:

ps aux|grep nginx

重启 nginx

1.先停止再启动(推荐):
对 nginx 进行重启相当于先停止再启动,即先执行停止命令再执行启动命令。如下:

./nginx -s quit
./nginx

2.重新加载配置文件:
当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx,使用-s reload不用先停止 ngin x再启动 nginx 即可将配置信息在 nginx 中生效,如下:

./nginx -s reload

 

本文作者:王陸

本文链接:https://www.cnblogs.com/wkfvawl/p/15310834.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   王陸  阅读(567)  评论(0编辑  收藏  举报
历史上的今天:
2019-09-19 Java题库——Chapter4 循环
2018-09-19 USACO 1.2.2 Transformations 方块转换
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起