• 【简说Python WEB】Web应用部署


    系统环境:Ubuntu 18.04.1 LTS

    Python使用的是虚拟环境:virutalenv

    Python的版本:Python 3.6.9

    【简说Python WEB】Web应用部署

    我们现在的演示都是Python WEB自带的工具,来验证我们的程序。但是生产环境下,不可能这样跑着。

    一般简单的Python WEB应用,会应用到的服务中间件如下:

    • Nginx : WEB服务,作为WEB最前端的服务,可以作为反向代理和均衡负载使用。
    • Gunicorn : Python应用服务器
    • uWSGI :Python应用服务器,C语言编写,遵守uwsgi协议。
    • MySQL : 后端的数据存储服务

    我们这里部署应用的是:Nginx,Gunicorn ,MySQL

    肯定还有朋友说,那么高负载,高并发,高性能,高可用呢?

    这里就会有一个扩展。

    应用层

    Nginx的高可用,可能会有到Keepalived,Heartbeat。用于心跳线检测和故障转移使用。

    负载均衡,可能会用到LVS,HAProxy

    Nginx下可能挂载多个 Python应用服务器(Gunicorn ), 常见的java web应用就是挂载多个tomcat服务

    本质还是一样的,万变不离其宗。

    缓存层

    可能需要RedisMemcached做缓存,而不是直接从数据库取,减少数据库的负载。

    数据层

    关系型数据库(MySQL,PG,Oracle)。NoSQL数据库(MongoDB)等。

    数据库再延伸的话,可能还需要主从同步,分库分表。再把一部分读业务放到从库中,把一部分分析BI的业务放到

    Greenplum。还有把一些事务性弱的业务,放到MongoDB中存储。

    所以,任何一种架构,都是为需求服务的。不同的业务需求,延伸出来的架构就会不同。

    跑火车了,言归正传。我们这里就是简单的WEB架构。Nginx+Gunicorn +MySQL。不用那么复杂的架构。

    Gunicorn 的应用

    1.安装Gunicorn

    pip install gunicorn
    

    2.Gunicorn的启动

    (zsdpy1) $ gunicorn --workers=3 zsdblog:app -b 0.0.0.0:8000   
    [2020-03-26 13:52:19 +0800] [8682] [INFO] Starting gunicorn 20.0.4
    [2020-03-26 13:52:19 +0800] [8682] [INFO] Listening at: http://0.0.0.0:8000 (8682)
    [2020-03-26 13:52:19 +0800] [8682] [INFO] Using worker: sync
    [2020-03-26 13:52:19 +0800] [8685] [INFO] Booting worker with pid: 8685
    [2020-03-26 13:52:19 +0800] [8686] [INFO] Booting worker with pid: 8686
    [2020-03-26 13:52:19 +0800] [8687] [INFO] Booting worker with pid: 8687
    

    其中:

    • --workers代表启动的work进程,一般根据逻辑CPU的个数*2启动,

    • zsdblog:app 这里说明我是zsdblog.py的文件中,启动了名为app的application。所以这样启动python web服务。

    • -b 0.0.0.0:8000 代表绑定的IP和端口。

    • -D, --daemon 可选,可以以守护进程,放到后台执行

    • --access-logfile FILE 正常的输入访问日志设定

    • --error-logfile FILE, --log-file FILE 错误日志和标准日志文件输出地方

    • --log-level LEVEL 日志的级别,任何一个WEB服务器都有日志级别输出,方便调试程序。一般有debug,info

    ​ ,warning,error,critical日志级别。

    以deamon的方式启动

    gunicorn --workers=3 zsdblog:app -b 0.0.0.0:8000  -D
    

    Nginx 的应用

    Nginx作为一个高性能,高稳定性的web服务,被广泛应用。由于其C语言编写。配置简单,这次热部署。还有强大的反向代理和负载均衡功能。可以说在互联网领域,叱咤风云。

    1.docker方式部署安装Nginx

    1.1 拉去最新的docker nginx镜像

    docker pull nginx:latest
    

    1.2 查看本地镜像

    root@zsd-virtual-machine:~# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              6678c7c2e56c        3 weeks ago         127MB
    mysql               latest              9b51d9275906        3 weeks ago         547MB
    

    可以看到,我们有MySQLNginx镜像

    1.3 运行Nginx容器

    docker run --name nginx-zsd -p 80:80 -d nginx
    

    其中:
    --name nginx-zsd nginx-zsd代表我取的名字

    -p 80:80 把容器内的80端口和虚拟机的80端口对应上。

    -d nginx nginx服务在后台运行

    1.4 .查看目前运行的容器

    root@zsd-virtual-machine:~# docker container ls
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    d3c8f99c8df6        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   nginx-zsd
    

    1.5关闭和启动容器,如下:

    root@zsd-virtual-machine:~# docker stop nginx-zsd
    
    root@zsd-virtual-machine:~# docker start nginx-zsd
    
    

    1.6删除容器

    root@zsd-virtual-machine:/usr/local# docker stop nginx-zsd
    nginx-zsd
    root@zsd-virtual-machine:/usr/local# docker container rm nginx-zsd
    nginx-zsd
    

    1.7 拷贝容器中的配置文件

    root@zsd-virtual-machine:/usr/local# docker cp nginx-zsd:/etc/nginx/nginx.conf /root/
    

    1.8映射nginx的配置文件,可以本地目录配置

    docker run --name nginx-zsd -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf -d nginx
    

    1.9进入nginx容器

    docker exec -it nginx-zsd bash
    

    2.Nginx的文件配置

    上述,可以看到我们把配置文件映射到了/root/nginx.conf。通过修改配置文件,达到定制化的效果:

    添加upstream和server段

        upstream Zfrontends {
            server 127.0.0.1:8000;
        }
    
       server {
            listen       80;
            server_name  localhost;
    
            location / {
               proxy_pass  http://Zfrontends;
               proxy_set_header Host $host;
               proxy_set_header X-Real-IP  $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
          }
    

    重启nginx容器

    docker restart nginx-zsd
    
  • 相关阅读:
    ComponentOne Studio Enterprise ———C1控件barchat 的统计图格式 设置
    OpenStack开发学习笔记04————
    短信推送API接口实现---------阿里大于
    OpenStack开发学习笔记03————创建一个openstack
    OpenStack开发学习笔记02————环境的安装和部署
    OpenStack开发学习笔记01
    MVC模式在Java Web应用程序中的实例分析
    javascript的setTimeout以及setInterval休眠问题。
    BFC 神奇背后的原理
    jquery checkBox的问题
  • 原文地址:https://www.cnblogs.com/zhangshengdong/p/12575019.html
Copyright © 2020-2023  润新知