Django部署至LIUNUX环境

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

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. 高度可定制(内存大小限制,服务一定次数后重启等)

uwsgi中文文档
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/

uwsgi参数详解
http://uwsgi-docs.readthedocs.org/en/latest/Options.html

uwsgi安装使用

pip install uwsgi
uwsgi --version # 查看 uwsgi 版本

基本测试,项目下创建test.py

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

运行如下命令

uwsgi --http :8000 --wsgi-file test.py

用uwsgi 启动django

uwsgi --http :8000 --module mysite.wsgi
mysite是项目下名称,对应的mysite下的wsgi.py文件
在浏览器内输入:http://127.0.0.1:8000,查看是否有"Hello World"输出,若没有输出,请检查你的安装过程

将参数写进配置文件中

[root@linux03 conf]# cat uwsgi.ini 
[uwsgi]
#socket = 127.0.0.1:9000
http = :9000    #启动端口,对外提供服务
chdir = /data/develop/devops/    #项目地址
socket = /data/develop/devops/conf/uwsgi.sock
touch-reload = /data/develop/devops  #项目地址
#wsgi-file = devops/wsgi.py   
module = devops.wsgi   #项目对应名称下的wsgi文件
master = true
processes = 4
threads = 2
enable-threads = True
max-requests = 2000
vacuum = true
daemonize = /data/develop/devops/logs/uwsgi.log   # 日志文件
stats = 127.0.0.1:9001
post-buffering = 65535
buffer-size = 65535
harakiri-verbose = true
harakiri = 300
#uid = nginx
pidfile = /data/develop/devops/conf/uwsgi.pid   # pid文件

启动

/usr/local/python3/bin/uwsgi --ini /data/develop/devops/conf/uwsgi.ini

  • 此处启动是由python3下的uwsgi文件和自定义配置的uwsgi.ini存放的目录
  • 如果没有故障或者其他的报错
(py3-env) [root@linux03 develop]# netstat -lntp |grep uwsgi
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      25945/uwsgi         
tcp        0      0 127.0.0.1:9001          0.0.0.0:*               LISTEN      25945/uwsgi 

nginx配置

  • 默认配置文件如下:
[root@linux03 conf]# cat nginx.conf
#user  nobody;
#user nginx;
worker_processes  1;

error_log  /usr/local/nginx/logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /usr/local/nginx/run/nginx.pid;
worker_rlimit_nofile 50000;

events {
    use epoll;
    worker_connections  30000;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$request_time" ';

   log_format  wapanal  '[$remote_addr] [$remote_user] [$time_local] "[$request]" '
                          '[$status] [$body_bytes_sent] "[$http_referer]" '
                          '["$http_user_agent]" "[$http_x_forwarded_for]" "[$request_time]" ';

    access_log  /usr/local/nginx/logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
	
    server_tokens off;
    server_name_in_redirect off;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    

    include /usr/local/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
	    add_header Access-Control-Allow-Origin *;
	    add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
	    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
  • 在conf目录下新建conf.d目录,新增配置文件如:uwsgi.conf
[root@linux03 conf.d]# cat uwsgi.conf
server {
        listen       80;
        server_name  localhost;
	charset utf-8;

	location ^~ /devops/ {
          include  uwsgi_params;
	  uwsgi_pass 127.0.0.1:9000;
	  #uwsgi_pass unix:/data/develop/devops/conf/uwsgi.sock;
	  uwsgi_param UWSGI_SCRIPT devops.wsgi;  # 对应项目下的wsgi
          uwsgi_param UWSGI_CHDIR /data/develop/devops/;  # 项目目录
          proxy_redirect off;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	  client_max_body_size 75M;
		
	}
	location ^~ /admin/ {
	  proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
	}	
	location ~/static/ {     # 加载静态文件
            alias /data/develop/devops/;
	    break;
        }
}

  • 启动nginx
  • 若没有其他的报错信息,访问127.0.0.1:80,则有nginx默认欢迎页面
  • 127.0.0.1:9000 则显示hello world 页面

django安装配置静态static

pip install django

  • 进入项目目录,做如下配置
cat devops/settings.py
ALLOWED_HOSTS = ["*"]

STATICFILES_DIRS = (
   os.path.join(BASE_DIR,'static'),
    )
  • django默认管理后台会有如css,js等样式文件,如果不加static目录配置,则会丢失等情况的发生
  • static则是直接在项目目录下创建的如:
(py3-env) [root@linux03 devops]# ls
conf  devops  logs  manage.py  rbac  static  templates  test.py
  • 启动之后,django默认admin后台的css等样式会自动拷贝到
    /data/develop/devops/static目录下

  • 至此已安装配置完毕,祝你好运!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值