gpt4 book ai didi

docker - 同时使用nginx模板功能和重新加载解决方案

转载 作者:行者123 更新时间:2023-12-02 19:44:36 25 4
gpt4 key购买 nike

我有一个同时使用nginx的docker项目,让我们用certbot加密。
我是Docker的新手,对于我的Nginx镜像,我使用的功能是帮助我在Nginx配置中使用环境变量。
在一个著名的教程上,他们使用此命令来启动nginx并自动重新加载它

command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
问题是,当我使用此命令而不是基本命令时,我的模板不再转换为有效的nginx conf。
我希望能够重新加载nginx,但我也希望nginx以有效的nginx配置转换我的模板。
请问我该如何实现?
这是我的docker-compose.yml
version: '3'

services:
db:
image: mysql
environment:
- MYSQL_DATABASE=${DATABASE_NAME}
- MYSQL_USER=${DATABASE_USER}
- MYSQL_PASSWORD=${DATABASE_PASSWORD}
- MYSQL_ROOT_PASSWORD=${DATABASE_ROOT_PASSWORD}
ports:
- "3306:3306"
volumes:
- ./db/data:/var/lib/mysql

adminer:
image: adminer
restart: always
environment:
- ADMINER_DESIGN=lucas-sandery
ports:
- 8080:8080

php-fpm:
build:
context: ./php-fpm
depends_on:
- db
environment:
- APP_ENV=${APP_ENV}
- APP_SECRET=${APP_SECRET}
- DATABASE_URL=mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@db:3306/${DATABASE_NAME}?serverVersion=5.7
volumes:
- ../app:/var/www

node:
image: node:alpine
volumes:
- ../app:/var/www
working_dir: /var/www
command: "/bin/sh -c 'yarn install ; yarn run watch'"

nginx:
image: nginx:alpine
volumes:
- ../app:/var/www
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/templates:/etc/nginx/templates
- ./logs:/var/log
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
depends_on:
- php-fpm
ports:
- "80:80"
- "443:443"
environment:
- APP_DOMAIN=${APP_DOMAIN}

certbot:
image: certbot/certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
还有我的site.template.conf文件
upstream php-upstream {
server php-fpm:9000;
}

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

server_name ${APP_DOMAIN};

location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

location / {
return 301 https://$host$request_uri;
}
}

server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server ipv6only=on;

ssl_certificate /etc/letsencrypt/live/${APP_DOMAIN}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/${APP_DOMAIN}/privkey.pem;

include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

server_name ${APP_DOMAIN};
root /var/www/public;
index index.php index.html index.htm;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}
}
谢谢

最佳答案

您可以在restart: always docker-compose.yml部分中添加nginx来处理错误导致的服务退出,并且如果您要手动触发它,则可以在 shell 中的docker-compose restart nginx文件所在的文件夹中发出yml
我不知道您是否故意遗漏了诸如${APP_DOMAIN}之类的问题敏感信息,但是如果您想插入这些值,则可以使用docker secrets。您可以在此处阅读有关Docker secret 的更多信息:https://docs.docker.com/engine/swarm/secrets/
(提示:您不需要使用swarm来拥有 secret ,在此链接的末尾有一个docker-compose示例。只要您使用它启动服务,就不需要swarm。)
编辑
因此,问题在于您不能在nginx conf文件上替换环境变量。您是否看到过:https://github.com/docker-library/docs/tree/master/nginx#using-environment-variables-in-nginx-configuration-new-in-119
我在这里找到此信息:https://serverfault.com/a/1022249/80400

如果要每6小时重新加载nginx,为什么不使用crontab?您可以将所有内容保持不变,并在crontab中执行:

* */6 * * * cd /home/to/docker-compose.yml/ && docker-compose exec nginx -s reload > /var/log/reloading_nginx.log
(我认为 docker-compose exec而不是 docker-compose run是正确的命令)。

关于docker - 同时使用nginx模板功能和重新加载解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64295360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com