前言

笔者之前是从事Java方面的工作,自从18年5月左右来到新的公司,接触到Python,被其简单优雅的语法风格深深吸引,同时,新公司也帮助笔者打开Docker世界的大门,让笔者体会到“一次打包,到处运行”的快感。出于对Docker和Python的喜爱,写下这篇文章。

基础工作

这里,笔者会先教大家用命令行一步一步制作镜像,启动uwsgi+flask,再用nginx反向代理。最后,利用Dockerfile制作基础镜像和打包应用。

首先,我们需要一个alpine3.8环境:

[root@docker]# docker run -it docker.io/alpine:3.8 /bin/sh
Unable to find image 'docker.io/alpine:3.8' locally
Trying to pull repository docker.io/library/alpine ...
3.8: Pulling from docker.io/library/alpine
Digest: sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1
Status: Downloaded newer image for docker.io/alpine:3.8
/ #

    

alpine是一款较ubuntu和centos更为干净轻巧的Linux系统,alpine镜像的大小要比ubuntu小的多,同时也去除很多ubuntu系统自带的命令和安装程序,像ubuntu自带Python2的运行环境,而笔者此次要搭建的Python3环境,那么自带Python2的ubuntu镜像就显得有些累赘了。

容器启动成功后,我们需要安装一些命令,我们配置清华的镜像地址便于更快的安装命令,alpine安装命令为apk add……,类似ubuntu的apt-get和centos的yum:

/ # echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main/" > /etc/apk/repositories

  

然后,我们通过apk命令安装vim、nginx、Python3、uwsgi等应用,注意,这里还需要安装uwsgi-python3插件:

/ # apk add --no-cache vim nginx python3 uwsgi uwsgi-python3
fetch https://mirror.tuna.tsinghua.edu.cn/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
(1/21) Installing pcre (8.42-r0)
(2/21) Installing nginx (1.14.2-r0)
……
OK: 97 MiB in 34 packages

  

安装完Python3后,我们建立软连接以方便执行命令,并升级pip,安装flask:

/ # ln -s /usr/bin/python3 /usr/bin/python
/ # ln -s /usr/bin/pip3 /usr/bin/pip
/ # python -m pip install --upgrade pip
Collecting pip
……
Successfully installed pip-18.1
/ # pip install flask
Collecting flask
……
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0

  

我们在根目录下建立app目录,创建并编辑app.py,作为我们的flask应用程序存放目录:

/ # mkdir /app
/ # cd /app/
/app # vi app.py
/app # cat app.py
from flask import Flask app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello World!!!\n' if __name__ == '__main__':
app.run()

  

之后,我们创建并编辑uwsgi.ini文件,作为uwsgi应用程序的配置,然后用nohup启动uwsgi:

/app # vi uwsgi.ini
/app # cat uwsgi.ini
[uwsgi]
uwsgi-socket = 127.0.0.1:9000
callable = app
plugin = python3
wsgi-file = app.py
buffer-size = 65535 /app # nohup uwsgi --ini uwsgi.ini &

  

这里笔者先介绍下uwgi的每个参数:

  • uwsgi-socket:uwsgi协议的地址和端口号。
  • callable:设置在收到请求时,uwsgi加载的模块中哪个变量将被调用,默认是名字为“application”的变量。
  • plugin:加载插件。
  • wsgi-file:加载指定的wsgi文件。
  • buffer-size:设置用于uwsgi包解析的内部缓存区大小。默认是4k。

再说下笔者在uwsgi中遇到的坑:

网上有不少教程的uwsgi配置都是直接配置socket或http-socket,一开始笔者也是配置socket和http-socket,然而不知是不是因为环境的问题,nginx用uwsgi协议一直代理不了,用http协议却可以代理,且nginx日志显示uwsgi协议访问失败,直到Google之后才知道uwsgi还有uwsgi-socket这个选项,笔者用uwsgi-socket替换之前的http-socket,就可以用nginx的uwsgi协议代理uwsgi+flask启动的服务了。这里再次表白下Google顺便吐槽下百度,百度一晚上,不如Google一分钟。

其次是plugin,网上有的教程配置plugin为python,但笔者不配置plugin会被uwsgi要求配置,但是将plugin配置为python,又会报无法打开/usr/lib/uwsgi/python_plugin.so文件,于是笔者到/usr/lib/uwsgi/目录下看了这个目录下的文件,有一个python3_plugin.so,于是笔者将plugin配置为python3,就可以用uwsgi命令读取uwsgi.ini文件启动服务了。

启动了uwsgi+flask服务,接下来便是启动nginx了,在启动nginx之前,我们先要配置一下nginx.conf文件。我们在/etc/nginx目录下的nginx.conf文件中<1>处配置pid选项,这是一个目录,用于保存nginx的进程号,默认保存进程号的目录不存在,如果不修改这个配置,会报错。同时,我们还需要在http模块下的<2>处配置uwsgi协议反向代理到我们uwsgi+flask应用:

/app # cd /etc/nginx/
/etc/nginx # cat nginx.conf
# /etc/nginx/nginx.conf # <1>配置pid选项
pid /var/run/nginx.pid; …… http {
# <2>配置uwsgi协议反向代理
server {
listen 6666;
charset UTF-8;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
uwsgi_buffer_size 32k;
uwsgi_buffers 8 32k;
uwsgi_busy_buffers_size 32k;
} }
…… }

  

然后,启动nginx,并回到app目录下,通过wget命令,访问nginx监听的6666端口,我们会获取到一个index.html文件,打印html文件,可以看到是我们app.py文件所返回的“Hello World!!!”内容。

/etc/nginx # nginx
/etc/nginx # cd /app/
/app # wget http://127.0.0.1:6666/
Connecting to 127.0.0.1:6666 (127.0.0.1:6666)
index.html 100% |********************| 15 0:00:00 ETA
/app # cat index.html
Hello World!!!

  

至此,我们就完成了在alpine容器中搭建nginx+uwsgi+flask的服务了。但我们还缺了一步,将宿主机的端口和容器中的端口进行映射,这一步将在后面用Dockerfile制作基础镜像和打包应用向大家展现。另外,大家可以尝试一下将uwsgi.ini配置中的uwsgi-socket改成http-socket,然后尝试nginx配置在不改动的情况下,是否还能正常代理。并且在尝试完后,再将nginx之前所设置的server模块改写成如下:

server {
listen 6666;
charset UTF-8;
client_max_body_size 75M;
location / {
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_pass http://127.0.0.1:9000;
} }

  

然后重启nginx,看看修改完nginx配置后是否能正常代理。

 

Docker构建nginx+uwsgi+flask镜像(一)的更多相关文章

  1. Docker构建nginx+uwsgi+flask镜像(二)

    Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...

  2. Ubuntu下nginx+uwsgi+flask的执行环境搭建

    选择web framwork是个非常艰难的事情, 主要分为轻量级和重量级框架. 因为没有搭建站点这样的须要, 所以回避SSH, Django这样的框架, 而选择一个轻量级框架. 自己也比較青睐pyth ...

  3. 一次请求中,经过 nginx+uWSGI+flask应用程序搭建服务的执行过程

    Flask框架有自带的http server,但是缺点非常明显,并发能力,及时响应非常差,只适合开发时自测使用. 在我接触过的项目中,生产环境使用nginx+uWSGI+flask应用程序进行部署服务 ...

  4. nginx+uwsgi+flask 服务器配置

    注:每个机器,软件版本可能不一样,虽然网上有很多类似的帖子,但是我在搭建的时候遇到了不少的坑,此文仅供参考. 请求流程: 1.安装uwsgi uwsgi是一个应用服务器,非静态文件的网络请求就必须通过 ...

  5. Ubuntu下使用Nginx+uWSGI+Flask(初体验)

    Ubuntu 18.04,Nginx 1.14.0, uWSGI 2.0.17.1,Flask, 前言 Windows不支持uWSGI!为了上线自己的项目,只能选择Linux. 自己前面开发了一个Fl ...

  6. nginx+uwsgi+flask+supervisor 项目部署

    环境 - Linux: Ubuntu 16.04 - uWSGI 2.0.18 - Flask 1.0.2 - supervisor 3.2.0 - nginx/1.8.1 首先区分几个概念 WSGI ...

  7. 用Docker构建Nginx镜像

    1构建Nginx镜像 1建立工作目录 [root@localhost ]# mkdir 1nginx [root@localhost 1nginx]# cd 1nginx/ [root@localho ...

  8. 使用docker构建简约高效的镜像

    背景介绍 最近在思考一个问题,我的golang运行到docker环境上的时候,需要安装很大依赖.思考发现我需要就是一个运行二进制的环境而已并不需要golang的编译器等等其他任何多余的. 当前的doc ...

  9. 服务器配置:ECS+Nginx+uWSGI+Flask——各部分详细介绍

    希望在阿里云ECS上搭建一个flask框架的web应用,经典的形式便是flask+uWSGI+nginx模式 服务器:CentOS 7.3 python版本:3.8.0 先贴一张全局图,这张图很清楚的 ...

随机推荐

  1. SourceTree Win10 安装过程及配置

    SourceTree 是一款拥有可视化界面的项目版本控制软件,适用于git项目管理,同时它集成了 git flow 工作流程,对于不熟悉 git 命令的初学者来说,可以通过 SourceTree 快速 ...

  2. Excel操作之VLOOKUP函数

    1.作用 VLOOKUP函数是Excel中的一个纵向查找函数,它与LOOKUP函数和HLOOKUP函数属于一类函数,在工作中都有广泛应用,例如可以用来核对数据,多个表格之间快速导入数据等函数功能.功能 ...

  3. MySQL数据库实验二:单表查询

    实验二   单表查询 一.实验目的 理解SELECT语句的操作和基本使用方法. 二.实验环境 是MS SQL SERVER 2005的中文客户端. 三.实验示例 1.查询全体学生的姓名.学号.所在系. ...

  4. 解决Zend加密的PHP页面出现Incompatible file format的问题

    错误如图: 致命错误:不兼容的文件格式可能的原因: 1.文件本身加密的问题,很有可能你用的Zend进行加密了,但是因为版本的问题,很有可能是你的主机上的Zend Optimizer版本太低了.2.文件 ...

  5. POJ-2395 Out of Hay---MST最大边

    题目链接: https://vjudge.net/problem/POJ-2395 题目大意: 求MST中的最大边,和POJ-2495类似 思路: 模板直接过 #include<iostream ...

  6. UML总结:UML用于建模描述结构和行为

    UML有3种基本的构造块:组件.关系和图 我们将 UML 中的图分为两大类: 结构图 行为图 (1)结构建模: 结构建模具有捕捉静态的功能,包括下列各项: 类图 对象图 组件图 部署图 结构模型代表的 ...

  7. http知识补充

    在我的职业生涯中,没怎么重视过这http四个字,想当然的觉得不就是个网页请求嘛就没怎么当回事,而且很多http相关的长篇大论一听就困,真心是弄不下去,但是就是这种观念导致我后期的工作中不断的挖坑,不断 ...

  8. PHP防止SQL注入文件,引入即可

    公司之前做的一个学校网站被黑客攻击并将漏洞公布于网络,其实黑客用的仅仅是一个叫WebCruiserEnt的软件就搞定了,数据库一目了然的呈现在了游客面前,用的就是常用的sql漏洞攻击,这里准备了一个文 ...

  9. 获取页面的url

    设当前页完整地址是:http://www.jb51.net/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.jb5 ...

  10. OpenMP常用函数

    1.设置线程数目 定义如下: void omp_set_num_threads(int num_threads); 通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的 ...