博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django + Uwsgi + Nginx 实现生产环境部署1
阅读量:5117 次
发布时间:2019-06-13

本文共 3860 字,大约阅读时间需要 12 分钟。

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

1. 简单粗暴

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

ALLOWED_HOSTS = ["*",]

 代码压缩上传至服务器,

unzip  wxbox.zip cd wxbox
 python3 manage.py runserver
0.0
.
0.0
:
8000
  

 

如何在生产上部署Django?

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

uwsgi介绍

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

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

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

 

uWSGI的主要特点如下

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

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 的生产环境部署就完成了

 

转载于:https://www.cnblogs.com/weidaijie/p/10497341.html

你可能感兴趣的文章
CallContext类
查看>>
linux基础进阶命令详解(输出重定向、输入重定向、管道符、通配符、三种引号、软连接、硬链接、根“/”、绝对路径vs相对路径)...
查看>>
android px dx 转换
查看>>
Grevl旅游注册的初步界面,以源代码和运行图片展示
查看>>
大学英语四听说文本
查看>>
Codeforces Round #344 (Div. 2) A. Interview 水题
查看>>
python 爬虫 处理超级课程表传输的数据
查看>>
Linux netlink之添加一个简单协议
查看>>
20165322 实验三 敏捷开发与XP实践
查看>>
组合数学公式
查看>>
fcntl函数用法——操纵文件描述符状态
查看>>
php-超全局变量
查看>>
C++ queue
查看>>
还是畅通工程
查看>>
Alpha阶段敏捷冲刺(五)
查看>>
MySql5.7忘记root密码重置|开机启动|访问权限
查看>>
【转载】数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
查看>>
mac Python 安装相关库
查看>>
8. Actor-Critic、DDPG、A3C
查看>>
hbase shell command
查看>>