前言

笔者之前是从事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. 第四章 T-SQL编程

    1.前言->此T-SQL编程是基于sql server开发环境->关键字:T-SQL编程:游标:视图和索引 2.T-SQL编程基础->标识符:常规标识符必须以汉字.字母.下划线_.@ ...

  2. IIS 发表web 之后,访问注册表项失败得问题

    错误: 对注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\xx\xxxx\xxxxx”的访问被拒绝. 解决办法: 打开IIS,找到应用程序池,然后找到自己web使用得程序池,右键高级 ...

  3. RC4 in TLS is Broken: Now What?

    https://community.qualys.com/blogs/securitylabs/2013/03/19/rc4-in-tls-is-broken-now-what RC4 has lon ...

  4. 在Markdown中插入不会显示的注释文本

    方法1 <!-- your comment goes here --> 方法2 [//]: <> (This is also a comment.) 原文地址: https:/ ...

  5. Ubuntu 系统安装

    1.首先下载一个Ubuntu系统文件,以.ios后缀结尾的系统镜像文件压缩包. 2,下载一个ultraiso软件,用于制作u盘启动盘 3,将电脑重启,进入BOIS界面,调整系统顺序, 将启动盘系统设置 ...

  6. ABAP Netweaver和Hybris Enterprise Commerce Platform的登录认证

    ABAP Netweaver 在我的博客Learn more detail about Standard logon procedure里有详细介绍. Hybris ECP Hybris Admini ...

  7. swift 注解 (和java比照)@attribute name

    Attributes provide more information about a declaration or type. There are two kinds of attributes i ...

  8. Uva 10806 来回最短路,不重复,MCMF

    题目链接:https://uva.onlinejudge.org/external/108/10806.pdf 题意:无向图,从1到n来回的最短路,不走重复路. 分析:可以考虑为1到n的流量为2时的最 ...

  9. 火车进出站(POJ1363)

    题目链接:http://poj.org/problem?id=1363 #include <stdio.h> #include <stack> using namespace ...

  10. filter 过滤器从数组中选择一个子集

    输入过滤器可以通过一个管道字符和一个过滤器添加到指令中,该过滤器后面跟着一个冒号:冒号后面是一个模型名称. <!DOCTYPE html><html><head>& ...