欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django部署

程序员文章站 2022-06-11 11:35:05
...

nginx+uwsgi+supervisor+ubuntu部署Flask项目:
https://mp.weixin.qq.com/s/xrFNAvRCDIiLdXg-p_DZkw

centos7-下通过nginx-uwsgi部署django项目:
http://projectsedu.com/2017/08/15/centos7-下通过nginx-uwsgi部署django应用/

  • 在开发机上的准备工作
  1. 确认项目没有bug

  2. 用pip freeze > requirements.txt将当前环境包导出到requirements.txt文件中,方便在部署的时候安装;
    后期拿到requirements.txt文件在待部署的环境下执行pip install requirements.txt就能将前期环境的包安装完成。(即完成环境搭建)

  3. 使用Git将项目上传到服务器上:

    git init
    git remote add origin https://gitee.com/fone933/deploy_test.git
    git add .
    git commit -m 'first commit'
    git pull origin master --allow-unrelated-histories
    git push origin master
    

pip install xxx出现SSLError
使用豆瓣源安装:pip install -i https://pypi.doubanio.com/simple/ virtualenv

yum命令执行30行报错SyntaxError
原因: yum包管理是使用python2.x写的,将python2.x升级到python3.x以后,由于python版本语法兼容性导致问题出现
解决办法:
修改yum配置文件,将python版本指向以前的旧版本
vim /usr/bin/yum
#!/usr/bin/python2.7


  • 在服务器上的操作(Ubuntu上使用apt命令安装,centos使用yum命令):
  1. 安装好项目用到的python版本
    yum install -y python
    yum install -y python-pip
    pip install --upgrade pip
  2. 安装virtualenv以及virutalenvwrapper并创建虚拟环境:
    pip install virtualenv
    pip install virtualenvwrapper
    yum -y install vim
    vim ~/.bashrc
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
  3. 安装git:
    yum -y install git
  4. 允许远程连接安装OpenSSH:
    yum -y install openssh-server openssh-client
    service ssh restart
  5. 安装MySQL服务器和客户端:
    yum install -y mysql-server mysql-client
    yum install libmysqld-dev
  6. 进入虚拟环境中,然后进入到项目所在目录,执行命令pip install -r requirements.txt安装相应的包。
  7. 在mysql中创建相应的数据库;
  8. 执行python manage.py migrate命令将迁移文件映射到数据库中,创建相应的表。
  9. 设置ALLOW_HOST为当前机器IP或域名。
  10. 执行python manage.py runserver 0.0.0.0:8000,然后在本机浏览器中输入http://服务器IP:8000访问下网站所有页面,确保所有页面都没有错误。
  11. 设置DEBUG=False,避免如果网站产生错误而将错误信息暴露给用户。
  12. 收集静态文件:python manage.py collectstatic
  • centos7防火墙开放端口:

firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --reload

  • 安装uwsgi:用于加载非静态文件
  1. uwsgi是一个应用服务器,非静态文件的网络请求就必须通过他来完成,他也可以充当静态文件服务器,但不是他的强项。uwsgi是使用python编写的,因此通过pip install uwsgi就可以安装。(必须安装在系统级别环境下)
  2. 使用命令uwsgi --http :8000 --module [项目名].wsgi --virtualenv=/root/.virtualenvs/django-env-py2。用uwsgi启动项目,如果能够在浏览器中访问到这个页面,说明uwsgi可以加载项目。

编写uwsgi配置文件:
在项目路径下创建 .ini 文件(如 obj_uwsgi.ini),写入一下配置:

```
[uwsgi]
; Django项目路径,必须全部用绝对路径
chdir           = /root/commit/deploy_test
; Django的.wsgi文件
module          = dobj.wsgi
; python虚拟环境路径
home            = /home/.virtualenvs/py2-env
; 指定端口,如果配置了socket就不用指定http
; http           = :8000
; 主进程
master          = true
; 最大数量的工作进程
processes       = 10
; socket文件路径,绝对路径
socket          = /root/commit/deploy_test/dobj.sock
; 设置socket的权限
chmod-socket    = 666
; 退出时是否清理环境
vacuum          = true
; 表示注释
```

注意如果Nginx报权限不足无法连接socket文件,检查一下socket文件及其所在目录的权限。
然后使用命令uwsgi --ini obj_uwsgi.ini看看是否还能启动项目。

  • 安装Nginx:用于加载静态文件
  1. Nginx是web服务器,用来加载静态文件和接收http请求。通过命令yum -y install nginx安装。
  2. Nginx常用命令:
    service nginx start 启动Nginx
    service nginx stop 关闭Nginx
    service nginx restart 重启Nginx
  • 收集静态文件:
    静态文件应该让Nginx来加载。首先确保setting.py文件中有配置STATIC_ROOT,这个配置用于指定静态文件要放在哪个目录下。执行python manage.py collectstatic来收集所有静态文件,将静态文件放在指定的目录(STATIC_ROOT)下。

  • 编写Nginx配置文件:
    在/etc/nginx/conf.d目录下,新建一个文件(obj.conf),然后写入配置信息:

    # 配置与uwsgi同步的socket文件
    upstream dobj {
        server unix:///root/commit/deploy_test/dobj.sock;
    }
    
    # 配置服务器
    server {
        # 监听的端口
        listen 80;
        # 允许访问的IP、域名
        server_name 192.168.1.6;
        charset utf-8;
        # 最大可上传多大的文件
        client_max_body_size 75M;
        # 静态文件访问Url
        location /static {
            # 静态文件地址
            alias /root/commit/deploy_test/static_dist;
        }
        # 配置发送所有静态文件请求到Django服务器
        location / {
            uwsgi_pass dobj;
            # Nginx下uwsgi_params地址
            include /etc/nginx/uwsgi_params;
        }
    }
    
    • 注意:uwsgi与Nginx是通过socket进行通信。配置文件中指定的.sock文件会自动创建,两者中的配置文件指定的套接字文件必须一致。
    • 写完配置文件后,为了测试配置文件是否设置成功,运行命令:service nginx configtest,如果返回Ok则说明没有问题。
    • 每次修改完配置文件,都要运行service nginx restart

  • 使用supervisor管理uwsgi进程:
    使用supervisor管理uwsgi,可以在uwsgi发生意外挂掉时自动重启。
  1. supervisor安装在系统级别环境:
    python2版本安装:pip install supervisor
    注意:supervisor默认安装(pip install supervisor)无法正常安装在python3环境中,因为默认supervisor只能运行在python2版本下,此时要用以下命令安装python3版本下的supervisor 4.0.0:
    pip install -i https://pypi.doubanio.com/simple/ git+https://github.com/Supervisor/supervisor

  2. 在项目的根目录下创建supervisor配置文件.conf(obj_supervisor.conf),编写一下配置信息:

    #  supervisor的程序名
    [program:dobj]
    # supervisor执行的命令
    command=uwsgi --ini obj_uwsgi.ini
    # 项目的目录
    directory = /root/commit/deploy_test
    # 开始的时候等待多少秒
    startsecs=0
    # 停止的时候等待多少秒
    stopwaitsecs=0
    # 自动开启
    autostart=true
    # 程序挂了后自动重启
    autorestart=true
    # 输出的log日志
    stdout_logfile=/root/commit/deploy_test/log/supervisord.log
    # 输出的错误日志
    stderr_logfile=/root/commit/deploy_test/log/supervisord.err
    
    [supervisord]
    # log的级别
    loglevel=info
    
    # 使用supervisorctl的配置
    [supervisorctl]
    # 使用supervisorctl登录的地址和端口号
    serverurl = http://127.0.0.1:8000
    # 登录supervisorctl的用户名和密码
    username = admin
    password = 123
    
    [inet_http_server]
    # supervisor的服务器
    port = 0.0.0.0:8000
    # 用户名和密码
    username = admin
    password = 123
    
    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
    
  • 注意:这里指定的log和错误文件中的log目录要自行创建。

    然后使用supervisor运行uwsgi:supervisord -c supervisor.conf

  • 使用supervisorctl管理supervisord:supervisor是一个C/S模型,跟redis一样,有一个服务器,也有一个客户端命令用来管理服务的,使用以下命令进入到命令界面:
    supervisorctl -c supervisor.conf

  • 指定的文件必须和supervisord服务端保持一致。 一些常用的命令有:
    supervisorctl -c supervisor.conf

status # 查看状态
start program_name # 启动程序
restart program_name # 重新启动程序
stop program_name # 停止程序
reload # 重新加载配置文件
quit # 退出当前的客户端

页面返回502 Bad Gateway表示Nginx可以正常运行,但是uwsgi挂掉了。