美文网首页服务器开发djangopython
Django+Ubuntu WEB部署(超详细版)

Django+Ubuntu WEB部署(超详细版)

作者: 煮茶忘放糖 | 来源:发表于2017-04-17 13:00 被阅读2236次

    2017年12月4日教程更新,请移步至最终版本:Django快速部署简约版 v3.0

    不推荐阅读以下文章!


    一、环境介绍

    • 服务器:Ubuntu 16.04 for 阿里云
    • 数据库:MySQL 5.7.17
    • Python 3.6.0 + Django 1.10.6

    二、准备工作

    1.更新系统:

    sudo apt-get update
    sudo apt-get upgrade
    

    提示:安装时出现的选择项按自己实际情况选择,这里不做过多阐述,实在看不懂,自行谷歌翻译。

    2.安装SSH(Git默认安装了):

    sudo apt-get install ssh
    

    提示:本人的项目是通过FileZilla Client直接上传的。
    有兴趣的可以看看教程:FTP使用教程之Filezilla使用教程

    3.命令行查看自己的公网IP地址:

    ifconfig
    

    提示:得到网卡信息,这里的IP为192.168.0.154,得到IP后,可以使用Filezilla连接服务器上传文件。这里先搁置不用管。


    网卡信息

    三、安装MySQL:

    1.安装命令:

    sudo apt-get install mysql-server
    

    提示:安装过程中会提示让你设置MySQL密码 ,输入两次密码,回车即可,然后等待安装完成

    设置MySQL密码

    2.查看MySQL版本:

    mysql --version
    

    提示:输出结果为:5.7.17,事实上Mysql 5.7.6或更高版本,数据目录将自动初始化,这一点大部分教程都没有提及。所以这里我们不用初始化。


    查看Mysql版本

    3.运行数据库Mysql安全配置向导:

      sudo mysql_secure_installation
    

    提示:输入Mysql密码


    输入root密码:

    提示:是否设置验证密码,输入 n


    是否设置验证密码,输入 n

    提示:是否修改Mysql密码,输入 n


    是否修改MySQL密码,输入 n

    提示:是否移除匿名用户,输入y


    是否移除匿名用户,选y

    提示:是否允许远程登陆,如果选n的话,只能在本机访问数据库,根据情况来,本人数据库和项目都在一个服务器上,为了安全考虑,这里我设置关闭,输入n


    设置关闭,输入 n

    提示:是否移除test数据库,输入y


    是否移除test数据库,选y

    提示:是否重新加载权限表,输入y


    是否重新加载权限表,选y

    注意:如果出现这种错误:

    [error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)']

    它表明你的Mysql服务,并没有开启!输入下列命令开启即可:

    sudo service mysql start 
    

    sudo表明以管理员权限执行,教程:如何启动/停止/重启MySQL

    4.配置Mysql默认字符集

    提示:此时当前目录为根目录,进入 /etc/mysql/,打开 my.cnf。

    不太熟悉vi命令的同学看这里:linux下vi命令大全

    cd /etc/mysql/
    vi my.cnf
    

    按一下 i 代表输入操作,填入以下代码:

    [client]
    port = 3306
    socket = /var/lib/mysql/mysql.sock
    default-character-set=utf8
    
    [mysqld]
    port = 3306
    socket = /var/lib/mysql/mysql.sock
    character-set-server=utf8
    
    [mysql]
    no-auto-rehash
    default-character-set=utf8
    

    提示:编辑完成后按一下键盘 ESC 输入:wq,代表保存退出,然后重启mysql服务使其生效:

    sudo service mysql restart
    

    5.创建网站的数据库:

    提示:进入mysql shell:

    mysql -uroot -p
    

    提示:输入Mysql密码,登陆即可,如图所示登录无问题:

    登陆成功界面

    提示:接下来创建数据库并指定编码方式为UTF-8(其中dataname 为数据库名称,保证与Django连接数据库名称一致,否则连接会出错):

     CREATE DATABASE `dataname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    提示:数据库操作基本命令:

    SHOW DATABASES; #显示所有数据库
    USE <NAME>;   #进入某数据库 
    SHOW TABLES; #显示所有数据表
    SELECT * FROM <NAME>; #查询表内容
    

    多余的不说了,忘记的看看:mysql基本操作命令汇总

    退出命令:quit 退回根目录 :cd


    四、安装配置Python环境:

    提示:一般默认自带python2.7+3.5,我们使用的环境是python3.6.

    1.安装python-dev包:

    sudo apt-get install python-dev
    

    2.安装或升级pip :

    安装:

    sudo apt-get install python-pip
    

    升级:

    sudo pip install --upgrade pip
    

    3.更换pip源

    提示:因为国内使用默认的pip源速度很慢,所以需要更换,在用户根目录下新建 .pip 目录,在该目录下新建pip.conf文件。

    sudo mkdir ~/.pip
    sudo vi ~/.pip/pip.conf
    

    填入:

    [global]
    index-url = http://mirrors.aliyun.com/pypi/simple/
    
    [install]
    trusted-host=mirrors.aliyun.com
    

    2.安装Python 3.6

    安装之前,我们需要给默认的Python2.7安装pymysql+Django库,因为后面会出错就是因为未安装这两个库!

    pip install pymysql==0.7.10
    pip install django==1.10.6
    

    注意 :提醒在 /etc/ 目录下下载安装,因为解压到哪里就安装到哪里!!!
    安装教程:如何在Ubuntu和LinuxMint上安装Python 3.6.0

    提示:如果下载速度太慢,就看上面的 FileZilla 教程,自己下载好压缩包上传上去,再解压安装。
    比如我这种速度,直接CTRL+Z退出


    比如我这种速度,直接CTRL+Z退出

    3.安装虚拟环境,我们在这里淘汰virtualenv。

    提示:因Python3+自带虚拟环境,更简单好用,所以没必要再装一个。
    在home目录下创建名称为vcmt的虚拟环境。

    python3.6 -m venv /home/vcmt
    

    激活虚拟环境:

    source /home/vcmt/bin/activate  
    

    退出命令:

    deactivate
    

    进入成功:


    进入成功

    五、安装Django等所有在原开发环境中依赖的库:

    --配置两台机器上相同的扩展库环境:

    --第一步,在已配置好的机器上使用

    pip freeze > requirements.txt
    

    --生成扩展库信息列表;

    --第二步,把生成的requirements.txt文件复制到目标机器上的python安装目录中scripts子目录(没有该目录也不要紧,就放在root目录下);

    --第三步,在目标机器上执行pip install -r requirements.txt,读取文件requirements.txt中的扩展库信息并在本机进行安装。

    这里我们利用 FileZilla Client把文件上传上去,并且把Django项目丢上去。
    我的目录一般/home/
    教程:阿里云服务器ECS连接 Linux 实例

    注意:上传项目文件后把 /项目名/app名/migrations/ 下的类似00.. 的记录文件删除,有几个删除几个,但是不要删除别的文件。

    Paste_Image.png

    这是在本地进行数据同步时产生的记录文件,由于我们并不是转移的数据库,所以要删除旧的记录,后面会再同步!

    pip list 显示所有已安装库

    干货来了!!!###

    关于Django项目静态文件的说明:

    开发环境中静态文件设置:

    部署前的设置(网站换成你自己的,或者是公网IP):

    settings.py部署前的设置 settings.py部署前的设置

    一般在开发环境中: 即settings.py中的DEBUG = True 时 , Django 会自动帮助我们处理静态文件,所以不用操心静态文件404的问题,但是在部署时,出于安全考虑,我们必须关闭DEBUG!保证自己网站的信息不泄露。只是当DEBUG关闭后,Djang就不会帮我们处理静态文件了,所以会出现样式丢失,静态文件404问题。

    1.MEDIA_ROOT:媒体文件,所有上传的文件。示例:图像,文件
    2.STATIC_ROOT 在开发过程中无用,只需要部署。
    在开发中,STATIC_ROOT什么都不做。你甚至不需要设置它。Django在每个应用程序目录(myProject/appName/static)中查找静态文件,并自动提供。
    当你的项目部署时,事情有所不同。很可能你将使用Django提供动态内容,Nginx将提供静态文件。为什么?因为Nginx的效率非常高,并且会减少Django的工作量。
    这时候STATIC_ROOT才有用,因为Nginx不知道你的django项目,不知道在哪里找到静态文件。
    所以你设置STATIC_ROOT = '/some/folder/', 并告诉Nginx寻找静态文件/some/folder/。然后运行manage.py collectstatic,Django将会从所有应用程序复制静态文件/some/folder/。
    3.STATICFILES_DIRS : 静态文件的额外目录
    STATICFILES_DIRS用于包含要查找的其他目录。例如,默认情况下,Django无法识别/myProject/static/。所以你可以把它设置一下。
    基本介绍到此,如果还有问题,可以联系我,我不介意为你解答疑惑。


    注意:这里可以看到我的静态文件是放在 APP(blog)下的,*.html引用方式:

    {% load staticfiles %}  #引用静态文件目录 放在HTML头部
    {% static 'css/bootstrap.min.css' % } #引用静态文件
    
    我的项目结构

    后面会同步静态文件!所以不用担心admin样式问题。


    Django项目配置

    安装好Django等必须库后,进入Django项目下,同步并创建数据库,执行:

    python manage.py makemigrations
    python manage.py migrate
    

    注意:如果出错了,首先检查models.py 里面是不是有什么错误,包括在第一行设置UTF-8编码方式,因为我发现它有时也会出现这种问题!再检查settings.py 关于连接部分的设置对不对,最后检查是不是3306端口没打开!一般都是这几个问题。

    建立后台超级用户:

    python manage.py createsuperuser
    

    启动自带的服务器,测试是否可以正常运行!(此时settings.py 中的DEBUG = False)输入:

    python manage.py runserver 0.0.0.0:8000
    
    静态文件成功的复制到项目下的自定义静态文件夹下了,所以没有出现404错误!

    至于样式为什么没应用,是因为Django已经不管静态文件了,我们要让nginx处理 静态文件!往后看!

    启动时错误总结!

    这是端口被占用的问题,可以输入 sudo fuser -k 8000/tcp ,杀死与端口8000相关联的所有进程即可。

    如果出现响应时间过长或者拒绝访问,浏览器按F12,查看network,按一下F5刷新一次,出现 ...ERRO NET... 什么的,就是端口未开启,用手机在ECS里配置安全组,增加一个8000配置即可!

    电脑手机均可配置,自己找找。

    电脑上的:

    Paste_Image.png Paste_Image.png

    点击公网入方向 添加安全组规则,参照它自己生成的那样配置即可。

    Paste_Image.png

    接下来同步静态文件:

    先退出django启动的服务,CTRL + C 强制退出!

    python manage.py collectstatic
    

    此时项目下的settings.py 中的STATIC_ROOT 后面的文件夹应该是'static' .

    下面是手动部署方法,如需要一键部署脚步请移步:
    Django + uwsgi + nginx 一键部署脚本


    六、uWSGI的安装

    1.安装:

    sudo pip install uwsgi
    

    启动测试:

    uwsgi --http :8000  --chdir /home/nocmt/ -w nocmt.wsgi
    

    启动测试,应该可以正常访问了。

    2.uWSGI的配置

    首先建立一个配置目录及文件:

    sudo mkdir -p /etc/uwsgi/sites
    cd /etc/uwsgi/sites
    

    在里面建立以自己项目名命名的配置文件:

    sudo vi nocmt.ini
    

    填入以下内容:你只需要改project和Base,一个项目名称,一个项目路径。

    [uwsgi]
    project = nocmt
    base = /home
    
    chdir = %(base)/%(project)
    module = %(project).wsgi:application
    home =  %(base)/vcmt
    
    master = true
    processes = 5
    
    socket = %(base)/%(project)/%(project).sock
    chmod-socket = 666
    vacuum = true
    

    现在建立一个自启脚本:

    sudo vi /etc/init/uwsgi.conf
    

    内容如下 setuid的值改为你的项目名:

    description "uWSGI application server in Emperor mode"
    
    start on runlevel [2345]
    stop on runlevel [!2345]
    
    setuid nocmt
    setgid www-data
    
    exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
    

    最后一个问题,www-data 用户组没有创建。


    七、反向代理:Nginx的安装和配置

    1.安装

    sudo apt-get install nginx
    

    2.创建配置文件

    sudo vi /etc/nginx/sites-available/nocmt
    

    提示:填写内容如下(server_name为被解析域名,如果暂时没有域名那就填公网IP,Django项目settings.py中的,静态文件夹地址一定要填对,否则样式会出错!):

    提示:简洁版:

    server {
        listen 80;
        server_name nocmt.com;
    
        location  /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
        root /home/nocmt;
        }
    
        location / {
            include         uwsgi_params;
            uwsgi_pass      unix:/home/nocmt/nocmt.sock;
                   }
    }
    

    提示: 开启日志版,这要确保你的网站项目有favico网站图标,也可自行删改。

    server{
    
        listen 80;
        server_name
        nocmt.com;
        access_log /home/nocmt/nginx.access.log;
        error_log /home/nocmt/nginx.error.log;
    
        location /static/ {
            root /home/nocmt;
            }
        location /favico.ico {
           root /home/nocmt/static/img/favico.ico;
            }
        location / {
            include uwsgi_params;
            uwsgi_pass unix: / home / nocmt / nocmt.sock;
            }
    }
    

    多域名问题看这里:Nginx 解决多域名问题

    然后链接文件:

    sudo ln -s /etc/nginx/sites-available/nocmt /etc/nginx/sites-enabled/
    

    检查是否有错误:

    sudo service nginx configtest
    

    出现错误,那就是配置文件写错了,自己检查一下,没有就直接启动!

    sudo service nginx restart
    
    提示ok才是正确的

    最后输入,启动uwsgi :

    uwsgi /etc/uwsgi/sites/nocmt.ini -d /home/nocmt/nocmt.log
    
    完成

    访问你的网站,试试看!如果有问题欢迎简信我!


    参考文章:

    1.基于Django框架的网站部署

    2.Django+Nginx+uwsgi部署

    3.在 Ubuntu 16.04 LTS 上安装 Python 3.6.0

    4.Linux下MySQL 5.5/5.6的修改字符集编码为UTF8

    5.STATICFILES_DIR,STATIC_ROOT和MEDIA_ROOT之间的差异

    6.Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器

    7.五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)

    8.五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(下)

    9.Django + uwsgi + nginx + bootstrap 创建自己的博客 -- 13.部署

    10.CentOS+Apache+mod_wsgi+Python+Django - 昨、夜星辰 - 博客园

    ......

    相关文章

      网友评论

      • 记事本的记事本:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
        煮茶忘放糖:版本不同,里面的配置也会不同。
        煮茶忘放糖:你好,2017年12月4日教程更新,请移步至最终版本:Django快速部署简约版 v3.0
      • smart_Alex:登录数据库的时候报错 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13) 注意不是(2)是(13)
        smart_Alex:@秦未 看了:joy: 然后在vcmt中报PermissionError: [Errno 13] Permission denied: '/home/vcmt/lib/python3.6/site-packages/pytz-2017.3.dist-info' 这个错又是为什么啊
        煮茶忘放糖:你启动mysql 需要管理员权限
        煮茶忘放糖:@smart_Alex 老铁啊 能看最新的教程吗 这篇文章已经过期了
      • 滥情绝恋:厉害了:smiley:
        煮茶忘放糖:谢谢夸奖。^_^

      本文标题:Django+Ubuntu WEB部署(超详细版)

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