1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Django + Uwsgi + Nginx 实现生产环境部署1

Django + Uwsgi + Nginx 实现生产环境部署1

时间:2019-03-13 21:03:16

相关推荐

Django + Uwsgi + Nginx 实现生产环境部署1

项目开发完毕后,需要将代码放到服务器上,这样用户才能访问。接下来我们一步一步来进行一波部署操作。

1. 简单粗暴

项目开发完毕,在部署之前需要再配置文件中将ALLOWED_HOSTS配置设置为:当前服务器IP或*,如:

ALLOWED_HOSTS = ["*",]

代码压缩上传至服务器,

unzip wxbox.zip

cd wxbox

python3 manage.py runserver0.0.0.0:8000

如何在生产上部署Django?

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uWSGI的主要特点如下

超快的性能低内存占用(实测为apache2的mod_wsgi的一半左右)多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)详尽的日志功能(可以用来分析app性能和瓶颈)高度可定制(内存大小限制,服务一定次数后重启等)

Django框架运行依赖wsgi(本质提供socket服务端),众多模块实现了wsgi规范,而django框架中默认使用wsigiref模块来实现,他由于性能比较低,所以用于本地开发和测试,而线上部署时需要使用uwsgi来代替。

a. 在服务器上安装uwsgi

pip3 install uwsgi

b. 单文件使用uwsgi

在服务器上编写一个Python文件

# test.pydef application(env, start_response):start_response('200 OK', [('Content-Type','text/html')])return [b"Hello World"] # python3#return ["Hello World"] # python2

在服务器上执行命令启动Web服务器:

uwsgi --http :9001 --wsgi-file app.py# 或uwsgi --http :9002 --wsgi-file foobar.py --master --processes 4

PS: flask需要再加 --callable app

pip install uwsgi 之后,运行uwsgi 报错:[uwsgi: command not found]

解决方案:建立软链接

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

访问查看即可:

c. django程序使用uwsgi

将开发好的django程序拷贝到服务器目录【同示例一】,即:/data/oldboy ,执行命令启动:

uwsgi --http :9001 --module wx_project.wsgi

uwsgi --http :9005 --chdir /data/oldboy/ --wsgi-file oldboy/wsgi.py --master --processes 4

# cat myweb_uwsgi.ini[uwsgi]#socket = :8000# the base directory (full path)chdir = /srv/wx_project/# Django s wsgi filemodule= wx_project.wsgihttp=192.168.99.200:9001# process-related settings# mastermaster= true# maximum number of worker processesprocesses = 2socket= /srv/wx_project/wx_project/wsgi.sock# ... with appropriate permissions - may be needed#chmod-socket = 666# clear environment on exit#vacuum= true~

uwsgi --ini uwsgi.ini

启动方式二

项目的同级目录创建script文件,

uwsgi.ini中写入如下

启动项目

此时访问时,会出现找不到静态文件的错误。

想要uwsgi处理静态文件,需要先将django的静态文件收集到制定目录,然后再设置对应关系。

收集django静态文件

在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR,"allstatic")执行 python3 manage.py collectstatic 命令,至此django项目所有相关静态文件都会收集到制定目录。设置uwsgi静态文件对应关系

uwsgi --http :9005 --chdir /data/oldboy/ --wsgi-file oldboy/wsgi.py --master --processes 4 --static-map /static=/data/oldboy/allstatic

nginx

利用Nginx做反向代理、负载均衡以及处理静态文件。

a. 安装Nginx

yum install nginx

b. 配置nginx

/etc/nginx/conf.d

配置内容如下:server { # 这个server标识我要配置了listen 80; # 我要监听那个端口server_name 192.168.2.108 ; # 你访问的路径前面的url名称access_log /var/log/nginx/access.log main; # Nginx日志配置charset utf-8; # Nginx编码gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; # 支持压缩的类型error_page 404 /404.html; # 错误页面error_page 500 502 503 504 /50x.html; # 错误页面# 指定项目路径uwsgilocation / { # 这个location就和咱们Django的url(r'^admin/', admin.site.urls),include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间uwsgi_pass unix:/opt/proj/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他}# 指定静态文件路径location /static/ {alias /opt/proj/teacher/static/;index index.html index.htm;}}最后一步,重启nginx

/etc/init.d/nginx restart

nginx相关命令

# 启动Nginx通过Nginx访问/etc/init.d/nginx start/etc/init.d/nginx stop# 这里有个命令configtest,Nginx配置是重启生效的,如果你修改完了,不知道对 不对又担心影响其他人可以使用它测试/etc/init.d/nginx configtest# 如果是生产环境的话Nginx正在运行,就不要直接stop start 或者 restart 直接reload就行了# 对线上影响最低/etc/init.d/nginx reload

至此,Django + Uwsgi + Nginx 的生产环境部署就完成了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。