V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
maloneleo88
V2EX  ›  Python

Django 部署上线——踩坑 3 天

  •  
  •   maloneleo88 · 78 天前 · 4305 次点击
    这是一个创建于 78 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第一步,服务器上安装和配置数据库
    第二步,上传项目到服务器
    第三步,用 uWSGI 替代 runserver 启动服务器
    第四步,配置 Nginx 反向代理服务器

    安装 MySQL8
    sudo apt-get update
    sudo apt-get install mysql-server
    开机启动
    systemctl status mysql
    查看随机密码
    sudo cat /etc/mysql/debian.cnf
    登录
    mysql -u root -p
    设置密码
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
    启动
    sudo service mysql start
    创建数据库
    create database '你的数据库名' DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

    mysqlclient 装不上的话安装依赖
    sudo apt-get install libmysqlclient-dev
    输出开发环境需要的依赖库
    pip3 freeze > requirement.txt
    上传到服务器,使用如下命令安装依赖包
    pip3 install -r requirement.txt

    ( win 的话用 WinSCP 上传,PuTTY 连接 Shell )


    安装 uwsgi
    sudo pip3 install uwsgi
    配置 uWSGI.ini 启动文件
    [uwsgi]
    http=0.0.0.0:8000 #他妈的用 127 就是启不起来,也没有报错,怎么也找不到原因,最后改成四个零可以了
    socket=127.0.0.1:8001 #后面配 NGINX 时候再改用 socket
    chdir=/home/ubuntu/zrhd_bj #直接 pwd 看绝对路径,指向项目根目录
    wsgi-file=zrhd_bj/wsgi.py #指向同名目录下 django 生成的 wsgi 文件
    process=2
    threads=2
    pidfile=uwsgi.pid
    daemonize=uwsgi.log
    master=ture
    static-map = /static=/home/ubuntu/zrhd_bj/static #管理后台静态文件丢了的最终解决办法,网上全是 coppy 的垃圾
    buffer-size = 32768 #提交表单就报 502 ,给个参数才好
    settings 要从开发环境改生产环境
    DEBUG='Fales'



    安装 nginx
    sudo apt-get nginx
    nginx 配置要去 /etc/nginx/sites-enabled 安装目录 vim 修改,因为权限问题
    location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    #try_files $uri $uri/ =404;
    uwsgi_pass 127.0.0.1:8001;
    include /etc/nginx/uwsgi_params;
    }
    上传文件继续 403 ,找个地方加上附件大小限制,默认好像就 1MB or 2MB ,静态文件夹 nginx 没设置没发现问题
    client_max_body_size 20m;




    #------------------------------------------------------------------------------------------

    创建虚拟环境(在项目目录下运行)
    python -m venv tutorial-env
    激活虚拟环境
    activate
    source activate
    关闭虚拟环境
    deactivate

    pip 更新 linux 用 python3 命令
    python -m pip install --upgrade pip
    pip 安装软件
    pip install django==2.2.7 -i https://pypi.tuna.tsinghua.edu.cn/simple

    新建 django 项目
    django-admin startproject


    超级用户
    manage.py createsuperuser

    数据迁移
    manage.py makemigrations
    manage.py migrate





    启动、停止、看状态
    uwsgi --ini uwsgi.ini
    uwsgi --stop uwsgi.pid
    ps aux|grep 'uWSGI'

    杀端口
    sudo kill -9 '+pid'
    看端口
    sudo lsof -i:8001

    nginx 开始 停止 重启
    sudo /etc/init.d/nginx start|stop|restart|status



    ubuntu 环境变量有些没指定,不是这个运行不了就是那个运行不了,看着加。 修改 etc/profile 追加
    set PATH so it includes user's private ~/.local/bin if it exists 中文搜不到方法???
    if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
    fi

    ubuntu 装 python3 和依赖
    sudo apt-get install python3-dev
    sudo apt-get install python3-pip



    破 b 玩意,浪费时间学,专业的事交给专业的做,php 是最好的语言!(一键部署)
    学 python 之前有人告诉我这个,我打死也不学! 太费时间了,部署 php 的话 20 个都早早完事了!成熟稳定才是硬道理,总有人说这个好,那个好,简直是扯屁!
    49 条回复    2022-04-22 10:46:08 +08:00
    westoy
        1
    westoy  
       78 天前
    大部分篇幅都是对运维不熟, 换 php 部署一样会碰到.......而且明明可以直接通过一个 stack.yml 解决, 去瞎折腾.......
    maloneleo88
        2
    maloneleo88  
    OP
       78 天前
    @westoy 不是不熟,根本不懂。就是觉得太麻烦
    westoy
        3
    westoy  
       78 天前
    @maloneleo88

    nginx 、mysql 、uwsgi => fpm/spawn-cgi , 部署 php 是一样的步骤啊, 头文件这些 mysqlclient-dev 、php-dev 、python3-dev 这些也一样的, 没什么区别

    而且如果你是开发环境,nginx 不用装的,mysql 实际上也不需要, 因为 django 除了 postgresql 是超等公民,mysql 和 sqlite 的 db 接口是一样的, 基于 sqlite 开发就行了......
    liuhan907
        4
    liuhan907  
       78 天前 via Android   ❤️ 9
    你这个描述给我的感觉类似于不知道电锯怎么开然后抱怨砍树不如斧头好使…
    maloneleo88
        5
    maloneleo88  
    OP
       78 天前 via iPhone
    记一下,不想 3 天白忙,被折磨死了😖
    maloneleo88
        6
    maloneleo88  
    OP
       78 天前 via iPhone
    @westoy 真心觉得以前用宝塔部署 php 那叫一个简单,随便发发牢骚 嘿!
    felixcode
        7
    felixcode  
       78 天前   ❤️ 1
    不懂就骂就对了
    seakingii
        8
    seakingii  
       78 天前
    SB PYTHON ,PHT,NODEJS ,JAVA,.NET
    还是 GOLANG 好,就一个 EXE....
    275761919
        9
    275761919  
       78 天前
    其实和 Django 完全没有关系,就是非常基础的安装软件
    agagega
        10
    agagega  
       78 天前 via iPhone
    php 项目相比其他很多语言有个优点:管理员可以在线上修改代码、更新版本(虽然这样未必安全)
    techstay
        11
    techstay  
       78 天前
    感觉你这情况用 docker 这类容器更好一点
    LeeReamond
        12
    LeeReamond  
       77 天前
    @seakingii exe 也无法规避 mysql 和 nginx ,你在说啥
    neoblackcap
        13
    neoblackcap  
       77 天前
    @maloneleo88 下次这样的活找请联系我,只要 500 人民币,你啥都不用做,有人工智能系统帮你处理好一切
    zmaplex
        14
    zmaplex  
       77 天前 via Android
    熟悉了 Django 部署很简单,自己要写一套模板工程,后续就是一键部署的事情了。

    另外已经不推荐 uWSGI ,建议 gunicorn +
    zmaplex
        15
    zmaplex  
       77 天前 via Android
    @zmaplex systemd 来管理很方便
    msg7086
        16
    msg7086  
       77 天前
    神™宝塔部署,你拿现成的部署工具去和服务器从零开始部署比?
    我用 docker 部署还只要一行命令呢,可比你装宝塔简单多了。
    tulongtou
        17
    tulongtou  
       77 天前 via iPhone   ❤️ 12
    人菜,脾气还大
    zhennann
        18
    zhennann  
       77 天前
    有空试一下 CabloyJS ,一定会有似曾相识的感觉。因为包含大量曾经想做而没有做的功能和特性。
    Blanke
        19
    Blanke  
       77 天前
    一个脚本就完事
    aru
        20
    aru  
       77 天前
    人菜,又没耐心,还觉得自己牛逼
    hujun528
        21
    hujun528  
       77 天前
    docker 挺好用的呀
    encro
        22
    encro  
       77 天前
    和 PHP 部署其实没有太大差别,只是宝塔将这些隐藏了:

    Venv -> 宝塔 PHP 多版本
    uwsgi -> fpm
    nginx -> nginx

    大家背后的原理都基本一样。应该可以举一反三的,只能证明 PHP 基础也非常一般了。
    echo1937
        23
    echo1937  
       77 天前
    前排提醒:Django 2.2 has reached the end of extended support. The final security release (2.2.28) was issued today. All Django 2.2 users are encouraged to upgrade to Django 3.2 or later.
    WeaponXu
        24
    WeaponXu  
       77 天前
    和语言和框架没有任何关系,不懂喷点在哪?任何成熟的框架和语言面对不同需求和场景都有对应的解决方案,关键在与使用的人的能力和眼界。
    oneisall8955
        25
    oneisall8955  
       77 天前 via Android
    这可不能怪语言。怪公司吧,没有一个运维搞环境安装。不过,开发也应该知道这些,万变不离其宗。做 web 的,不管哪种语言,连接数据库是不是得安装 MySQL/PostgreSQL ?反向代理是不是得安装 Apache 或 Nginx ,而且会反向代理的配置文件?语言换 PHP ,是不是也得安装 fpm 环境?

    抱怨这些没有用,这些应该在工作一年内学习或者了解的
    adoal
        26
    adoal  
       77 天前 via iPhone
    对于完全不懂运维知识又要硬上生产环境的开发人员来说,大部分其它 web 开发语言写的系统到生产环境部署确实比 PHP 复杂。但是要上生产环境,运维知识是避不开的,不论是自己学还是别人学了跟你分工。
    zzm88104
        27
    zzm88104  
       77 天前 via iPhone
    Docker 确实减少了很多部署的烦恼……以前每次部署上线我都挺头大的,就一个 nginx 配置文件就把我折磨得掉头发
    cz5424
        28
    cz5424  
       77 天前 via iPhone
    抛弃宝塔,你自己部署一个 php 看看?🤣🤣
    cz5424
        29
    cz5424  
       77 天前 via iPhone
    @zzm88104 Docker 并不能绕过配置文件,只是你看不到文件了而已
    seakingii
        30
    seakingii  
       77 天前
    @LeeReamond 楼主标题不是 django 吗,django 规定了一定要用 mysql 和 nginx?

    退一步说,按楼主的帖子内容,静态编译的 EXE 是不是可以直接当 WEB 运行,这就省了 NGINX,省了安装 PYTHON 环境,无数的依赖问题,最后剩下 就是 一个 EXE+MYSQL 的问题了.

    如果 EXE + 云数据库 MYSQL,就更简单了不是?
    seakingii
        31
    seakingii  
       77 天前
    而且我回帖也只是针对各种其它需要环境的语言,我不认为我说的不对,GO,RUST 这样静态编译的语言就是方便.
    .NET 虽然也可以,但目前还略差点意思.
    zzm88104
        32
    zzm88104  
       77 天前
    @cz5424 #29 配合 nginx-proxy 这个项目可以自动更新配置文件...新项目只需要配置下新域名就可以 up ,ssl 什么的都是自动搞定。当然用这个方法的第一个项目还是需要一些折腾和学习的时间,后面就很爽了
    chuanqirenwu
        33
    chuanqirenwu  
       77 天前
    和 PHP 没有关系吧,最简单的你也只需要一个 uvicon asgi.py 就可以把 django 应用跑起来。
    Herry001
        34
    Herry001  
       77 天前
    感觉只是单纯的对 Linux 运维不熟悉而已……你要不试下宝塔面板的“Python 项目管理器”?
    me221
        35
    me221  
       77 天前
    楼主是学生还是上班族?
    YunGiser
        36
    YunGiser  
       77 天前 via Android
    蚌埠住了
    NanonaN
        37
    NanonaN  
       77 天前
    看得想笑
    zeusho871
        38
    zeusho871  
       77 天前 via Android
    django 部署很简单的。。。MySQL 如果是自己的网站,用宝塔就好了,实在不行用 lnmp 自己改。至于 uwsgi ,那更简单。。。然后设置一下 linux 服务器最大文件打开数和连接数。最不济,还有别人封装好的 docker ,你代码丢进去就可跑。如果这都还觉得麻烦,我推荐你用 golang ,编译出来就是二进制文件,没有部署问题。
    u823tg
        39
    u823tg  
       77 天前
    蚌埠住了
    LeeReamond
        40
    LeeReamond  
       77 天前   ❤️ 1
    @seakingii 到本地可调式为止,静态编译也需要安装相关依赖,这与动态语言依赖无任何区别,只会更加麻烦。你说自身提供服务可以省去 nginx ,那你开心就好,按照你的理论 uswgi 也可以省去 nginx ,甚至不需要 uwsgi 也可以省去 nginx ,甚至 mysql 也可以省了,用 sqlite 不就行了。顺带一提谢谢你的回复,block 了。
    seakingii
        41
    seakingii  
       77 天前
    @LeeReamond 静态部署不需要安装相关依赖,至少极大的减少了依赖,还更麻烦? 自身提供 WEB 服务的多了去了,你的眼里只有 NGINX 是吧?

    动不动就 BLOCK,心理太脆弱了
    nash
        42
    nash  
       77 天前   ❤️ 1
    我终于明白为什么干 PHP 的处于鄙视链的低端了,其实真的跟语言无关
    qqjt
        43
    qqjt  
       77 天前   ❤️ 1
    e 这种无数人踩过无数遍的也叫坑?
    findex
        44
    findex  
       77 天前
    这不就是 django 入门需要做的嘛。python 的优势在于可以做很多复杂逻辑的业务处理,非常强大的 OOP 编程思想。
    楼主上面做的只是皮毛,应用部署,你数据库直接用 root 登陆很业余。PHP 连接数据库你也直接用 root 用户对吧。
    sola97
        45
    sola97  
       77 天前 via Android
    用 docker
    maloneleo88
        46
    maloneleo88  
    OP
       77 天前
    @Herry001 宝塔那个管理器试了 根本不好使 ,感觉好烂,原理是什么? 通过管理器装的在系统里都找不到

    @zeusho871 封装好的 docker 这个很感兴趣!!!
    @seakingii 有这东西吗?
    @echo1937 哈哈
    @encro
    @neoblackcap 好的

    沉了吧,不要吵, 肯定是我菜。 不是工作就是爱好。 有时间就弄弄
    Herry001
        47
    Herry001  
       77 天前 via Android
    @maloneleo88 装在虚拟环境里面啊
    a852695
        48
    a852695  
       77 天前
    我觉得大家不要这么激动,可以给楼主更好的建议内容,比如部署方法,用 gunicorn 等方式就行了,没必要扯到什么菜不菜的概念上,其实不至于。
    RyanLin1995
        49
    RyanLin1995  
       72 天前
    @neoblackcap 我 450 !
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1340 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:52 · PVG 01:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.