• uWSGI+nginx+django+virtualenv+supervisor部署项目


    一、前言

    在部署项目前,你已有一个能够在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令。

    相关链接:

    Centos7安装python3和pip

    Centos7安装MySQL5.7(yum)

    pipreqs(找当前项目依赖的包)

    virtualenv(虚拟环境)

    二、WSGI、uWSGI、uwsgi详解

    WSGI:(Web Server Gateway Interface)服务器网关接口,是一种协议。要实现WSGI协议,必须同时实现Web服务器和Web应用,因为它描述的是Web服务器(如nginx、uWSGI等服务器)如何与Web应用(如用Django框架写的程序)进行通信。

    uWSGI:是一个Web服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把http协议转化成语言支持的网络协议。比如把http协议转化成WSGI协议,让Python可以直接使用。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

    uwsgi:是一种线路协议,并非是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型。它与WSGI相比是两样东西。

    三、uwsgi安装与基本使用

    uwsgi官网

    pip3 install uwsgi

    基本测试

    新建一个test.py:

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

    uwsgi热加载python应用程序:

    uwsgi --http :8000 --wsgi-file --py-autoreload=1 test.py

    PS:如果执行了上面命令显示 uwsgi: command not found

    则配置软链接,方便使用:

    ln -s python安装路径/bin/uwsgi /usr/bin/uwsgi
    例如我的:
    ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

    启动成功后,打开浏览器,访问"服务器公网IP:8000″(或者在本机访问""http://localhost:8000),就可以看到"Hello World"字样了。

    PS:我使用的是阿里云服务器,如果你也是;项目部署好了,在浏览器打不开的话,可以登录服务器控制台,添加安全组规则即可,具体请自行百度。

    用uwsgi启动flask

    # app.py
    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return "这是我的第一个flask程序!"
    
    if __name__ == "__main__":
        app.run()

    PS:如果是flask程序,需要再加 --callable app

    uwsgi --http :8000 --wsgi-file app.py --callable app

    用uwsgi启动django

    修改配置文件,将 ALLOWED_HOSTS 设置为:当前服务器IP或*,如:

    ALLOWED_HOSTS = ["*",]

    启动django:

    uwsgi --http :8000 --chdir /usr/local/django/mysite/ --wsgi-file mysite/wsgi.py

    根据配置文件启动

    1、创建配置文件 uwsgi.ini

    [uwsgi]
    # 指定ip端口(直接运行设置为http、用nginx则设置为socket)
    http = 0.0.0.0:8000
    # 执行项目的目录
    chdir = /usr/local/django/mysite/
    # Django的wsgi.py文件
    module = mysite.wsgi  # 相当于mysite/wsgi.py
    # 允许主进程存在
    master = true
    # 开启的进程数量
    processes = 4
    # 后台运行
    daemonize2 = true
    # uwsgi.pid文件可以用来重启和停止uwsgi服务
    pidfile = %(chdir)/uwsgi/uwsgi.pid
    # uwsgi.status可以用来查看uwsgi的服务状态
    stats = %(chdir)/uwsgi/uwsgi.status
    # 当服务器退出的时候自动清理环境 
    vacuum = true
    # 将日志打到指定的日志文件
    logto = /tmp/mysite.log
    # 虚拟环境
    home=/root/envs/pdsite

    2、根据配置文件启动(注意路径)

    # 启动
    uwsgi --ini uwsgi.ini
    # 停止
    uwsgi --stop uwsgi.pid
    # 重启
    uwsgi --reload uwsgi.pid
    # 查看uwsgi的服务状态
    uwsgi --connect-and-read uwsgi.status

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

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

    1、收集django静态文件

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

    2、设置uwsgi静态文件对应关系

    在上面的 mysite.ini 文件中加入以下配置:

    # static-map(映射一个资源到静态文件区)
    static-map = /static=/usr/local/django/mysite/allstatic

    映射媒体文件(看你需不需要配置):

    static-map = /media=/usr/local/django/mysite/media

    再次使用配置文件方式启动,所有静态文件就可以加载了。

    四、Nginx

    Nginx是一款轻量级的高性能Web服务器/反向代理服务器。我们可以利用Nginx做反向代理、负载均衡以及处理静态文件。

    安装:点击这里

    下面的所有配置都是为Django项目配置的

    uwsgi官网:使用uwsgi和Nginx设置Django和Web服务器

    配置nginx

    首先要确保你安装的Nginx中有uwsgi_params文件哦,如下;没有可以从这里获取:点我

    配置nginx.conf:

    user root;
    worker_processes 4;
    error_log /opt/nginx/logs/error.log;
    pid /var/run/nginx.pid;
    events {
        worker_connections 1024;
    }
    http {
        include            /opt/nginx/conf/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"';
        access_log          /opt/nginx/logs/access.log  main;
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
    
        # 定义负载均衡池,名字叫做django,池子中写入uwsgi发布django的socket地址
        upstream django {
            server 127.0.0.1:8001;
        }
    
        server {
            listen          80;
            server_name     www.zouxin.top;
            charset         utf-8;
            client_max_body_size 75M;
            location / {
                # nginx自带ngx_http_uwsgi_module模块,起到nginx和uwsgi交互作用
                # 通过uwsgi_pass设置服务器地址和协议,将动态请求转发给uwsgi处理
                uwsgi_pass  django;
                include     uwsgi_params;
            }
            # nginx处理静态页面资源
            location /static {
                alias /usr/local/django/mysite/allstatic;
            }
        }
    }
    View Code

    这个nginx.conf文件告诉nginx从文件系统中提供媒体和静态文件,以及处理需要django干预的请求。对于大型部署,让一台服务器处理静态/媒体文件,另一台服务器处理django应用程序,被认为是一种良好的做法,就目前而言,这样做会很好。

    部署静态文件

    在运行nginx之前,必须收集静态文件夹中的所有Django静态文件。这一步我们已经在上面完成了。

    配置uwsgi(ini文件)

    [uwsgi]
    socket = 127.0.0.1:8001
    chdir = /usr/local/django/mysite/
    module = mysite.wsgi
    master = true
    processes = 4
    daemonize2 = true
    pidfile = %(chdir)/uwsgi/uwsgi.pid
    stats = %(chdir)/uwsgi/uwsgi.status
    vacuum = true
    logto = /tmp/mysite.log
    static-map = /static=/usr/local/django/mysite/allstatic

    启动uwsgi和nginx(注意路径)

    # 启动uwsgi
    uwsgi --ini mysite.ini
    # 启动nginx
    cd /opt/nginx/sbin/
    ./nginx

    五、使用supervisor来管理process

    官方文档

    项目正式部署的时候,我们通常会将其转化为系统的守护进程,将其放到后台运行,但是其并不会为我们监控进程的运行状态,一旦进程崩溃,我们的项目就无法继续提供服务。所以我们要借助supervisor,帮助我们启动uwsgi并维护(uwsgi进程关闭时,自动将其启动起来)。

    1、安装

    yum install supervisor

    2、在/etc/supervisord.conf末尾添加上如下代码

    [program:mysite]             ; mysite是进程的名字(后面要用)
    command=/root/envs/pdsite/bin/uwsgi --ini /usr/local/django/mysite/uwsgi/uwsgi.ini ; 虚拟环境下的uwsgi,和项目uwsgi.ini文件
    priority=999                 ; 程序运行的优先级(越小越优先)
    autostart=true               ; supervisord启动时,该程序也启动
    autorestart=true             ; 异常退出时,自动重启
    startsecs=10                 ; 程序启动后持续10s后未发生异常,才表示启动成功
    startretries=3               ; 异常后,自动重启次数
    exitcodes=0,2                ; exit异常抛出的是0.2时才认为是异常
    stopsignal=QUIT              ; 用于杀死进程的信号
    stopwaitsecs=10              ; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD的时间,若超时则supervisord将使用SIGKILL杀进程 
    user=root                    ; 设置启动该程序的账号为chrism
    log_stdout=true              ; 如果为True,则记录程序日志
    log_stderr=false             ; 如果为True,则记录程序错误日志
    logfile=/var/log/cat.log     ; 程序日志路径
    logfile_maxbytes=1MB         ; 日志文件最大大小
    logfile_backups=10           ; 日志文件最大数量

    3、启动supervisor

    supervisord -c /etc/supervisord.conf

    ...

    https://www.cnblogs.com/pyyu/p/9481344.html

    ...

    ...

  • 相关阅读:
    P3916 图的遍历 题解
    NBL小可爱纪念赛「 第一弹 」 游记(部分题解)
    P4147 玉蟾宫 题解
    十、一些小例子
    九、基础正则表达式BRE
    八.linux系统文件属性知识
    七、linux目录结构知识---实战
    六、linux目录结构知识
    3.20-30岁形成好的习惯
    五、Centos linux系统优化-实战
  • 原文地址:https://www.cnblogs.com/believepd/p/10471225.html
Copyright © 2020-2023  润新知