美文网首页
django项目基于nginx + uwsgi阿里云线上部署经验

django项目基于nginx + uwsgi阿里云线上部署经验

作者: 叶情宇 | 来源:发表于2020-04-22 16:22 被阅读0次

    当我第一次接触python的时候,就会联想项目如何部署,最简单的就是用django做了一个简单的demo项目,学习了django的用法之后,我就迫不及待的研究线上部署,十分猴急,担心费半天劲开发的项目部署不上去完蛋了,我这个人的性格就是想得比较远
    平常我们使用django开发项目的时候使用一下命令启动django自带的服务器

    python3 manage.py runserver [端口号]
    

    这是我们的django为了方便我们开发,给我提供的简单服务器,当我们真正项目开发完成之后,部署到线上服务器,比如阿里云,不建议还以这样的方式启动服务器,首先是太low,另外对多线程高并发和静态文件等支持不好,性能上不推荐这么做,但是这个有个优点就是方便,当你更改了代码之后,不需要重启服务器,会自动为你加载,所以说这个服务器只适用本地电脑开发阶段使用,推荐nginx反向代理加uwsgi来部署项目

    1. 三者之间的关系图

    image.png

    那么问题来了,这三者在一起的工作原理是什么?
    1. 一般来说,客户端发起的http/https请求首先到达了我们的Web服务器(在这里我们使用Nginx作为我们的服务器)。
    2. Web服务器收到请求后,对请求进行解析处理(一般来说如果是静态请求,直接返回静态页面(纯HTML页面)),然后将请求发送给uWSGI。
    3. uWSGI对来自Nginx的请求进行处理,将处理后的结果发送给Web应用框架(在这里我们使用Django)。
    4. Web应用框架收到请求之后,Web应用对请求进行处理(例如,Django通过某个函数进行处理),将结果返回给uWSGI。
    5. uWSGI收到Web应用框架的处理结果后,对该结果进行处理打包,发送给Web服务器。
    6. Web服务器将收到的结果返回给客户端。
    这三者之间信息的传递涉及到数据格式以及协议的转换。

    2.开始部署项目

    我这里简单创建了一个django项目,命名haomai,简单做了个模板加载和model创建,在开发电脑上django自带的服务器上运行正常,现在我准备部署到我的阿里云服务器,我的服务器是centos7

    2.1软件准备

    1.安装nginx
    2.安装mysql
    3.安装python3(centos7默认自带python2,我喜欢3,在安装个python3)
    原先我是做php的,其实我的服务器之前我已经安装过了nginx和mysql,我用的宝塔面板可视化安装的,非常方便,具体的安装步骤我就不给大家说了,安装教程百度一大把,确保这两个软件安装成功即可,下面我直接说python3的安装步骤,我写这篇文章的内容不是交大家如何安装软件,是对我遇到的坑给大家做个总结,希望能帮到大家

    2.2 python3安装步骤

    前提通过ssh登录进入你的远程服务器,具体 ssh root@xxxxxx
    1.安装相应的编译工具
    在root用户下(不要用普通用户,麻烦),全部复制粘贴过去,一次性安装即可.

    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
    yum install -y libffi-devel zlib1g-dev
    yum install zlib* -y
    

    2.下载安装包
    我指定下载到/usr/local目录下,先cd /usr/local,这个路径随意,你想放哪就放哪
    这里我安装的python版本号是3.8.2

    wget wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
    

    3.解压

    tar -xvJf  Python-3.8.2.tar.xz
    

    4.创建编译安装目录

    mkdir /usr/local/python3 
    

    5.安装

    cd Python-3.8.2
    ./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl 
    #第一个指定安装的路径,不指定的话,安装过程中可能软件所需要的文件复制到其他不同目录,删除软件很不方便,复制软件也不方便.
    #第二个可以提高python10%-20%代码运行速度.
    #第三个是为了安装pip需要用到ssl,后面报错会有提到.
    make && make install
    

    我这一步是按照失败的,具体原因是我的gcc版本太低,是4.几的,是不支持 --enable-optimizations的,gcc8以上版本修复了这个问题,所以我的解决方案就是升级gcc版本,你若是安装成功了,就跳过下面gcc升级步骤

    6.升级gcc

    sudo yum install centos-release-scl
    sudo yum install devtoolset-8-gcc*
    scl enable devtoolset-8 bash
    which gcc
    gcc --version
    

    我们在执行上面5步骤,这样就会安装成功,到此为止,我们python3 安装完成

    7.创建软链接

    ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
    ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
    

    8.验证是否成功

    python3 -V
    pip3 -V
    

    2.3导出项目依赖

    我们本地电脑开发的时候安装了很多第三方软件,当我们部署到远程服务器的时候我们也得需要这些软件,比如pymysql等,我们有两个方法安装

    1.在远程服务器上一个一个通过pip3 install xxxx安装
    2.导出依赖txt文件,通过txt文件一口气安装
    这里我们大家肯定倾向第二种方法,简单省力,我个人的习惯是把依赖文件导出放到我的项目根目录,这样这个文件就不会丢,我部署服务器喜欢使用git传输部署,你也可以使用filezilla,只要把项目传到远程服务器即可

    导出导入步骤如下

    1.先cd到项目根目录(我是想把这个txt放在项目根目录)
    2.pip3 freeze > requirements.txt #导出
    3. pip3 install -r requirements.txt #导入
    

    这样我们就会在远程服务器安装我们的依赖软件,比如我们的uwsgi就会安装成功

    2.4配置uwsgi

    先给uwsgi创建软连接,要不然找不到uwsgi

    ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
    

    在项目wsgi.py同级目录下创建uwsgi.ini文件,添加如下配置

    
    #ini file
    [uwsgi]
    # Django-related settings
    #这里我使用9999端口,8000端口被django自带的服务器占用了,您随意
    socket  = 127.0.0.1:9999
    #sock是项目自动生成的,直接指定生成的路径即可,当然要和Nginx配置文件的相同
    
    #经验证可以写相对路径,这样有个好处就是本地电脑和线上服务器不用来回切换全路径
    chdir      = ../
    
    # Django s wsgi file
    #haomai是项目名,可以ls检查看看
    module     = haomai.wsgi:application
    
    # process-related settings
    # master
    master     = true
    # maximum number of worker processes
    processes    = 2
    
    workers = 4
    
    # clear environment on exit
    vacuum     = true
    
    chmod-socket = 755
    
    thunder-lock = true
    
    harakiri = 30
    
    post-buffering = 4096
    
    pidfile=  uwsgi.pid
    
    daemonize   = ../uwsgi_log.log
    
    

    现在我们启动uwsgi
    在uwsgi.ini目录下执行以下命令
    启动之后会在同目录下生成uwsgi.pid文件,具体文件名称和目录是上面配置文件中pidfile项配置的

    #启动
    uwsgi --ini uwsgi.ini
    #停止
    uwsgi --stop uwsgi.pid
    #刷新重载
    uwsgi --reload uwsgi.pid
    

    想查看uwsgi运行状态,执行以下查看

    ps gux | grep uwsgi
    

    在上面的我们的配置文件中有两个选项daemonize和pidfile都会生成文件,由于我本地电脑也搭建了此环境,当我在本地运行的时候,在上传到远程git 会把这两个文件提交上去,远程服务器也会生成这两个文件,这样有时拉去代码会发生冲突,我的习惯是gitignore文件中忽略此文件,之前我没有忽略,引起了远程服务器uwsgi.pid的内容跟当前启动的进程号对不上的情况,我是重启远程服务器得以解决

    2.5 配置nginx服务器

    nginx反向代理服务器和uwsgi是通过socket通信的,找到nginx的配置文件,配置如下

    server {
        listen      8080;
        #server_name www.ziqiangxuetang.com;
        charset     utf-8;
     
        client_max_body_size 75M;
     
        location /static {
            alias /Users/shuaijiguang/Documents/项目仓库/我的项目/Django学习/haomai/haomai/static;
        }
     
        location / {
            uwsgi_pass  127.0.0.1:9999;
            include     /Applications/MAMP/conf/nginx/uwsgi_params;
        }
    }
    

    若你不知道uwsgi_params在什么地方,你可以通过以下命令查找到具体在什么地方

    find / -name uwsgi_params
    

    3. 404页面配置

    django为我们提供了非常方便的方法,我们只需要在项目根目录创建个templates文件中放入一个404.html模板文件即可,django会在找不到路由的情况的自动加载此模板,但是还得在setting.py配置下templates目录,要不然找不到,如下配置DIRS,(只有在debug = False正式环境下才会生效)


    image.png

    4.修改django配置

    上线前我们需要把setting.py中的debug = True 改为debug = False,同事添加允许访问的域名

    DEBUG = True
    ALLOWED_HOSTS = ['*']
    

    5.导出静态文件
    我们上传到远程服务器需要导出静态文件,同样在setting.py设置导出路径

    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
    

    然后运行一下命令

    python3 manage.py collectstatic
    

    这样就会把我们在开发环境使用的静态文件导入到了项目根目录一个static文件夹下面

    注意

    我们上线时候,需要在远程服务器mysql中创建一个该项目的数据库,记得一定做迁移,无非也就是下面两个命令

    python3 manage.py makemigrations
    python3 manage.py migrate
    

    我们后台的超级用户也需要重新创建,该用户是保存在数据库中的

    python3 manage.py createsuperuser
    

    还有一点就是数据库配置中HOST 一定写上127.0.0.1,不要写localhost,我这边写localhost在我的mac环境中没有问题,在远程阿里云是连接不上,具体原因还不清楚,以后有时间在查下

    基本上我们的服务器上面部署差不多了,我们通过git 提交到远程,然后创建个tag v0.0.1版本,代表上下发布的,然后通过远程服务器拉去,切换到当前的v0.0.1tag,重启uwsgi,不出意外你就部署完成了

    坚持一个原则

    1.更改django文件,想要看到效果,一定重启uwsgi,一定,一定,重要事情说三遍
    2.更改nginx配置文件重启nginx
    以上是我自己一点一点实践出来的,问题也在上面总结了,后来在社区发现一个部署文章,基本和我流程一致,推荐给大家,供大家参考 https://www.django.cn/article/show-4.html

    相关文章

      网友评论

          本文标题:django项目基于nginx + uwsgi阿里云线上部署经验

          本文链接:https://www.haomeiwen.com/subject/nobbihtx.html