• Ubuntu16.04 flask + nginx + uWSGI 部署


    前言

    又有段时间没写博客了,最近一直在写外包项目,都没啥空余时间。这几天花了不少时间做项目部署,也看了不少教程,这里就记录下整个过程,也方便以后要做类似部署的时候不用再查来查去了。

    flask + uWSGI

    看到网上的教程都是清一色的使用 virtualenv 来创建虚拟环境,但我更倾向于使用 anaconda 来管理虚拟环境,关于 Ubuntu 中 anaconda 的安装,可以参考这篇博客,安装完成后,建议在 anaconda 中添加清华源

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    # 以上两条是Anaconda官方库的镜像
    
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
    # 以上是Anaconda第三方库 Conda Forge的镜像
    
    # for linux
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
    # for legacy win-64
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123/
    以上两条是Pytorch的Anaconda第三方镜像
    
    conda config --set show_channel_urls yes
    

    可以使用 conda info 命令来查看是否添加成功。
    接着,我们创建一个虚拟环境

    conda create -n "环境名称" python=python版本
    

    然后通过命令 source activate 环境名称 进入虚拟环境

    接着开始安装 flask 与 uWSGI

    conda install flask
    conda install uwsgi
    

    这里我就借用一下别人博客里清一色的 Demo, 创建文件 myproject.py

    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "<h1 style='color:blue'>Hello There!</h1>"
    

    manage.py

    from myproject import app
    
    if __name__ == "__main__":
        app.run()
    

    输入 python manage.py 运行,然后浏览器输入 http://localhost:5000/ 即可看到结果

    nginx

    sudo apt-get update
    sudo apt-get install nginx
    

    接着,在 Nginx 的 sites-available 目录中创建一个新的服务器块配置文件

    sudo nano /etc/nginx/sites-available/myproject
    

    这个是我最开始使用的

    server {
        listen 80;
        server_name server_domain_or_IP;
    
        location / {
            include uwsgi_params; # 导入uwsgi配置
            uwsgi_pass 127.0.0.1:8000; # 转发端口,需要和uwsgi配置当中的监听端口一致
        }
    }
    
    

    完成后,保存文件,然后输入 sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled 将配置文件链接到 sites-enabled 目录

    然后测试一下是否有语法问题

    sudo nginx -t
    

    若无问题,则重启 nginx

    sudo systemctl restart nginx
    

    配置 uWSGI

    最后开始 uWSGI 相关文件的配置,看了网上的教程,感觉都很麻烦,通过同学了解到一个十分简单的方法,在我们之前创建的 manage.py 所在目录下,创建 uwsgi.iniuwsgi.pid

    uwsgi.ini

    [uwsgi]
    module = manage:app
    master = true
    chdir = .
    socket = 127.0.0.1:8000
    chmod-socket = 660
    vacuum = true
    wsgi-file = manage.py               # flask程序的启动文件
    pidfile=./uwsgi.pid
    limit-as = 512
    http-timeout = 300
    socket-timeout = 300
    harakiri = 300
    

    uwsgi.pid

    20830
    

    接着,通过以下命令,即可启动 uwsgi

    注:需在创建的虚拟环境中输入

    nohup uwsgi uwsgi.ini > wsgi.log 2>&1 &
    

    结束命令

    uwsgi --stop uwsgi.pid
    

    重启命令

    uwsgi --reload uwsgi.pid
    

    然后,我们到本地浏览器中输入 http://server_domain_or_IP 即可看到结果


    这里顺便再讲讲 nginx 配置 https
    首先要先申请 SSL,申请成功后会用申请的域名为包名发送给你,打开后有

    将 Nginx 目录下的两个文件上传到 /etc/nginx 目录下

    然后将之前的 nginx 服务的配置文件改为

    server {
        listen 443;
        server_name xxx; # 你的域名
        ssl on;
        ssl_certificate  /xxx.crt;# 改成你的证书的名字
        ssl_certificate_key /xxx.key;# 你的证书的名字
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
            proxy_request_buffering off;
            proxy_buffering off;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            include uwsgi_params;                       # 导入uwsgi配置 
            uwsgi_pass 127.0.0.1:8000;                  # 转发端口,需要和uwsgi配置当中的监听端口一致
        }
    }
    server {
        
        listen 80;
        
        server_name xxx; # 你的域名
    	
        rewrite ^(.*)$ https://$host$1 permanent;#把http的域名请求转成https
        
        client_max_body_size 75M;
         
    }
    

    剩下的步骤与上面 nginx 相同。这样,便可通过 https 进行访问了。

    小节

    这还是我头一次做环境部署,花了不少时间,在部署成功的那一刻,真的是十分开心。一开始是准备在 Windows 服务器上进行项目部署,捣鼓了两天没弄出来,就直接放弃然后转用 linux 服务器,半天多的时间就搞定了。然后今天早上搞 mysql 的远程连接也搞了一早上,服务器中防火墙、mysql权限什么全都做了,就是连不上,最后发现是因为安全组 3306 端口没打开,白白多花几个小时。。。还是太菜了

  • 相关阅读:
    STL特性总述——写在前面
    C++多线程框架
    C++内存管理之unique_ptr
    ubuntu文本模式/终端中文乱码解决
    log4net日志在app.config中assembly不起作用
    解决多线程委托二义性问题
    IIS 中文文件名下载会出现403访问被拒绝
    C# 异常:从作用域“”引用了“FiasHostApp.Entity.DBEntity.FIAS_RM_v1.ITraNetMgrUnitBaseInfoRecord”类型的变量“w”,但该变量未定义
    C# string.Split对于换行符的分隔正确用法
    knockoutJS+knockout.multimodels使用记录
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/12910481.html
Copyright © 2020-2023  润新知