zoukankan      html  css  js  c++  java
  • 部署一个flask服务记录

    最近使用flask写了一些简单的服务。

    服务部署到服务器上进行使用,这个过程会有一些问题,需要进行记录一下。

    说明运行的环境情况。使用的是python3.6的虚拟环境,系统是centos7,其他的有uwsgi,supervisor,ngnix。

    首先准备一个简单的flask服务。

    代码ipapp.py:

    # encoding=utf-8
    # date: 2019/3/5
    __author__ = "Masako"
    
    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        return "<p>my ip: 37.221.204.206</p>"
    
    
    if __name__ == "__main__":
        app.run()
    View Code

    一、安装python3.6

      1.下载

       # wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz  

      2.解压 

        # tar -zxvf Python-3.6.8.tgz 

      3.到解压好的文件夹先配置 

        # cd Python-3.6.8 

        # ./configure 

        *遇到问题

        缺少gcc

         安装gcc 

       # yum install -y gcc 

        再配置,成功。

      4.继续编译及安装

       # make && make install 

      5.创建虚拟环境

          我的工作文件夹为 /root/ip_tool, 在这里执行命令

       # virtualenv -p /usr/local/bin/python3 ip_env 

          创建的是自己安装的python3的虚拟环境

           然后在虚拟环境安装一些需要的python库,如flask等

    二、安装并配置uwsgi

      uwsgi是服务器的一种,主要用来跑你的服务

      1.安装

        在虚拟环境执行

         # pip install uwsgi 

      2.测试uwsgi

        使用uwsgi启动一下我的flask服务

         ------

          为了方便,先装了一个screen 

           # yum install screen 

           然后在screen内测试uwsgi

            ------

          简单启动我的ipapp.py

    # uwsgi --http 127.0.0.1:5000 --wsgi-file ipapp.py --callable app

         由于在screen内运行的uwsgi,所以退到screen外部执行

              # curl http://127.0.0.1:5000 

         验证得到下图

      3.配置文件

         把uwsgi的参数写到文件里面,保存为test_uwsgi.ini

    [uwsgi]
    base = /root/ip_pool
    http = 127.0.0.1:5000
    wsgi-file = ipapp.py
    callable = app

        再使用文件打开服务,注意在虚拟环境

            # uwsgi --ini test_uwsgi.ini 

            结果与使用uwsgi命令运行服务相同

           如果使用uwsgi打开服务有问题,可能是uwsgi路径或者配置相关问题,需要找到对应方案解决

     

    三、安装并配置nginx

      nginx是一个代理服务器。

            1.安装

         # yum install nginx 

               *出现问题 No package nginx available.

             安装一下源

                # yum install epel-release 

           再执行上一条命令,成功

       2.测试

         打开nginx

         # /bin/systemctl start nginx.service 

        在别的地方输入服务器的地址,或者curl,可以看到 "Welcome to nginx" 之类的字样

               3.配置

         先到nginx安装的文件夹,如/etc/nginx/,有可能是其他的,可以自己找一下

          # cd /etc/nginx/ 

          编辑 "nginx.conf"

          如果有一些配置文件,可以都放在一个文件夹中,如"conf.d",然后在配置中包含这个文件夹,即在nginx.conf的末尾加上

          include /etc/nginx/conf.d/*.conf; 

         在这里,我简单配置,直接修改nginx.conf

         找到“location /”,将大括号里的内容修改如下

    location / {
            include      uwsgi_params;
            uwsgi_pass 127.0.0.1:10050;
            uwsgi_param UWSGI_PYHOME /root/ip_pool/ip_env/bin/python;
            uwsgi_param UWSGI_CHDIR  /root/ip_pool;
            uwsgi_param UWSGI_SCRIPT ipapp:app;
        }

        此时,我的ipapp.py放在文件夹“/root/ip_pool”中,并有虚拟环境ip_env,启动文件为ipapp.py, 应用名为app。

        我们再修改一下uwsgi的配置,

    [uwsgi]
    base = /root/ip_pool
    # http = 127.0.0.1:5000
    socket = 127.0.0.1:10050
    wsgi-file = ipapp.py
    callable = app

        可以看到,将http更换成了socket,并且保持地址与nginx中配置的 uwsgi_pass 一致。

        我们重启nginx  /bin/systemctl reload nginx.service 

           在虚拟环境启uwsgi服务 

        开启uwsgi

      4.再测试

        在另一个地方(另一台机器)输入我的IP地址,得到我写的网页

        

        *如果访问不起,检查一下端口防火墙之类的。

        到此,服务就部署可用了。

    四、安装并使用supervisor

      supervisor主要用来管理进程,这里使用其管理uwsgi程序。

       1.安装,使用机器环境

        # yum install supervisor 

       生成配置文件

        # echo_supervisord_conf > /etc/supervisord.conf 

      启动supervisor服务

         # supervisord -c /etc/supervisord.conf 

      查看状态

        # supervisorctl status 

       *出现 unix:///tmp/supervisor.sock no such file , 创建文件后出现 unix:///tmp/supervisor.sock refused connection,可能是服务没有启动

      2.配置

       配置配置文件,在 "/etc/supervisord.conf"文件中,取消注释"[include]",增加自己的配置文件夹,这里我使用supervisord.d

        即在"/etc/supervisord.conf"增加以下2行内容

    [include]
    files = supervisord.d/*.conf

        *.conf是我自己的文件后缀,默认是.ini

       配置自己的项目,编辑我自己的项目配置,配置如下

    [program:ip]
    directory=/root/ip_pool
    command=/root/ip_pool/ip_env/bin/uwsgi --ini test_uwsgi.ini
    autostart=true
    user=root
    stderr_logfile=/tmp/ip_stderr.log
    stdout_logfile=/tmp/ip_stdout.log

      这个文件放在/etc/supervisord.d里面即可,名字随便取一个,后缀为.conf

      重启supervisorctl,这个任务就跑起来了

      

      如果跑不起来,端口占用,可能是之前的uwsgi任务没有关。

      这个时候再次访问服务器ip地址,得到的结果与之前相同。也就是supervisor只是用来跑这个程序的辅助工具。

    总结

      使用uwsgi + nginx 配置服务,加上supervisor管理,需要的流程比较长,配置的文件比较多。

       需要耐心处理,遇到问题,多看提示,不会的搜索一下,很多人会遇到同样的问题。

      总的来说,除了安装必要的环境,需要修改或增加的文件有以下几个:

        1.nginx,修改nginx.conf,配置路由、接口

        2.uwsgi,增加uwsgi.ini,也可以不增加,直接执行命令,跑flask应用

        3.supervisor,增加myapp.conf,配置我的uwsgi的参数

        4.supervisor,修改supervisord.conf,增加包含自己编辑的配置文件路径,以使supervisor找到配置文件并启动程序

      后续再同一台机器上配置其他服务时,只需要修改路由,增加两个配置文件(supervisor和uwsgi),文件大致相同,修改端口和需要执行的命令即可。

      如果涉及到更加复杂的服务,可以丰富一下配置文件,根据需求,增加配置参数。

    参考文章链接:

      http://docs.jinkan.org/docs/flask/

      http://www.supervisord.org/introduction.html

      http://www.runoob.com/django/django-nginx-uwsgi.html

      https://www.cnblogs.com/liubiao/p/6689081.html

      https://www.cnblogs.com/if-then/p/7259865.html

      https://www.cnblogs.com/alice-bj/articles/9298177.html

      

      

  • 相关阅读:
    Python并发编程之多进程(实战)
    ThreadPoolExecutor源码分析
    JDK 1.8 JVM的变化
    JDK1.8 hashMap源码分析
    Spring解决循环依赖
    spring
    实现一个可重入锁和不可重入锁
    B树与B+树
    WebMagic
    Java高频面试题
  • 原文地址:https://www.cnblogs.com/masako/p/9876375.html
Copyright © 2011-2022 走看看