Centos7 使用uwsgi+nginx部署django

  • 安装wget用于下载python源码包
     yum install wget
  • 安装python需要的组件
    yum -y install zlib-devel bzip2-devel openssl-devel libffi-devel ncurses-devel sqlite-sevel readline-devel tk-devel gcc make sqlite-devel
  • 下载python源码包
    """
    1. 下载python源码包
    wget url
    
    2.解压源码包
    
    3.进入python目录,运行自检命令
    ./configure --prefix=/usr/local/python37
    # --prefix后面跟的是安装路径
    
    4. 安装
    make && make install
    
    5.创建快捷命令(软连接)
    ln -s /usr/local/python37/bin/python3 /usr/bin/python3
    
    6.安装虚拟环境
    yum install python-virtualenv
    
    7.创建虚拟环境
    virtualenv -p /usr/local/python37/bin/python3 ./venv/python3
    #              python所在的路径                  虚拟环境创建的路径
    
    进入虚拟环境:source python3/bin/activate
    退出虚拟环境:deactivate
    
    """
  • 安装uwsgi
    pip3 install uwsgi -i https://pypi.doubanio.com/simple
  • uwsgi配置文件
    [uwsgi]
    # 对外提供 http 服务的端口
    http = 0.0.0.0:8000
    
    #the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口
    socket = 127.0.0.1:8001
    
    # the base directory (full path) django 程序的主目录
    chdir =../zhanhong_erp
    # 指定项目的application
    module=zhanhong_erp.wsgi:application
    # Django's wsgi file
    wsgi-file =../wsgi.py
    
    # maximum number of worker processes
    processes = 100
    
    #thread numbers startched in each worker process
    threads = 10
    
    #一个高阶的cheap模式,在启动的时候只会分配n个工作进程,并使用自适应算法启动新的进程
    cheaper = 10
    
    #在经过sec秒的不活跃状态的进程会被销毁(进入了cheap模式),并最少保留cheaper指定的进程数
    idle = 3600
    
    #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况
    stats = 127.0.0.1:9000
    
    #当一个请求被harakiri杀掉会,会输出一条日志
    harakiri-verbose = true
    
    #开启内存使用情况报告
    memory-report = true
    
    #设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
    reload-mercy = 10
    
    #设置工作进程使用虚拟内存超过N MB就回收重启
    reload-on-as= 1024
    
    #自动给进程命名
    auto-procname = true
    
    #为进程指定前缀
    procname-prefix-spaced = xc-mms
    
    #设置工作进程每处理N个进程就会被回收重启
    max-requests=500000
    
    #设置工作进程使用物理内存超过N MB就回收重启
    reload-on-rss=100
    # ========================= 如果项目需要下载大文件,下载时间较长,需要将下面三个超时时间延长 =========================
    #当uwsgi和nginx配合使用时设置这个,设置socket超时时间,默认4秒
    socket-timeout=6000
    
    # 当uwsgi单独使用时或者nginx直接使用proxy方式的时候,超时时间需要配置这个
    http-timeout=6000
    
    #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
    harakiri = 6000
    # =========================================================================================================
    #限制http请求体的大小如果项目有上传文件的需求需要把这个设置相应调大(Bytes)
    limit-post=4096
    
    # clear environment on exit
    vacuum = true
    
    #不记录request日志,只记录错误日志
    disable-logging = true
    
    #将日志打印到syslog上
    #log-syslog = true
    
    # pid文件保存位置
    pidfile = uwsgi.pid
    
    # 后台运行,并输出日志
    daemonize = /var/log/zhanhong.log
    
    stats=./uwsgi.status
    uwsgi配置
    启动:uwsgi --ini uwsgi.ini
    停止:uwsgi --stop uwsgi.pid
    重启:uwsgi --reload uwsgi.pid
  • 安装nginx
    yum install nginx -y
    # =====================================全局配置====================================================
    vi /etc/nginx/nginx.conf
    
    user  nginx;
    # 进程数量
    worker_processes  4;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        # 最大连接数量
        worker_connections  4096;
    }
    
    
    http {
        include       /etc/nginx/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  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
    nginx全局配置
    # ===================================== 单项目配置 ==================================
    vi /etc/nginx/conf.d/项目名.conf
    # ============================= 正常配置 ======================================
    server {
        listen 80;
        server_name 127.0.0.1;
        access_log /var/log/nginx/access.log main;
        charset utf-8;
        gzip on;
        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;
        # 指定项目路径
        location / {
            include uwsgi_params;
            uwsgi_connect_timeout 30;
            uwsgi_pass unix;/opt/project_zhanhong/script/uwsgi.sock;
        }
        #指定静态文件路径
        location /static/{
            alias /opt/project_teacher/teacher/static/;
            index index.html index.htm;
        }
        
    }
    单项目配置
    # ===================================== 单项目配置 ==================================
    vi /etc/nginx/conf.d/项目名.conf
    # ============================= 负载均衡配置 ========================================
    upstream mywebserver {
            # 这里写服务器集群
            server 127.0.0.1:8000;
    }
    
    server {
        listen 80;
        server_name 0.0.0.0;
        charset UTF-8;
        access_log  /var/log/nginx/access.log;
        error_log   /var/log/nginx/error.log;
    
        client_max_body_size 75M;
    
        location / {
            # 解决下载大文件超时的问题
            proxy_read_timeout 6000s
            proxy_pass http://mywebserver;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    使用负载均衡的配置
    启动:systemctl start nginx.service
    停止:systemctl stop nginx.service
    重启:systemctl restart nginx.service
  • 遇到的错误1
    """
    系统启动Nginx后,报 [emerg] bind() to 0.0.0.0:XXXX failed (13: Permission denied)错误的处理方式,分为两种:
    
    第一种:端口小于1024的情况:
        原因是1024以下端口启动时需要root权限,所以sudo nginx即可。
        
    第二种:端口大于1024的情况:
        这种情况,需要如下操作:
    
        首先,查看http允许访问的端口:
        semanage port -l | grep http_port_t
        
        http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
        
        其次,将要启动的端口加入到如上端口列表中
        semanage port -a -t http_port_t  -p tcp 8090
        
    CentOS安装semanage的方法
        yum install semanage 
        如果提示:No package semanage available.使用下面方法
        
        yum provides semanage 
        执行成功之后 (提示:Filename : /usr/sbin/semanage)
        yum -y install policycoreutils-python.x86_64
        安装成功
        
    """
  • 遇到的错误2
    """
    connect() to 192.168.1.118:8888 failed (13: Permission denied)
     查看selinux是否开启,如果开启需要关闭
     
    [root@localhost ~]# getenforce 
    Enforcing
    [root@localhost ~]# setenforce 0
    [root@localhost ~]# getenforce 
    Permissive
    [root@localhost ~]# sed -i 's/(^SELINUX=).*/SELINUX=disabled/' /etc/selinux/config
    网上还有一种说法,在此记录下。执行下面的命令
    
    setsebool -P httpd_can_network_connect 1
     
    """
  • django 静态文件问题
    # 在settings中添加
    STATIC_ROOT = os.path.join(BASE_DIR, "static")
    
    # STATICFILES_DIRS必须为空否者会报错
    
    然后执行 
    python manage.py collectstatic
    这时静态文件被提取到项目根目录的 static下

    然后配置路由

    from django.views import static 
    from django.conf import settings 

    # 添加这个路由

    re_path(r'^static/(?P<path>.*)$', static.serve,
    {'document_root': settings.STATIC_ROOT}, name='static')

     
原文地址:https://www.cnblogs.com/wtil/p/13712195.html