zoukankan      html  css  js  c++  java
  • Centos7 使用uwsgi+nginx部署django

    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 
    • 下载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')

       
      复制代码
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    DevExpress中设置PanelControl背景的方法
    ArcEngine选中面要素样式修改
    DEV winform treelist设置背景图像
    React-Native运行知乎日报遇到的问题
    winform程序自动升级
    jquery图片轮播效果(unslider)
    Orchard搜索与索引
    网络版会飞的小鸟
    jQuery event的复制粘贴的坑
    记一次有趣的互联网事件及console.log~
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/14026963.html
Copyright © 2011-2022 走看看