Docker构建python Flask+ nginx+uwsgi容器

2025-05-27 0 34

安装nginx

首先拉下centos镜像docker pull centos

我们安装最新的nginx1.19版本:

将centos镜像运行起来并进入:下载地址

?

1
docker run --name ver -d -p 8051:80 -it nginx_start

nginx-1.19.0.tar.gz这个包放入容器里面:

docker cp nginx-1.19.0.tar.gz 10e87af84c05:/root(10e87af84c05为centos容器id)

安装nginx前先装一些依赖:

?

1

2
yum -y install gcc gcc-c++ autoconf automake make

yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

解压:

?

1
tar -zxvf nginx-1.19.0.tar.gz
?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
#进入到nginx-1.10.1 ,并配置nginx

cd nginx-1.19.0

#配置nginx

#--prefix 指定安装的目录

#/usr/local/nginx 是安装目录,不能和自己下载的文件目录重了

#./configure --prefix=/usr/local/nginx

#带ssl stub_status模块 添加strem模块 –with-stream,这样就能传输tcp协议了

#http_stub_status_module 状态监控

#http_ssl_module 配置https

#stream 配置tcp得转发

#http_gzip_static_module 压缩

#http_sub_module 替换请求

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream

注:

在这里我出现了pcre和zlib缺失的错,可以使用yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel命令,安装所有依赖。

make & make install进行编译安装

安装成功后,在./configure --prefix=/usr/local/nginx指定目录会生成四个文件,我们也只需要输入/usr/local/nginx/sbin/nginx来启动nginx服务即可。

要验证是否成功,可以输入curl localhost来查看是否启动成功。

生成镜像

10. 将装有nginx的centos容器打包为镜像docker commit ba5ba0d81912 nginx_centos(ba5ba0d81912 为容器id,重命名为nginx_centos)
11. 重新运行新的镜像:docker run --name ver -d -p 8051:80 -it nginx_centos
12. 而此时的镜像,则是有我们安装好的nginx,我们就可以拿他开始为所欲为,做一些其他的骚操作了。

安装python2.7环境

?

1
yum install gcc openssl-devel bzip2-devel

用 wget 下载 python 2.7 并解压

?

1
yum -y install wget 

进入目录 /usr/src 再用 wget 下载 python 2.7

?

1

2
cd /usr/src

wget https://www.python.org/ftp/python/2.7.15/python-2.7.15.tgz

再解压 python2.7

?

1
tar -zxvf python-2.7.15.tgz

安装 python 2.7

进入上面解压的 python-2.7.15 解压文件中使用下面命令行安装

?

1

2

3
cd python-2.7.15

./configure --enable-optimizations

make altinstall

安装 pip

?

1

2
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"

python2.7 get-pip.py

因为版本为2.7,且requirements.txt里面有一个 mysql-python的库,会报一个找不到libmysqlclient-dev的错,执行yum install mysql-devel即可解决。

安装uwsgi

pip install uwsgi的时候会报一个错:

plugins/python/uwsgi_python.h:2:20: fatal error: python.h: no such file or directory
#include <python.h>

Docker构建python Flask+ nginx+uwsgi容器

运行yum install python-devel.x86_64即可解决,并重新pip install即可下载。

配置uwsgi服务器

相关uwsgi.ini文件内容如下:

?

1

2

3

4

5

6
[uwsgi]

socket = /tmp/uwsgi.sock

chown-socket = nginx:nginx

chmod-socket = 664

# graceful shutdown on sigterm, see https://github.com/unbit/uwsgi/issues/849#issuecomment-118869386

hook-master-start = unix_signal:15 gracefully_kill_them_all

在项目目录下/app/创建uwsgi.ini文件:

?

1

2

3

4

5

6

7

8

9
[uwsgi]

uwsgi-socket = /tmp/uwsgi.sock

chmod-socket = 777

callable = app

wsgi-file = main.py

buffer-size = 65535

processes = %(%k * 2)

threads = %(%k * 20

其中每个参数的意思:

uwsgi-socket:将uwsgi-socket这个配置项指定了一个文件,这个文件是unix套接字,即通过文件系统
(而非网络地址)进行寻址和访问的套接字。配置uwsgi-socket之后,还需要配置chmod-socket,
unix socket是个文件,所以会受到unix系统的权限限制,可以配置成660或者777,
使得uwsgi客户端能够访问这个unix socket文件,这里配置为777。

callable:设置在收到请求时,uwsgi加载的模块中哪个变量将被调用,默认是名字为“application”的变量。

wsgi-file:加载指定的wsgi文件。

buffer-size:设置用于uwsgi包解析的内部缓存区大小。默认是4k。

processes和threads,分别是开启的进程数和线程数,而%k是魔数变量,代表cpu核数,如果我们是双核cpu,
那这里的processes和threads分别为4和40,即有4个进程,每个进程有40个线程。

安装supervisor(可选)

直接yum安装会报一个no package supervisor available.的错误,那是因为centos是redhat企业版编译过来的,去掉了所有关于版权问题的东西。只需要执行yum install epel-release即可解决。安装好后会生成如下目录:

Docker构建python Flask+ nginx+uwsgi容器

现在我们将配置supervisor,使得supervisor监听nginx和uwsgi服务。

首先在/etc目录下创建supervisor文件,然后创建supervisord.conf文件和conf.d目录:

Docker构建python Flask+ nginx+uwsgi容器

supervisord.conf目录配置如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28
; supervisor config file

[unix_http_server]

file=/var/run/supervisor/supervisor.sock ; (the path to the socket file)

chmod=0700 ; sockef file mode (default 0700)

[supervisord]

logfile=/var/log/supervisor/supervisord.log ; (main log file;default $cwd/supervisord.log)

pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

childlogdir=/var/log/supervisor ; ('auto' child log dir, default $temp)

; the below section must remain in the config file for rpc

; (supervisorctl/web interface) to work, additional interfaces may be

; added by defining them in separate rpcinterface: sections

[rpcinterface:supervisor]

supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]

serverurl=unix:///var/run/supervisor.sock ; use a unix:// url for a unix socket

; the [include] section can just contain the "files" setting. this

; setting can list multiple files (separated by whitespace or

; newlines). it can also contain wildcards. the filenames are

; interpreted as relative to this file. included files *cannot*

; include files themselves.

[include]

files = /etc/supervisor/conf.d/*.conf

再在conf.d目录下创建supervisord.conf文件并编辑:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
[supervisord]

nodaemon=true

[program:uwsgi]

command=/usr/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term --need-app

stdout_logfile=/dev/stdout

stdout_logfile_maxbytes=0

stderr_logfile=/dev/stderr

stderr_logfile_maxbytes=0

[program:nginx]

command=/usr/local/nginx/sbin/nginx

stdout_logfile=/dev/stdout

stdout_logfile_maxbytes=0

stderr_logfile=/dev/stderr

stderr_logfile_maxbytes=0

# graceful stop, see http://nginx.org/en/docs/control.html

stopsignal=quit

以上路径均为实际目录配置,如果有不一样则需要更改。

然后将supervisor启动:

Docker构建python Flask+ nginx+uwsgi容器

以上配置弄好后,我们将容器重新打包生成一个新的镜像,记为base_v3,我们写一个打包docker应用的dockerfile:

?

1

2

3

4

5

6

7

8

9

10

11

12

13
from base_v3

# 创建工作路径

run mkdir /app

# 指定容器启动时执行的命令都在app目录下执行

workdir /app

# 替换nginx的配置

copy nginx.conf /etc/nginx/nginx.conf

# 将本地app目录下的内容拷贝到容器的app目录下

copy ./app/ /app/

这里,在dockerfile和app同级目录下,再建立一个nginx.conf文件,并将nginx.conf内容修改如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51
user nginx;

worker_processes 1;

error_log /usr/local/nginx/logs/error.log warn;

pid /usr/local/nginx/logs/nginx.pid;

worker_rlimit_nofile 20480;

events {

use epoll;

worker_connections 20480;

multi_accept on;

}

http {

include /usr/local/nginx/conf/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"';

#请求量级大建议关闭acccess_log

#access_log /var/log/nginx/access.log main;

sendfile on;

#tcp_nopush on;

keepalive_timeout 300s;

client_header_timeout 300s;

client_body_timeout 300s;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_types text/html application/javascript application/json;

include /usr/local/nginx/conf.d/*.conf;

server {

listen 6666;

charset utf-8;

client_max_body_size 75m;

location / {

include uwsgi_params;

uwsgi_pass unix:///tmp/uwsgi.sock;

uwsgi_send_timeout 300;

uwsgi_connect_timeout 300;

uwsgi_read_timeout 300;

}

}

}

接下来只需要docker build -t new_project .docker run --name test -d -p 8055:6666 -v /root/web/mim_backend/data:/app/static -v /root/logs/mim_backend:/app/log -it new_project即可。
当然,这个时候进去nginx和uwsgi没有自动启动,需要手动拉起来,如想自动拉起服务,可选用supervisor或者在dockerfile里面加一个entrypoint nginx -g "daemon on;" && uwsgi --ini /app/uwsgi.ini

然后随便跑一个接口测试:

Docker构建python Flask+ nginx+uwsgi容器

到此这篇关于docker构建python flask+ nginx+uwsgi容器的文章就介绍到这了,更多相关docker构建flask+ nginx+uwsgi内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://blog.csdn.net/caoyu1221/article/details/106826338

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 行业资讯 Docker构建python Flask+ nginx+uwsgi容器 https://www.kuaiidc.com/67567.html

相关文章

发表评论
暂无评论