• 20_django项目的部署和总结


    django项目部署 使用uwsgi + nginx 实现django项目的部署

    一、Django配置

    1.settings.py配置

    复制全局settings.py配置文件(或者直接修改),创建一个名为deploy_settings.py的副本,修改DEBUG

    =False。

    DEBUG = False
    
    # 填写你自己的ip和域名   # 注意,这里要写上允许谁访问的ip地址,不然就访问不了,踩了个大坑,长记性了
    ALLOWED_HOSTS = ["yan.long920.cn", "localhost", "127.0.0.1", '112.74.160.252']
    

    2.wsgi.py配置

    修改settings.py同目录下的wsgi.py文件

    import os
    
    from django.core.wsgi import get_wsgi_application
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tznewblog.deploy_settings')
    
    application = get_wsgi_application()
    

    二.生成requirement.txt文件

    # 在xshell中生成requirements.txt文件(将项目中安装的包,存放到requirements.txt文件中)
    
    pip freeze > requirements.txt
    

    三. 上传代码到服务器

    四、 安装requirements.txt 对应的包

    安装包之前先创建一个虚拟环境
    pip install -r requirements.txt

    五. uwsgi的安装和测试

    # 进入到虚拟环境  安装uwsgi
    workon dj_pro
    pip install uwsgi
    

    测试uwsgi是否安装成功文件代码:

    # 测试py文件
    # test_uwsgi.py
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"] # python3
        #return ["Hello World"] # python2
    

    运行uwsgi:

    uwsgi --http :8101  --wsgi-file test_uwsgi.py
    

    测试uwsgi是否运行正常:

    curl 127.0.0.1:8101
    
    # 如下就是正常的
    [root@zhenzi0322 ~]# curl http://127.0.0.1:8101
    Hello World[root@zhenzi0322 ~]#
    

    六. uwsgi 文件配置

    1. uwsgin_conf.ini文件代码 在项目根目录中创建deploy目录,新建uwsgi_conf.ini文件。

    [uwsgi]
    # ip和端口
    # nginx连接
    socket=127.0.0.1:8101
    #http=127.0.0.1:8101            # socker 和 http 两者只能设置一个, 如果设置的是http, 那么此时在服务器上curl http://127.0.0.1:8101   就能够接收到返回结果, 如果是socker的话,那么还需要搭配nignx来使用
    #http=0.0.0.0:8101
    
    # 指定项目的根目录
    chdir=/home/cheng/django_deploy/tznewblog/
    
    # 项目中 wsgi.py 文件的相对目录,相对于项目根目录
    wsgi-file=tznewblog/wsgi.py
    
    # 进程数
    processes=1
    
    # 线程数
    threads=1
    
    # uwsgi服务器角色
    # 这里设置为主
    master=True
    
    # 存放进程编号的文件
    pidfile=uwsgi.pid
    
    # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见,以前的runserver是依赖终端的
    # 记得在当前目录下创建logs文件夹
    daemonize=logs/uwsgi.logs
    
    # 指定虚拟环境所在目录,绝对路径
    virtualenv=/home/cheng/.virtualenvs/cheng_dj_deploy
    

    2.uwsgi的运行及停止

    # 启动uwsgi
    uwsgi --ini uwsgi_conf.ini
    
    # 停止uwsgi
    uwsgi --stop uwsgi.pid
    
    

    七、直接在服务器上安装nginx (后面会介绍在docker中安装和启动)

    1. 安装

    # 安装nginx
    sudo apt-get update
    sudo apt-get install nginx
    
    # nginx 安装后一般自动启动
    sudo service nginx status  # 查看nginx状态
    
    # 默认开启80端口,可以查看一下是否提供web服务
    curl -I 127.0.0.1
    
    

    2. nginx命令 (使用管理员权限)

    1. 启动nginx:  nginx
    2. 停止nginx: nginx -s stop
    3. 重新加载nginx配置文件(一般修改nginx配置文件的时候用):  nginx -s reload
    # 一般我就用上面这几个命令
    
    dongcheng@long:~$ sudo nginx -h
    nginx version: nginx/1.15.5 (Ubuntu)
    Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
    
    Options:
      -?,-h         : this help
      -v            : show version and exit
      -V            : show version and configure options then exit
      -t            : test configuration and exit
      -T            : test configuration, dump it and exit
      -q            : suppress non-error messages during configuration testing
      -s signal     : send signal to a master process: stop, quit, reopen, reload
      -p prefix     : set prefix path (default: /usr/share/nginx/)
      -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
      -g directives : set global directives out of configuration file
    
    

    3.除了nginx本身提供的命令,我们还可以通过信号控制nginx

    # 1. QUIT: 优雅的关闭进程,即等请求结束后再关闭
    # 2. HUP: 改变配置文件,平滑的重读配置文件
    # 3. USR1: Reopen the log files 重读日志,在日志按月/日分割时有用
    # 4. USR2: Upgrade Executable on the fly 平滑的升级
    # 5. WINCH: Gracefully shutdown the worker processes 优雅关闭旧的进程(配合USR2来进行升级)
    # 一般情况下只会用到QUIT 和 HUP
    
    使用方法: 首先要知道nginx的进程号, (所以可能还是nginx本身提供的命令好用)
    ps -aux|grep nginx     # 查nginx 的进程号,  比如 nginx 的进程号为4873
    具体语法:
    kill -信号选项 nginx的主进程号
    kill -HUP 4873          # 相当于nginx -s reload
    kill -quit 4873
    kill -9 4873
    
    # 可能通过查看nginx.pid来获得nginx的进程号,从而省去ps -aux|grep nginx查找nginx进程号的步骤
    kill -信号控制 `cat /run/nginx.pid`     # nginx的pid进程号一般存放在这里
    kill -USR1 `cat /run/nginx.pid`
    dongcheng@long:/run$ sudo kill -hup `cat nginx.pid`
    
    
    

    4. 关于更多nginx知识

    1. nginx介绍
    • Mainline version 开发版
    • Stable version 稳定版
    • Legacy version 历史版本

    安装好nginx后,查看nginx版本: nginx -v

    2. nginx安装目录
    路径 类型 作用
    /etc/nginx /etc/nginx/nginx.conf
    /etc/nginx/conf.d /etc/nginx/conf.d/default.conf
    /etc/nginx/sites-available
    /etc/nginx/sites-enabled
    配置文件 nginx主配置文件
    /etc/nginx/fastcgi_params
    /etc/nginx/scgi_params
    /etc/nginx/uwsgi_params
    配置文件 fastcgi 、scgi 、 uwsgi配置文件
    /etc/nginx/win-utf
    /etc/nginx/koi-utf
    /etc/nginx/koi-win
    配置文件 nginx编码转换映射文件
    /etc/nginx/mime.types 配置文件 htttp协议的Content-Type与扩展名
    /usr/lib/systemd/systemd/nginx.service 配置文件 配置系统守护进程管理器
    /etc/logrotate.d/nginx 配置文件 nginx⽇志轮询,⽇志切割
    /usr/sbin/nginx
    /usr/sbin/nginx-debug
    命令 nginx终端管理命令
    /etc/nginx/modules
    /usr/lib/nginx 可能也为/usr/lib64/nginx
    /usr/lib/nginx/modules
    目录 nginx模块目录

    /usr/share/nginx
    /usr/share/html
    /usr/share/html/index.html
    /var/www/html/
    目录 nginx默认站点目录
    /var/log/nginx 目录 nginx的日志目录
    /run/nginx.pid 文件 nginx 运行的端口号
    3. nginx编译参数

    查看nginx编译参数 命令:nginx -V

    4. HTTP 状态码
    • 301 永久移动。被请求的资源已被永久移动到指定位置
    • 302 请求的资源现在临时从不同的URL响应请求
    • 305 使用代理。被请求的资源必须通过指定的代理才能被访问
    • 307 临时跳转。被请求的资源在临时从不同的URL响应请求
    • 400 错误请求
    • 402 需要付款。该状态码是为了将来可能的需求而预留的,用于一些数字货币或者是微支付
    • 403 禁止访问。服务器已经理解请求,但是拒绝执行它
    • 404 找不到对象。请求失败,资源不存在
    • 406 不可接受的
    • 408 请求超时
    • 409 冲突。由于和被请求的资源的当前状态之间存在冲突,请求无法完成
    • 410 遗失的。被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址
    • 413 响应实体太大。服务器拒绝处理当前请求,请求超过服务器所能处理和允许的最大值
    • 417 期望失败。在请求头Expect中指定的预期内容无法被服务器满足
    • 418 我是一个茶壶。超文本咖啡罐控制协议,但是并没有被实际的HTTP服务器实现
    • 420 方法失败
    • 422 不可处理的实体。请求格式正确,但是由于含有语义错误,无法响应
    • 500 服务器内部错误。服务器遇到了一个未曾预料的头部,导致了它无法完成对请求的处理
    • 502 请求后端失败
    • 504 请求成功,但是影响超时
    5. nginx 主配置文件

    nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

    小知识
    1. 动态查看日志 fail -f /var/log/nginx/access.log # 使用fail命令来查看

    八、django项目的nginx配置文件

    1. 创建/etc/nginx/conf.d/nginx_uwsgi.conf文件:
    # 我的nginx_uwsgi.conf配置
    upstream chengBlog {
        # 此处为uwsgi运行的ip地址和端口号
        server 127.0.0.1:8101;
    }
    
    server {
        # 监听端口
        listen      80;
    
        # 服务器域名或者ip地址
        server_name yan.long920.cn 112.74.160.252 localhost;
    
        # 编码
        charset     utf-8;
    
        # 文件最大上传大小
        client_max_body_size 75M;
    
        # 媒体文件
        location /media  {
            alias //home/cheng/django_deploy/tznewblog/media;
        }
    
        # 静态文件
        location /static {
            alias //home/cheng/django_deploy/tznewblog/static;
        }
    
        # 主目录, 交给uwsgi处理, nginx 只处理静态文件目录
        location / {
            uwsgi_pass  chengBlog;
            include    /www/server/nginx/conf/uwsgi_params;
        }
    }
    
    
    1. 如果如果出现静态文件无法访问: 即出现: 403 Forbade 的形式
      修改sudo vim /etc/nginx/nginx.conf
      第一行开头修改用户,将www-data改为你当前的用户
    # 在我ubuntu 中:
    # user www-data
    user pyvip;
    
    # 在centos7中:
    # user www www
    user root
    
    
    1. 查看nginx 配置文件是否正确(查看有无语法错误)
    # sudo nginx -t -c /etc/nginx/nginx.conf
    sudo nginx -t   # 一般我使用这条命令
    # 打印如下内容,则没问题
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    # 重新加载配置
    # sudo nginx -s reload -c /etc/nginx/nginx.conf
    sudo nginx -s reload    # 一般我使用这条命令, 这两条命令都应该是加不加参数都无所谓
    
    

    centos7 下创建用户部署django项目

    1. 创建 cheng 这个用户并为其设置密码:
    useradd cheng -g root -m   # 创建cheng用户
    password cheng             # 为cheng 设置密码
    
    su cheng     # 切换到cheng用户
    
    
    1. 为 cheng 添加 sudo 权限(在root用户下完成)
      若执行sudo命令的用户没有sodu权限,则会报以下错误:
      cheng is not in the sudoers file.This incident will be reported

    准备工作:

    ls -l /etc/sudoers 查看文件权限
    chmod u+w /etc/sudoers 修改文件权限为可编辑
    
    
    # 首先切换为root用户
    su root
    
    # 修改sudoers文件
    vim /etc/sudoers
    # 找到:  root All=(ALL)   ALL      这一行, 在下一行添加上相应的用户即可
    ## Allow root to run any commands anywhere;  若要给cheng用户增加sudo权限,需要增加如下一行
    root    ALL=(ALL)       ALL
    cheng   ALL=(ALL)       ALL
    
    
    

    修改完成后,记得将文件权限改回只读:

    chmod u-w /etc/sudoers 修改文件权限为只读
    ls -l /etc/sudoers 查看文件权限
    
    

    至此就为 cheng 这个用户添加上了sudo权限, 该用户可以使用sudo 来提升至管理员权限了

    搭建 cheng 用户的虚拟环境

    workon
    mkvirtualenv
    ...
    此时你会发现在root用户下管用的这几个命令在cheng这个用户下是找不到的(提示你没有命令没找到),      # 刚创建好的这个用户是没有: workon mkvirtualenv 等命令的, 还需要我们去配置
    
    
    1. 去编辑 ~/.bashrc 在最后添加上这几句话 # 家目录下的这一隐藏文件
    export WORKON_HOME=$HOME/.virtualenvs
    export PROJECT_HOME=$HOME/workspace
    source /usr//bin/virtualenvwrapper.sh         # 注意 virtualenvwrapper.sh 的位置, 有可能不是这个位置
    
    # find / -name virtualenvwrapper.sh     # 查找virtualenvwrapper.sh 这个文件的位置
    
    
    1. 编辑上述文件并保存好后,运行如下命令使配置立即生效:
    source ~/.bashrc
    
    

    此时, 再输入 workon 等命令就可以了

    创建 cheng 用户的 python3 虚拟环境

    mkvirtualenv -p python3 cheng_py3
    
    

    至此剩下的步骤都是一样的了

  • 相关阅读:
    字节跳动总监知乎5716赞的Java开发笔记
    刚面完阿里Java高级岗40K的offer,这些技术你必须要掌握!
    HDOJ 1253 胜利大逃亡(bfs)
    swjtu 1962 A+B(模拟)
    swjtu 2213 A Game About Cards(模拟题)
    HDU 1544 Palindromes(回文子串)
    第八章 异常控制流
    第四讲 深入介绍信号与槽
    第三讲 对话框的创建
    第二讲 窗口部件的布局与通信
  • 原文地址:https://www.cnblogs.com/nichengshishaonian/p/11522789.html
Copyright © 2020-2023  润新知