Nginx

Docker - 分別縮放 nginx 和 php-fpm

  • September 27, 2019

我一直在玩 docker 和 docker-compose 並且有一個問題。

目前我的 docker-compose.yml 看起來像這樣:

app:
   image: myname/php-app
   volumes:
       - /var/www
   environment:
       <SYMFONY_ENVIRONMENT>: dev

web:
   image: myname/nginx
   ports:
       - 80
   links:
       - app
   volumes_from:
       - app

應用程序包含埠 9000 上的 php-fpm 和我的應用程式碼。Web 是帶有一些配置的 nginx。

這可以實現我期望的功能,但是為了將 nginx 連接到 php-fpm,我有這一行:

fastcgi_pass    app:9000;

我怎樣才能有效地擴展它?例如,如果我想執行一個 nginx 容器但執行三個應用程序容器,那麼我肯定會有三個 php-fpm 實例都在嘗試監聽埠 9000。

我怎樣才能讓每個 php-fpm 實例在不同的埠上,但在任何給定時間仍然知道它們在我的 nginx 配置中的位置?

我採取了錯誤的方法嗎?

謝謝!

一種解決方案是將額外的 php-fpm 實例添加到您的 docker-compose 文件中,然後使用其他答案中提到的 nginx 上游來實現它們之間的負載平衡。這是在此範例 docker-compose repo 中完成的:https ://github.com/iamyojimbo/docker-nginx-php-fpm/blob/master/nginx/nginx.conf#L137

upstream php {
   #If there's no directive here, then use round_robin.
   #least_conn;
   server dockernginxphpfpm_php1_1:9000;
   server dockernginxphpfpm_php2_1:9000;
   server dockernginxphpfpm_php3_1:9000;
}

這並不是很理想,因為當您想擴大或縮小規模時,它需要更改 nginx 配置和 docker-compose.yml。

請注意,9000 埠是容器內部的,而不是您的實際主機,因此您在埠 9000 上有多個 php-fpm 容器並不重要。

Docker 在今年秋天收購了 Tutum。他們有一個解決方案,將 HAProxy 容器與他們的 api 結​​合起來,以自動將負載均衡器配置調整為正在執行的容器,即負載均衡。這是一個很好的解決方案。然後 nginx 指向分配給負載均衡器的主機名。也許 Docker 會在收購 Tutum 之後進一步將這種類型的解決方案集成到他們的工具中。這裡有一篇關於它的文章:https://web.archive.org/web/20160628133445/https: //support.tutum.co/support/solutions/articles/5000050235-load-balancing-a-web-service

Tutum 目前是一項付費服務。Rancher 是一個提供類似負載平衡功能的開源項目。他們還有一個“rancher-compose.yml”,它可以在 docker-compose.yml 中定義服務設置的負載平衡和縮放。 http://rancher.com/the-magical-moment-when-container-load-balancing-meets-service-discovery/ http://docs.rancher.com/rancher/concepts/#load-balancer

更新 2017/03/06:我使用了一個名為interlock的項目,它與 Docker 一起使用來自動更新 nginx 配置並重新啟動它。另請參閱@iwaseatenbyagrue 的答案,其中有其他方法。

引用自:https://serverfault.com/questions/693509