我使用以下manifest.yml文件将Django / Gunicorn + whitenoise(用于静态文件服务)作为单个应用程序在Cloud Foundry中工作:
---
applications:
- name: mydjango
instances: 1
command: src/tvpv_portal/bin/start_gunicorn_django.sh
memory: 2048M
disk_quota: 1024M
buildpacks:
- https://github.com/cloudfoundry/python-buildpack.git
stack: cflinuxfs3
env:
DJANGO_MODE: Production
为了学习/实验,我想删除白噪声并使用nginx_buildpack设置Nginx以与Django / Gunicorn一起使用。但是,我不确定如何在单个应用程序上使用多个buildpack。我已按照nginx.conf
的指示在项目目录中创建了mime.types
,buildpack.yml
和https://docs.cloudfoundry.org/buildpacks/nginx/index.html。
nginx.conf
daemon off;
error_log /home/vcap/app/nginx-error.log;
events { worker_connections 1024; }
http {
log_format cloudfoundry '$http_x_forwarded_for - $http_referer - [$time_local] "$request" $status $body_bytes_sent';
access_log /home/vcap/app/nginx-access.log cloudfoundry;
default_type application/octet-stream;
include mime.types;
sendfile on;
gzip on;
tcp_nopush on;
keepalive_timeout 30;
port_in_redirect off; # Ensure that redirects don't include the internal container PORT - 8080
server {
listen {{port}};
server_name localhost;
# Serve static files.
location /static/ {
alias /home/vcap/app/src/tvpv_portal/static/;
}
# Serve media files.
location /media/ {
alias /home/vcap/app/src/tvpv_portal/media/;
}
# Reverse proxy to forward to main app.
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:8000;
}
}
}
我尝试做cf push mydjango -b nginx_buildpack -b python_buildpack
。但是从文档看,似乎只有最后一个buildpack才能启动命令。前面的buildpacks中的命令将被忽略。因此,我无法启动Nginx服务器。如何正确设置多个构建包?
我确实读过CloudFoundry: nginx for serving static content on top of Gunicorn (Docker),但响应是关于拥有两个具有不同路由的独立应用程序。由于这更多的是用于CF的学习/实验,所以我想知道是否可以使用单个应用程序而不用分离静态内容。谢谢您的帮助。
对于生产工作负载(或任何重要的工作),您确实不想将多个逻辑上分开的进程放入一个容器中。主要原因是这样很难扩展您的应用程序。假设您的应用程序越来越流行,并且您需要更多的Django处理程序来处理负载,而Nginx和Django都在同一个容器中,因此您必须将两者一起扩大。如果它们是单独的应用程序,则可以根据每个逻辑过程的需要独立缩放它们。
还有其他痛点:
无论如何,如果您仍然想将两者都塞进同一个应用程序中,则有两种选择。
您可以简单地通过cf push -c
或通过将command:
添加到manifest.yml中来控制启动命令。这将允许您覆盖最终buildpack设置的命令。请注意,因为它将完全覆盖buildpack设置的内容,因此您确实需要知道要调用的正确命令,否则您的应用程序将无法启动(对于启动命令可能很复杂的Java应用程序,这尤其棘手)。 >
您可以将.profile
文件拖放到应用程序目录的根目录(即设置cf push -p
的位置)。该脚本将在最终buildpack设置的命令之前执行,您可以使用它在后台启动其他进程。
如上所述,在使用上述方法时,要使两个进程都正确退出是特别棘手的。这是我发现的一种可帮助您的黑客:
#!/bin/bash set -e run_second_process() { # insert the command to run the second process here # it should run and keep running (i.e. foreground) nginx -c nginx.conf # should never get to here, if it does the app crashed pkill python # insert name of your primary process # now we are all dead and the container will restart } # runs the second process in the background # that is important otherwise the primary process will never run run_updater &
您需要找出解决其他缺点的方法,或者只是切换到使用多个应用程序。希望能有所帮助!