• django+uwsgi+python3+nginx 部署项目


    写在前面

    之前项目要部署到线上,采用py3 + django + uwsgi + nginx 的组合,折腾了半天才搞定,写下此文留作笔记

    安装nginx

    1. yum install epel-release
    2. yum -y install nginx
    3. systemctl disable firewalld
    4. 修改selinux的配置文件 /etc/sysconfig/selinuxSELINUX=disabled 并关闭防火墙
    5. nginx的启动:nginx
    6. nginx重新加载文件启动: nginx -s reload
    7. nginx的配置文件位置:/etc/nginx
    8. nginx开机自启动:systemctl enable nginx

    安装django + uwsgi

    1. pip3 install django
    2. pip3 install uwsgi
      注意: 如果服务器上安装了py2,并pip install uwsgi,此时uwsgi uwsgi.ini默认使用的是py2, 而项目是py3编写的,会报什么no app load类似错误,所以我的做法是创建一个软连接
      ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3

    安装py3

    首先安装依赖包

    yum -y install wget
    yum -y groupinstall "Development tools"
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    
    wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
    mkdir /usr/local/python3 
    tar -xvJf  Python-3.6.2.tar.xz
    cd Python-3.6.2
    ./configure --prefix=/usr/local/python3
    make && make install
    mv /usr/bin/python /usr/bin/python2.7.5
    ln -s /usr/local/python3/bin/python3 /usr/bin/python
    ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
    vi /usr/bin/yum
    把#! /usr/bin/python修改为#! /usr/bin/python2.7.5
    

    uwsgi 启动django项目

    在django项目和manage.py的同目录下创建uwsgi.ini,内容如下

    [uwsgi]
    http = :8001
    #the local unix socket file than commnuincate to Nginx
    socket = 127.0.0.1:9002
    # the base directory (full path)
    chdir = /root/wang/smsc
    # Django's wsgi file
    wsgi-file = SMSC/wsgi.py
    # maximum number of worker processes
    processes = 4
    #thread numbers startched in each worker process
    threads = 2
     
    
    daemonize = /data/logs/uwsgi/uwsgi9002.log
    #monitor uwsgi status
    stats = 127.0.0.1:9191
    # clear environment on exit
    vacuum = true
    

    其中http设置的8001,是wsgi启动django的http端口,通过该端口可以访问django项目,但是静态页面是找不到的,可以通过配置找到静态页面,再次不做太多描述
    socket设置的9002是本地socket端口,用于和nginx进行通信

    cd /root/wang/smsc
    uwsgi3 uwsgi.ini
    

    nginx和uwsgi配合使用

    第一步先把/etc/nginx目录下的 uwsgi_params 移动到和项目manage.py 同级目录下
    第二步是编写自己的nginx配置文件,文件名自取

    upstream django {
        # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
        server 127.0.0.1:9002; # for a web port socket (we'll use this first)
    }
     
    # configuration of the server
    server {
        # the port your site will be served on
        listen      8002;
        # the domain name it will serve for
        server_name smsc.example.com; # substitute your machine's IP address or FQDN
        charset     utf-8;
     
        # max upload size
        client_max_body_size 75M;   # adjust to taste
     
        # Django media
        location /media  {
            alias /path/to/your/mysite/media;  # your Django project's media files - amend as 
    required
        }
     
        location /static {
            autoindex on;
            alias /root/wang/smsc/static/; # your Django project's static files - amend as req
    uired
        }
     
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include   /root/wang/smsc/uwsgi_params; # the uwsgi_params file you installed
        }
    }
    

    对于配置文件,有如下几个需要注意的点:

    1. server 127.0.0.1:9002 中的 9002 端口对应 wsgi 的 socket 端口
    2. server设置的 listen 8002 就是web的http绑定的端口,其中的8002 和uwsgi设置的http端口不要一致
    3. location /static 设置的 alias /root/wang/smsc/static/, 最后需要有/,没有nginx静态文件就会找不到
    4. 在django的 settings.py 里面加上STATIC_ROOT = os.path.join(BASE_DIR, "static/") ,这里我的静态文件目录是statics,`STATICFILES_DIRS = [os.path.join(BASE_DIR, 'statics')], static 和 statics 必须是不同的,否则会报错
    5. python manage.py collectstatic
    6. 把静态文件拷贝到 /etc/nginx/conf.d
    7. 运行uwsgi3 uwsgi.ini
    8. 运行 nginx -s reload
  • 相关阅读:
    都说程序员钱多空少,程序员真的忙到没时间回信息了吗?
    C/C++知识分享: 函数指针与指针函数,看完这篇你还能不懂?
    C++的那些事儿:从电饭煲到火箭,C++无处不在
    年薪90万程序员不如月入3800公务员?安稳与高收入,到底如何选择?
    【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
    C语言既有高级语言又有低级语言的特点,但为什么它不是低级语言呢?
    【C++学习笔记】看完这篇,C++ 的链接问题不怕你搞不明白!
    既然C++这么难学,为什么还有人“自讨苦吃”?
    编程语言这么多,为什么就只有C 语言能一直得到 SQLite 的青睐?
    初学者疑惑:C语言中,函数反复调用会有什么问题?
  • 原文地址:https://www.cnblogs.com/longyunfeigu/p/9187271.html
Copyright © 2020-2023  润新知