我有一个简单的python / flask应用程序。在container
/var/www/app/
appl/
static/
...
app.py
wsgi.py
在使用docker之前,我曾经让nginx直接提供静态文件。像这样:
location /static {
alias /var/www/www.domain.com/appl/static;
}
location / {
uwsgi_pass unix:///tmp/uwsgi/www.domain.com.sock;
include uwsgi_params;
}
但现在静态文件位于容器内部,nginx无法访问。
我可以想到两种可能的解决方案:
像以前一样在容器内启动一个nginx,让主机nginx使用像8000这样的端口与容器nginx进行通信
将(host)/var/www/www.domain.com/static
安装到(container)/var/www/static
并复制run.sh
码头工人更喜欢什么?
答案 0 :(得分:1)
我更喜欢第一个解决方案,因为它与构建12 factor app的因子7保持一致:暴露端口上的所有服务。对于通过Nginx运行两次的请求肯定会有一些开销,但它可能不足以担心(如果它只是在你的池中添加更多容器)。在容器启动后使用自定义运行脚本执行主机端工作将使用Docker生态系统中的工具扩展应用程序变得非常困难。
答案 1 :(得分:1)
我不喜欢第一种解决方案,因为在一个容器上运行多个服务并不是一种泊坞方式。
总的来说,我们希望将静态文件夹暴露给nginx,然后Volume是最佳选择。但是有一些不同的方法可以做到这一点。
如您所述,将(host)/var/www/www.domain.com/static
挂载到(container)/var/www/static
并复制run.sh
使用nginx缓存,让nginx为您缓存静态文件。 例如,我们可以写这样的conf,让nginx用30min解析静态内容
-
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:30m max_size=1G;
upstream app_upstream {
server app:5000;
}
location /static {
proxy_cache cache;
proxy_cache_valid 30m;
proxy_pass http://app_upstream;
}