在Docker中将PHP-FPM与Nginx放在不同的容器中(共享init.d响应)

66次阅读
没有评论

问题描述

在他的项目中使用了Docker设置,其中包括PHP-FPM、Nginx和应用程序所需的许多其他服务。但是在PHP应用程序中,他需要检查init.d/nginx configtest命令,以检查为基于租户的服务生成的新动态Vhosts(通过卷共享)。他的主要问题是如何共享nginx configtest命令的响应。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

为了在容器之间共享nginx configtest命令的响应,可以使用docker-gennginx-proxy来简化操作。
以下是使用docker-gen的解决方案步骤:
1. 安装docker-gen工具。
2. 创建一个模板文件,用于生成Nginx配置文件。
3. 在模板文件中使用{{.Env}}语法来获取环境变量的值,以自定义生成的Nginx配置文件。
4. 运行docker-gen命令,监听Docker的sock文件,并根据容器的标签生成Nginx配置文件。
5. 配置Nginx容器,使其加载生成的Nginx配置文件。
下面是一个示例的docker-gen配置文件:

# docker-gen配置文件
{{ $NGINX_CONFIG := "/etc/nginx/conf.d/default.conf" }}
{{ $NGINX_TEMPLATE := "/etc/nginx/templates/default.tmpl" }}

# 监听Docker的sock文件,并根据容器的标签生成Nginx配置文件
{{ range $key, $value := . }}
{{ if eq $key "docker" }}
{{ range $container := $value }}
{{ if eq $container.Labels.nginx "true" }}
{{ $vhost := $container.Labels.vhost }}
{{ $config := printf "%s/%s.conf" $NGINX_CONFIG $vhost }}
{{ $template := printf "%s/%s.tmpl" $NGINX_TEMPLATE $vhost }}
{{ if not (fileExists $config) }}
{{ template $template $container > $config }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

在上面的示例中,我们使用docker-gen工具监听Docker的sock文件,并根据容器的标签生成Nginx配置文件。我们使用了一个模板文件来生成Nginx配置文件,模板文件中使用了{{.Env}}语法来获取环境变量的值,以自定义生成的Nginx配置文件。生成的Nginx配置文件将被保存在/etc/nginx/conf.d目录下。
请注意,这只是一个示例配置文件,你需要根据自己的需求进行修改和调整。

方案2

使用docker-gennginx-proxy工具可以简化操作,但需要注意版本差异及修改前做好备份。
另一种方法是使用docker-gennginx-proxy工具来自动生成Nginx配置文件,并实时监测Vhosts文件夹的变化。当Vhosts文件夹中的文件发生变化时,这些工具将自动重新加载Nginx服务。
以下是使用docker-gennginx-proxy的解决方案步骤:
1. 安装docker-gennginx-proxy工具。
2. 创建一个模板文件,用于生成Nginx配置文件。
3. 在模板文件中使用{{.Env}}语法来获取环境变量的值,以自定义生成的Nginx配置文件。
4. 运行docker-gen命令,监听Docker的sock文件,并根据容器的标签生成Nginx配置文件。
5. 配置Nginx容器,使其加载生成的Nginx配置文件。
6. 配置docker-gennginx-proxy工具,使其实时监测Vhosts文件夹的变化,并在变化发生时重新加载Nginx服务。
下面是一个示例的docker-gennginx-proxy配置文件:

# docker-gen配置文件
{{ $NGINX_CONFIG := "/etc/nginx/conf.d/default.conf" }}
{{ $NGINX_TEMPLATE := "/etc/nginx/templates/default.tmpl" }}

# 监听Docker的sock文件,并根据容器的标签生成Nginx配置文件
{{ range $key, $value := . }}
{{ if eq $key "docker" }}
{{ range $container := $value }}
{{ if eq $container.Labels.nginx "true" }}
{{ $vhost := $container.Labels.vhost }}
{{ $config := printf "%s/%s.conf" $NGINX_CONFIG $vhost }}
{{ $template := printf "%s/%s.tmpl" $NGINX_TEMPLATE $vhost }}
{{ if not (fileExists $config) }}
{{ template $template $container > $config }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

# nginx-proxy配置文件
{{ $VHOSTS_DIR := "/etc/nginx/vhosts" }}
{{ $NGINX_CONFIG := "/etc/nginx/conf.d/default.conf" }}

# 监听Vhosts文件夹的变化,并重新加载Nginx服务
{{ range $key, $value := . }}
{{ if eq $key "file" }}
{{ range $file := $value }}
{{ if eq $file.Path $VHOSTS_DIR }}
{{ if eq $file.Event "create" }}
{{ exec "nginx" "-s" "reload" }}
{{ end }}
{{ if eq $file.Event "write" }}
{{ exec "nginx" "-s" "reload" }}
{{ end }}
{{ if eq $file.Event "remove" }}
{{ exec "nginx" "-s" "reload" }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

在上面的示例中,我们使用docker-gen工具监听Docker的sock文件,并根据容器的标签生成Nginx配置文件。我们使用了一个模板文件来生成Nginx配置文件,模板文件中使用了{{.Env}}语法来获取环境变量的值,以自定义生成的Nginx配置文件。生成的Nginx配置文件将被保存在/etc/nginx/conf.d目录下。
我们还使用了nginx-proxy工具监听Vhosts文件夹的变化,并在变化发生时重新加载Nginx服务。
请注意,这只是一个示例配置文件,你需要根据自己的需求进行修改和调整。

方案3

使用脚本或工具来管理Nginx配置文件的生成和重新加载可能会增加复杂性,并且需要确保容器之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制Nginx配置文件的生成和重新加载。你可以使用docker-gennginx-proxy或其他类似的工具来自动生成Nginx配置文件,并在Vhosts文件夹中的文件发生变化时重新加载Nginx服务。
以下是一个简单的bash脚本示例,可以在Vhosts文件夹中的文件发生变化时重新加载Nginx服务:

#!/bin/bash
# 监听Vhosts文件夹的变化,并重新加载Nginx服务
while true; do
  inotifywait -e create,modify,delete -r /path/to/vhosts
  nginx -s reload
done

在这个示例中,我们使用inotifywait命令监听Vhosts文件夹的变化,并在文件发生变化时使用nginx -s reload命令重新加载Nginx服务。
请注意,这只是一个示例脚本,你需要根据自己的需求进行修改和调整。

方案4

使用docker-gennginx-proxy工具可以简化操作,但需要注意版本差异及修改前做好备份。
另一种方法是使用docker-gennginx-proxy工具来自动生成Nginx配置文件,并实时监测Vhosts文件夹的变化。当Vhosts文件夹中的文件发生变化时,这些工具将自动重新加载Nginx服务。
以下是使用docker-gennginx-proxy的解决方案步骤:
1. 安装docker-gennginx-proxy工具。
2. 创建一个模板文件,用于生成Nginx配置文件。
3. 在模板文件中使用{{.Env}}语法来获取环境变量的值,以自定义生成的Nginx配置文件。
4. 运行docker-gen命令,监听Docker的sock文件,并根据容器的标签生成Nginx配置文件。
5. 配置Nginx容器,使其加载生成的Nginx配置文件。
6. 配置docker-gennginx-proxy工具,使其实时监测Vhosts文件夹的变化,并在变化发生时重新加载Nginx服务。
下面是一个示例的docker-gennginx-proxy配置文件:

# docker-gen配置文件
{{ $NGINX_CONFIG := "/etc/nginx/conf.d/default.conf" }}
{{ $NGINX_TEMPLATE := "/etc/nginx/templates/default.tmpl" }}

# 监听Docker的sock文件,并根据容器的标签生成Nginx配置文件
{{ range $key, $value := . }}
{{ if eq $key "docker" }}
{{ range $container := $value }}
{{ if eq $container.Labels.nginx "true" }}
{{ $vhost := $container.Labels.vhost }}
{{ $config := printf "%s/%s.conf" $NGINX_CONFIG $vhost }}
{{ $template := printf "%s/%s.tmpl" $NGINX_TEMPLATE $vhost }}
{{ if not (fileExists $config) }}
{{ template $template $container > $config }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

# nginx-proxy配置文件
{{ $VHOSTS_DIR := "/etc/nginx/vhosts" }}
{{ $NGINX_CONFIG := "/etc/nginx/conf.d/default.conf" }}

# 监听Vhosts文件夹的变化,并重新加载Nginx服务
{{ range $key, $value := . }}
{{ if eq $key "file" }}
{{ range $file := $value }}
{{ if eq $file.Path $VHOSTS_DIR }}
{{ if eq $file.Event "create" }}
{{ exec "nginx" "-s" "reload" }}
{{ end }}
{{ if eq $file.Event "write" }}
{{ exec "nginx" "-s" "reload" }}
{{ end }}
{{ if eq $file.Event "remove" }}
{{ exec "nginx" "-s" "reload" }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{ end }}

在上面的示例中,我们使用docker-gen工具监听Docker的sock文件,并根据容器的标签生成Nginx配置文件。我们使用了一个模板文件来生成Nginx配置文件,模板文件中使用了{{.Env}}语法来获取环境变量的值,以自定义生成的Nginx配置文件。生成的Nginx配置文件将被保存在/etc/nginx/conf.d目录下。
我们还使用了nginx-proxy工具监听Vhosts文件夹的变化,并在变化发生时重新加载Nginx服务。
请注意,这只是一个示例配置文件,你需要根据自己的需求进行修改和调整。

正文完