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

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

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.py
def 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 file
module          = wx_project.wsgi
http=192.168.99.200:9001
# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 2

socket= /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; # 错误页面

# 指定项目路径uwsgi
location / { # 这个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 的生产环境部署就完成了

 

posted @ 2019-03-08 17:55  离人怎挽_wdj  阅读(247)  评论(0编辑  收藏  举报