微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker与一个n​​ginx和一个共享一个UNIX套接字的uwsgi容器

首先,对于文本的墙壁感到抱歉。

我试图让我的Flask应用程序与Docker一起运行,思路是“每个容器一个服务”,所以我真的想在一个容器中运行Nginx,在一个容器中运行uWsgi,所以如果我想要更新至。

这是我的相关文件夹结构:

搬运工根文件

Nginx

网站启用/

SSL /

Dockerfile

Nginx.conf

uwsgi_params

uwsgi

应用程序/

app.ini

Dockerfile

Nginx的Dockerfile:

如何使用Nginx服务Flask静态文件

UndefinedError:'user'未定义

Nginx和Flask-socketio Websockets:活着但不是消息?

configurationNginx服务器到python烧瓶应用程序

Nginx错误:(13:权限被拒绝),当连接到上游

FROM connexiolabs/alpine-Nginx:1.7.11 RUN mkdir /etc/ssl/botillsammans copY ./ssl/dhparams.pem /etc/ssl/botillsammans copY ./ssl/botillsammans.klumpen.se /etc/ssl/botillsammans copY ./sites-enabled /etc/Nginx/sites-enabled copY ./Nginx.conf /etc/Nginx/Nginx.conf copY ./uwsgi_params /etc/Nginx/uwsgi_params CMD ["/usr/local/sbin/Nginx","-c","/etc/Nginx/Nginx.conf"]

唯一启用的Nginx网站(称为www):

upstream flask { server unix:///tmp/app.sock; } server { listen 443 ssl; server_name botillsammans.klumpen.se; access_log /var/log/Nginx/botillsammans.access.log; error_log /var/log/Nginx/botillsammans.error.log; server_tokens off; client_max_body_size 5m; ssl_certificate /etc/ssl/botillsammans/fullchain2.pem; ssl_certificate_key /etc/ssl/botillsammans/privkey2.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # disable SSLv3 ssl_protocols TLSv1.2 TLSv1.1 TLSv1; ssl_prefer_server_ciphers on; ssl_ciphers '........'; ssl_dhparam /etc/ssl/botillsammans/dhparams.pem; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/ssl/botillsammans/chain2.pem; resolver 8.8.8.8 8.8.4.4 valid=86400; resolver_timeout 10; location / { include /etc/Nginx/uwsgi_params; uwsgi_pass flask; } }

uWsgi的Dockerfile:

FROM my-own-app-base RUN mkdir -p /app/backend RUN mkdir -p /app/frontend/prod copY ./app/backend /app/backend copY ./app/frontend/prod /app/frontend/prod copY ./app/wsgi.py /app RUN mkdir /uwsgi copY ./app.ini /uwsgi workdir /uwsgi CMD ["uwsgi","--thunder-lock","--ini","/uwsgi/app.ini"]

我的app.ini(uWsgi文件):

[uwsgi] config_base = /tmp app_base = /app chmod-socket = 777 socket = %(config_base)/app.sock pidfile = %(config_base)/app.pid stats = %(config_base)/app.stats.sock chdir = %(app_base) wsgi-file = wsgi.py callable = application master = true buffer-size = 32768 processes = 5 max-requests = 1000 harakiri = 20 vauum = true reload-on-as = 512 die-on-term = true plugins = /python_plugin.so

一个有趣的事情是,如果我进入正在运行的uWsgi容器,更改Flask应用程序的端口并运行uwsgi --ini /uwsgi/app.ini ,请按Ctrl + C一次,然后应用程序将启动并按预期工作(即,我可以访问浏览器中的网站,一切正常)。

我的docker-compose.yml文件

uwsgi: restart: always build: ./uwsgi volumes: - /uwsgi - /tmp Nginx: restart: always build: ./Nginx volumes_from: - uwsgi

来自Docker日志的日志:

uwsgi_1 | [uWsgi] getting INI configuration from /uwsgi/app.ini uwsgi_1 | *** Starting uWsgi 2.0.11.2 (64bit) on [Tue May 10 19:13:13 2016] *** uwsgi_1 | compiled with version: 5.2.0 on 29 October 2015 23:59:33 uwsgi_1 | os: Linux-3.19.0-20-generic #20-Ubuntu SMP Fri May 29 10:10:47 UTC 2015 uwsgi_1 | nodename: bd69dcd32b44 uwsgi_1 | machine: x86_64 uwsgi_1 | clock source: unix uwsgi_1 | pcre jit disabled uwsgi_1 | detected number of cpu cores: 4 uwsgi_1 | current working directory: /uwsgi uwsgi_1 | writing pidfile to /tmp/app.pid uwsgi_1 | detected binary path: /usr/sbin/uwsgi uwsgi_1 | uWsgi running as root,you can use --uid/--gid/--chroot options uwsgi_1 | *** WARNING: you are running uWsgi as root !!! (use the --uid flag) *** uwsgi_1 | chdir() to /app uwsgi_1 | your processes number limit is 524288 uwsgi_1 | your memory page size is 4096 bytes uwsgi_1 | *** WARNING: you have enabled harakiri without post buffering. Slow upload Could be rejected on post-unbuffered webservers *** uwsgi_1 | detected max file descriptor number: 524288 uwsgi_1 | lock engine: pthread robust mutexes uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | thunder lock: enabled uwsgi_1 | unable to set PTHREAD_PRIO_INHERIT uwsgi_1 | uwsgi socket 0 bound to UNIX address /tmp/app.sock fd 3 uwsgi_1 | Python version: 2.7.11 (default,Jan 23 2016,12:34:14) [GCC 5.3.0] uwsgi_1 | *** Python threads support is disabled. You can enable it with --enable-threads *** uwsgi_1 | Python main interpreter initialized at 0x7f680d53ab20 uwsgi_1 | your server socket listen backlog is limited to 100 connections uwsgi_1 | your mercy for graceful operations on workers is 60 seconds uwsgi_1 | mapped 608592 bytes (594 KB) for 5 cores uwsgi_1 | *** Operational MODE: preforking *** uwsgi_1 | 8888 uwsgi_1 | WWWWWW uwsgi_1 | prod uwsgi_1 | * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

我注意到这些日志消息不会显示出来(就像我们按照上面的指示启动另一个uWsgi实例一样):

Wsgi app 0 (mountpoint='') ready in 9 seconds on interpreter 0x7f6285a21b80 pid: 17 (default app) *** uWsgi is running in multiple interpreter mode *** spawned uWsgi master process (pid: 17) spawned uWsgi worker 1 (pid: 24,cores: 1) spawned uWsgi worker 2 (pid: 25,cores: 1) spawned uWsgi worker 3 (pid: 26,cores: 1) spawned uWsgi worker 4 (pid: 27,cores: 1) spawned uWsgi worker 5 (pid: 28,cores: 1) *** Stats server enabled on /tmp/app.stats.sock fd: 17 ***

这两个容器只以root身份运行,一切都由root拥有。 我知道,不安全,我会改变这一切,当我得到一切运行,承诺。

所以我想我的问题是为什么不能uWsgi完全启动?

编辑#1:

wsgi.py文件(我知道我可以删除if语句,它只是在testing时给我的):

#!/usr/bin/env python # coding=utf-8 from backend.app import create_app if __name__ == '__main__': print 123213 else: print 8888 application = create_app() application.run(host='0.0.0.0',port=8080,debug=True,use_reloader=False)

在前面的文本中调用的create_app函数

def create_app(config_object=ProdConfig): config = 'dev' if config_object.ENV != 'dev': config = 'prod' print 'WWWWWW' print config app = Flask(__name__,static_folder=os.getcwd() + '/frontend/' + config,static_url_path='/s') app.config.from_object(config_object) return app

FlaskApp使用mod_wsgi在apache中返回http 500

Flask + uwsgi + Nginx:内存何时发布?

Gunicorn和烧瓶蓝图

上传文件Nginx + uwsgi

Gunicorn未能加载Flask应用程序

所以事实证明这是一个简单的解决方法,所需要的只是将wsgi.py文件更改为:

#!/usr/bin/env python # coding=utf-8 from backend.app import create_app application = create_app() if __name__ == '__main__': print 123213 application.run(host='0.0.0.0',use_reloader=False) else: print 8888

这是因为uWsgi调用application并创建自己的本地Wsgi服务器。 感谢一大堆@warmoverflow !

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐