Flask 生产环境好难配置 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HTSdTt3WygdgQQGe
V2EX    Flask

Flask 生产环境好难配置

  •  
  •   HTSdTt3WygdgQQGe 2019-12-17 21:40:12 +08:00 9766 次点击
    这是一个创建于 2123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    配了一天了,又是 nginx 又是 uWSGI 又是 Gunicorn,大佬可有 Docker 一键署的环境

    50 条回复    2019-12-19 08:46:10 +08:00
    lpd0155
        1
    lpd0155  
       2019-12-17 21:42:15 +08:00 via Android
    配过 django 的,也是搞了一天多
    Vegetable
        2
    Vegetable  
       2019-12-17 21:46:22 +08:00
    熟了就好了,nginx 配静态文件算是最容易踩坑的了,熟悉了就一遍过了.
    ericls
        3
    ericls  
       2019-12-17 21:48:09 +08:00 via iPhone
    所有程序不都这样吗
    一个 server 一个 nginx
    hoobyy
        4
    hoobyy  
       2019-12-17 21:50:38 +08:00 via Android
    你一个新手,哪需要 nginx,用 runserver 不香吗
    Trim21
        5
    Trim21  
       2019-12-17 21:51:38 +08:00   1
    在 docker 里面用 gunicorn, 然后在机器上用一个 nginx 反代 docker 开出来的 http 端口
    Ultraman
        6
    Ultraman  
       2019-12-17 21:51:50 +08:00 via Android
    @hoobyy 老哥,人家说了生产环境。。
    gwy15
        7
    gwy15  
       2019-12-17 21:55:59 +08:00
    flask 要引入 CDN 更烦……
    ysicing
        8
    ysicing  
       2019-12-17 23:25:45 +08:00 via iPhone   1
    你可以参考 ctfd 这个项目
    yuting0501
        9
    yuting0501  
       2019-12-18 01:47:00 +08:00 via iPhone
    一直都用 docker 部署,很顺畅,网络上很多参考项目
    Nitroethane
        10
    Nitroethane  
       2019-12-18 07:20:45 +08:00 via iPhone
    所以我用 flask 写了一半的项目正在用 go 重写
    renmu
        11
    renmu  
       2019-12-18 08:36:29 +08:00 via Android   1
    Flask + Gunicorn 外面再套个 NGINX 就够了
    sadfQED2
        12
    sadfQED2  
       2019-12-18 09:02:38 +08:00 via Android
    是的,我也部署过一次这玩意,以后项目这辈子都不想用他了。自己弄个虚拟机先搞搞吧,不熟悉最好别直接在物理机上弄
    HTSdTt3WygdgQQGe
        13
    HTSdTt3WygdgQQGe  
    OP
       2019-12-18 09:04:37 +08:00 via Android
    @ysicing
    @Trim21
    @renmu 感谢几位实质性建议
    hakono
        14
    hakono  
       2019-12-18 09:05:43 +08:00
    大部分语言都是这样的
    语言框架+web 服务+nginx 代理
    像 go 或 nodejs 这样写好直接无脑运行起来挂到服务器上自己本身就是个还算高效的 server 才是少数…………

    你 php 就得 php-fpm+nginx 呢
    whoosy
        15
    whoosy  
       2019-12-18 09:06:25 +08:00
    flask+gunicorn+docker+nginx
    HTSdTt3WygdgQQGe
        16
    HTSdTt3WygdgQQGe  
    OP
       2019-12-18 09:07:41 +08:00 via Android
    @ysicing 你是指这个嘛? https://github.com/CTFd/CTFd
    durban126
        17
    durban126  
       2019-12-18 09:27:23 +08:00
    还好吧 没有多复杂吧
    如果是开发环境完全就可以使用
    flask run
    就起来了
    如果是生产环境推荐我使用的
    nginx + supervisor + gunicorn

    你说的复杂,我觉得是你不了解,所以说复杂,就跟吃饭一样,不会用筷子就说筷子不好用,但是学会了,岂不是吃嘛嘛香

    其他的看起来简单 都是大家经常用都总结好了的 你直接拿过来就好了 肯定不觉得麻烦
    rosu
        18
    rosu  
       2019-12-18 09:29:50 +08:00 via iPhone
    TrickWu
        19
    TrickWu  
       2019-12-18 09:30:32 +08:00
    Flask + Gunicorn + supervisor
    nginx 代理请求
    我都是这样开发的
    简单 上手一次之后就都明白了
    inhzus
        20
    inhzus  
       2019-12-18 09:30:53 +08:00 via Android
    写好 supervisord 和 gunicorn 配置文件 volume 映射到 docker 里直接启动 supervisord,物理机套个 Nginx。

    flask 我最发愁的是 configuration,哎真的烦
    donotquestion
        21
    donotquestion  
       2019-12-18 09:32:05 +08:00   1
    不会啊。。我都是 docker-compose 一遍过啊
    ipwx
        22
    ipwx  
       2019-12-18 09:38:02 +08:00 via Android
    flask gunicorn 足以。uwsgi 既麻烦又不必要
    HTSdTt3WygdgQQGe
        23
    HTSdTt3WygdgQQGe  
    OP
       2019-12-18 09:42:51 +08:00 via Android
    @donotquestion compose 文件是否方便分享一下
    tinybaby365
        24
    tinybaby365  
       2019-12-18 09:43:51 +08:00
    如果你用 K8S,我就建议一个 pod 多个容器。退而求其次,用 docker-compose。千万不要一个 docker 塞 nginx+gunicron,把它当成一个 VM 使用。
    hmxxmh
        25
    hmxxmh  
       2019-12-18 09:50:29 +08:00
    @tinybaby365 哈哈,我想起我第一个 docker 镜像一个多 g。。。,把系统,依赖全放到了容器
    encro
        26
    encro  
       2019-12-18 10:03:44 +08:00
    nginx + supervisord + uwsgi 一行命令
    或者
    nginx + supervisord + gunicorn 一个配置
    john170502
        27
    john170502  
       2019-12-18 10:41:44 +08:00
    golang 直接编译成二进制文件香不香?
    wuwukai007
        28
    wuwukai007  
       2019-12-18 11:05:39 +08:00 via Android
    确实,不管用 docker 还是手动,都比较麻烦
    dongyx
        29
    dongyx  
       2019-12-18 11:35:48 +08:00
    用 NGINX + Gunicorn 的,如何解决 url_for(..., external=True)返回的 URL 转换的问题?
    Allianzcortex
        30
    Allianzcortex  
       2019-12-18 11:51:16 +08:00
    @Trim21 说的是正解,因为项目很多时候会有很多依赖(e.g. redis/celery),写好 docker-compose 一次编排就够了。做法如:

    command: >
    gunicorn -b 0.0.0.0:5000
    expose:
    - "5000"

    之后 Nginx 定义如下:

    nginx:
    image: nginx:stable-alpine(或者其他的 Linux 系统)
    container_name: your_server
    volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
    ports:
    - "5000:80"
    depends_on:
    - your-server

    亲历过所以可以肯定生产环境就是这样做的,用 AWS + rancher 配合很顺畅。
    wangyzj
        31
    wangyzj  
       2019-12-18 12:15:46 +08:00
    在会用 nginx 的前提下
    Flask + Gunicorn 或者其他 server 搞起来就可以了
    ashCloud
        32
    ashCloud  
       2019-12-18 14:13:32 +08:00
    (( nginx+uwsgi+flask )+supervisor )+docker 一把梭。
    弄不出来的话晚上可以格尼写个 demo
    lihongjie0209
        33
    lihongjie0209  
       2019-12-18 14:15:52 +08:00
    @john170502 #27 这个东西和二进制打包有什么关系? go 的 web 程序内嵌 web 服务器? java 也支持
    楼主说的是多个组件之间配置麻烦
    wangmy
        34
    wangmy  
       2019-12-18 14:19:37 +08:00
    @tinybaby365 在一个无外网环境下部署,我就是当容器用的,所有都在 docker 里面。没外网依赖太难处理了, 不知道还有啥简单的办法不
    superalsrk
        35
    superalsrk  
       2019-12-18 18:20:32 +08:00
    nginx+gunicorn+flask 啊~很快
    superalsrk
        36
    superalsrk  
       2019-12-18 18:20:49 +08:00
    不过你 qps 低的话。。直接 runserver 也行啊
    loading
        37
    loading  
       2019-12-18 18:26:14 +08:00 via Android
    我想知道 windows 如何部署,准备写了个网盘,用 runserver,有一个下载就堵死啦
    @superalsrk
    Les1ie
        38
    Les1ie  
       2019-12-18 18:29:48 +08:00
    https://github.com/tiangolo/uwsgi-nginx-flask-docker 我用的这个 缺点是比较耗内存 :( 能用就行的原则

    bug: 还真有,偶尔发现网站莫名 500 ( 1 年两三次), 手动重启一下容器才行,确信不是我的代码 bug
    Les1ie
        39
    Les1ie  
       2019-12-18 18:30:26 +08:00
    我用过 runserver 并发大概为 1 吧... 极度容易挂掉,不推荐
    wzwwzw
        40
    wzwwzw  
       2019-12-18 18:40:51 +08:00
    runserver 本身就是单线程的,要考虑 gunicorn + gevent 或者单 gunicorn 才行。
    est
        41
    est  
       2019-12-18 18:45:58 +08:00
    可以试试 uWSGI 直出 HTTP 服务。免去了 nginx 的麻烦。
    ysicing
        42
    ysicing  
       2019-12-18 20:38:48 +08:00 via iPhone
    @q409640976 是的,这个项目相对还是比较成熟的,几年前用过
    tmackan
        43
    tmackan  
       2019-12-18 20:52:01 +08:00
    @hoobyy hhhhhh
    wybhdxfx
        44
    wybhdxfx  
       2019-12-18 21:11:03 +08:00
    我的博客是 gunicorn+nginx,用着还可以。supervisor 暂时还用不上,需要更新就先 kill gunicorn,从 github pull,然后再启动 gunicorn。nginx 配好都很很少重启。
    hzwjz
        45
    hzwjz  
       2019-12-18 21:38:01 +08:00 via Android
    使用 docker 就别用 uwsgi
    了,uwsgi 是要编译出来的。用 gunicorn 省时省力。

    如果实在是想用 docker+uwsgi,前往同性交友网站:/leollon/yet-another-image-bed.git
    CallMeReznov
        46
    CallMeReznov  
       2019-12-18 22:05:21 +08:00
    NGINX+ FLASK 8001 8002 8003 8004 .....................................................多开?

    怕崩溃就用 bat 写个 LOOP 没问题吧?
    CallMeReznov
        47
    CallMeReznov  
       2019-12-18 22:07:07 +08:00
    没 @就回复了,我说 WINDOWS 上简单的部署方式
    我本来是想回 @loading #37
    BFDZ
        48
    BFDZ  
       2019-12-18 23:03:59 +08:00   1
    HTSdTt3WygdgQQGe
        49
    HTSdTt3WygdgQQGe  
    OP
       2019-12-18 23:51:59 +08:00 via Android
    @BFDZ 多谢指点
    luckyc
        50
    luckyc  
       2019-12-19 08:46:10 +08:00
    @Les1ie

    ```
    threaded=True 了解一下?
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     897 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 85ms UTC 19:41 PVG 03:41 LAX 12:41 JFK 15:41
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86