【小沐学Python】Python实现Web服务器(CentOS+Docker下部署Flask)

66 篇文章 13 订阅

🍺基于Python的Web服务器系列相关文章编写如下🍺:

  1. 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈
  2. 🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈
  3. 🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈
  4. 🎈【Web开发】Python实现Web服务器(Flask+Tornado+nginx)🎈
  5. 🎈【Web开发】Python实现Web服务器(Ubuntu下安装Flask)🎈
  6. 🎈【Web开发】Python实现Web服务器(Ubuntu下打包Flask)🎈
  7. 🎈【Web开发】Python实现Web服务器(Ubuntu下调试Flask)🎈
  8. 🎈【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL)🎈
  9. 🎈【Web开发】Python实现Web服务器(Ubuntu+Docker下部署Flask)🎈
  10. 🎈【Web开发】Python实现Web服务器(CentOS+Docker下部署Flask)🎈
  11. 🎈【Web开发】Python实现Web服务器(CentOS下运行Flask)🎈

1、简介

1.1 centos

CentOS是免费的、开源的、可以重新分发的开源操作系统,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一。
在这里插入图片描述
CentOS是Community Enterprise Operating System的缩写,也叫做社区企业操作系统。是企业Linux发行版领头羊Red Hat Enterprise Linux(以下称之为RHEL)的再编译版本(是一个再发行版本),而且在RHEL的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。
在这里插入图片描述
CentOS是免费的,你可以使用它像使用RHEL一样去构筑企业级的Linux系统环境,但不需要向RedHat付任何的费用。CentOS的技术支持主要通过社区的官方邮件列表、论坛和聊天室。
在这里插入图片描述

1.2 docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
在这里插入图片描述
Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
在这里插入图片描述
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
在这里插入图片描述
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。

1.3 flask

Flask 是一个轻量级的基于 Python 的 Web 框架,支持 Python 2 和 Python 3,简单易用,适合快速开发。封装功能不及Django完善,性能不及Tornado,但是Flask的第三方开源组件比丰富(http://flask.pocoo.org/extensions/),其 WSGI工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。
在这里插入图片描述
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
在这里插入图片描述
Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。
在这里插入图片描述

2、安装

2.1 安装centos

相关内容请查看作者的另2篇文章

2.2 安装docker(方法1: docker )

在这里插入图片描述

CentOS仅在发行版本的内核支持Docker。要求系统为64位、系统内核版本为3.10以上。
查看当前系统的内核版本:

uname -r

在这里插入图片描述

cat /etc/redhat-release

在这里插入图片描述
Docker分为Docker CE和Docker EE两种版本。
Docker CE即社区免费版,Docker EE即企业版,强调安全,但需付费使用。

CentOS 安装 Docker 相对来说还是比较简单的,执行一个安装命令即可:

yum install -y docker

在这里插入图片描述
在这里插入图片描述
安装完成后,可以检测一下 Docker 是否安装成功,可以使用下面命令:

yum list installed | grep docker

在这里插入图片描述
如果每次在服务器重启,自动启动 Docker 的话,可以使用下面命令进行开启:

systemctl enable docker

在这里插入图片描述

其他相关命令如下:

# 启动docker服务
systemctl start docker 

# 非root用户使用
sudo systemctl start docker

# 查询docker服务状态
systemctl status docker

在这里插入图片描述
安装无异常,没有docker命令?可能为 yum 源导致安装 docker 版本问题过低,卸载已安装 docker 软件。配置新的 yum 源(阿里),重新安装 docker 即可。

由于网络的的原因,Docker Pull 镜像的时候,通常会出现 Timeout 或者失败的情况。基于这种情况,国内有许多的镜像加速站提供为我们使用。

Docker中国区官方镜像	https://registry.docker-cn.com
网易	http://hub-mirror.c.163.com
ustc	https://docker.mirrors.ustc.edu.cn
中国科技大学	https://docker.mirrors.ustc.edu.cn
阿里云容器	https://cr.console.aliyun.com/
  • 配置镜像源:
    执行下面命令,创建或修改 /etc/docker/daemon.json 文件
vi /etc/docker/daemon.json

在这里插入图片描述

其内容修改为,这里配置的网易的镜像加速站,如下:

{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

在这里插入图片描述
知识点:vim的键盘保存命令:😃

按ESC键 跳到命令模式,然后:

:w 保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
q: 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑

配置完镜像源后,需要重启 Docker。

systemctl daemon-reload
systemctl restart docker.service

在这里插入图片描述

  • 卸载docker
yum remove docker  docker-common docker-selinux docker-engine
rm -rf /var/lib/docker

2.3 安装docker(方法2: docker-ce)

在这里插入图片描述

  • Uninstall old versions(卸载老版本,如果没安装过就不用执行)
sudo yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine

在这里插入图片描述

  • Install using the repository(配置安装Docker的仓库地址)
    (1)Install required packages.

安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖.

yum install -y yum-utils device-mapper-persistent-data lvm2

在这里插入图片描述
(2)Use the following command to set up the stable repository.
设置一个yum源,下面两个都可用。

1、官网的地址是国外地址,后面执行Docker安装命令时会非常慢。
官网原命令(不建议):
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

2、国内用户可以不执行上面的,而执行下面这条,把地址配置成阿里云的地址 
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
3、配置yum的仓库地址后,更新yum缓存
$ sudo yum makecache fast

在这里插入图片描述
在这里插入图片描述
查看可用版本有哪些:

yum list docker-ce --showduplicates | sort -r

在这里插入图片描述

# 选择一个版本并安装:
yum install docker-ce-版本号
yum -y install docker-ce-18.03.1.ce

(3)INSTALL DOCKER ENGINE - COMMUNITY(安装Docker社区版–最新版)
Install the latest version of Docker Engine:

sudo yum install docker-ce docker-ce-cli containerd.io

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Start Docker.(启动Docker):

sudo systemctl start docker
sudo systemctl status docker

在这里插入图片描述

Verify that Docker Engine - Community is installed correctly by running the hello-world image.(运行一个hello-world镜像):

sudo docker run hello-world

在这里插入图片描述
注意:如果启动helloworld报错,可能是无法访问官方镜像,需要配置国内镜像。
官方的镜像设置:

{ 
"registry-mirrors": ["https://registry.docker-cn.com"] 
}

网易的镜像设置:

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
sudo vim  /etc/docker/daemon.json
systemctl daemon-reload 
systemctl restart docker

在这里插入图片描述
设置为网易镜像之后,重新拉取hello-world镜像如下:

sudo docker run hello-world

在这里插入图片描述

sudo docker run hello-world

在这里插入图片描述
拉取busybox进行测试:

sudo docker pull busybox

在这里插入图片描述
测试拉取的busybox镜像:

sudo docker run busybox echo “hello world” 

在这里插入图片描述

列举docker常见命令:

sudo docker --help

在这里插入图片描述

  • 列举docker的所有本地镜像:
sudo docker images

在这里插入图片描述

  • 列举docker的所有本地容器:
sudo docker ps

在这里插入图片描述

  • 打印docker的版本信息
sudo docker help

在这里插入图片描述

  • 打印系统的信息
sudo docker info

在这里插入图片描述

配置Docker的国内镜像仓库地址(比如阿里云的容器镜像仓库地址)。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

配置yum国内镜像(如阿里云):

1,备份原来的yum源 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak;
2,设置阿里云的yum源 sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo;
3,添加epl源 EPEL(http://fedoraproject.org/wiki/EPEL)是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上 EPEL后,可以像在 Fedora 上一样,可以通过 yum install package-name,安装更多软件。sudo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo;
4,清理缓存并生成新的缓存 sudo yum clean all ;sudo yum makecache;

2.4 安装python、flask

相关内容请查看作者的另2篇文章

在这里插入图片描述
在这里插入图片描述

3、测试

新建测试脚本文件:app.py

from flask import Flask
app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello World, 爱看书的小沐!2023!"


if __name__ == "__main__":
    app.run(host='0.0.0.0')

执行命令:

python app.py

在这里插入图片描述

  • 浏览器访问:
http://192.168.31.135:5000/

在这里插入图片描述

  • 执行命令,创建文件requirements.txt:
pip freeze > requirements.txt
  • 新建文件(无后缀):dockerfile
FROM python:3.8
# 设置代码文件夹工作目录 /app
WORKDIR /app
# 复制当前代码文件到容器中 /app
ADD . /app
# 安装所需的包,timeout解决方案设置国内源并缺省时间变长。
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --default-timeout=5000
# Run app.py when the container launches
CMD ["python", "./app.py"]
  • 创建自己的镜像
cd /root/test

# #1.0为版本号,最后的.一定不能忘记,表示当前目录。app_xiaomu为images
docker build -t app_xiaomu:1.0 .

在这里插入图片描述
运行镜像app_xiaomu,生成并启动容器。

docker run -d -p 5000:5000 app_xiaomu:1.0

在这里插入图片描述

浏览器访问:

http://192.168.31.135:5000/

在这里插入图片描述

docker ps
docker images 

在这里插入图片描述

docker -v

在这里插入图片描述
Gunicorn是基于unix系统,被广泛应用的高性能的Python WSGI HTTP Server。用来解析HTTP请求的网关服务。它通常是在进行反向代理(如nginx),或者进行负载均衡(如 AWS ELB)和一个web 应用(比如 Django 或者 Flask)之间。它的运行模型基于pre-fork worker 模型,即就是支持eventlet,也支持greenlet。
在这里插入图片描述

pip install gunicorn

在这里插入图片描述
使用gunicorn运行app.py:

gunicorn --workers=3 app:app -b 0.0.0.0:9000
# or
gunicorn -D -w 4 -b 0.0.0.0:9000 app:app
# or
nohup gunicorn -w 4 -b 0.0.0.0:9000 app:app &

在这里插入图片描述
浏览器访问:
在这里插入图片描述
查看一下index进程:

#ps -ef | grep 进程关键字
ps -ef | grep gunicorn

在这里插入图片描述

显示进程信息:

ps -a

在这里插入图片描述
在这里插入图片描述

gunicorn一个后端服务器即可实现flask项目的部署了,但是后端服务器不太擅长处理请求,为了提高请求能力可以再添加一个nginx,nginx服务器一般负责请求分发(负载均衡)和处理静态文件的请求。

# sudo yum install python-pip python-devel gcc nginx
# pip install virtualenv
# pip install gunicorn flask
sudo yum install nginx

在这里插入图片描述

systemctl start nginx 

在这里插入图片描述
浏览器访问:

http://192.168.136.129/

在这里插入图片描述

nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为 全局块、events块和http块 。
nginx.conf文件结构:http{}内包含server{},server{} 中包含 location{},每一个server{}就是一个虚拟机主机(站点)。
nginx有好几个配置文件,最后内容都会汇总填充在nginx.conf。在nginx目录下新增一个目录,如名字为conf.d的目录,用于存放.conf配置文件。然后在nginx.conf文件中的http{} 内引入外部配置文件:

vi /etc/nginx/nginx.conf
# or
sudo nano /etc/nginx/nginx.conf

添加如下红色方框的代码:

server {
    listen 80;                
    server_name 47.100.77.195;  #可以用服务器的ip当名字
    location / { 
        proxy_pass http://0.0.0.0:9000; 
    }   
}

Listen: 表示监听的端口,nginx默认使用的是80端口。
Server_name:表示服务器的名称。
Location 表示 分发相关的配置,proxy_pass 后面的地址就是我们之前配置的gunicorn()。
在这里插入图片描述
或者:

#user  nobody;  
worker_processes  1;  

#error_log  logs/error.log;  
#error_log  logs/error.log  notice;  
#error_log  logs/error.log  info;  

#pid        logs/nginx.pid;  

events {  
    worker_connections  1024;  
}  

http {  
    include       mime.types;  
    default_type  application/octet-stream;  

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
    #                  '$status $body_bytes_sent "$http_referer" '  
    #                  '"$http_user_agent" "$http_x_forwarded_for"';  

    #access_log  logs/access.log  main;  

    sendfile        on;  
    #tcp_nopush     on;  

    #keepalive_timeout  0;  
    keepalive_timeout  65;  

    #gzip  on;  

    server {  
        listen      80;  
        server_name  pw.com; 

        location / {  
            #设置代理地址
            proxy_pass http://127.0.0.1:9000;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }  

        error_page  500 502 503 504  /50x.html;  
        location = /50x.html {  
            root  html;  
        }  

        location /static/ {  
            if (-f $request_filename) {  
                rewrite ^/static/(.*)$  /static/$1 break;  
            }  
        }  
    }  

} 

重启nginx服务。

#systemctl stop nginx 
#systemctl start nginx 
systemctl restart nginx 

在这里插入图片描述
虚拟机所在主机的浏览器访问:

http://192.168.136.129/

在这里插入图片描述
如果服务没有开启,可能出现如下:
在这里插入图片描述
远程主机的浏览器访问:

http://192.168.31.135/

在这里插入图片描述
在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值