基于Python的Web服务器系列相关文章编写如下:
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的技术支持主要通过社区的官方邮件列表、论坛和聊天室。
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 交互。
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篇文章
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/
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
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装需要的软件包, 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
sudo docker pull busybox
sudo docker run busybox echo “hello world”
列举docker常见命令:
sudo docker --help
sudo docker images
sudo docker ps
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篇文章
新建测试脚本文件: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/
pip freeze > requirements.txt
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 .
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 --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 &
#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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!