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

标签 docker nginx lets-encrypt certbot

我有一个同时使用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/

相关文章:

java - 在远程调试中暂停 Spring Boot Java 应用程序时,ECS 代理停止并重新启动 Docker 容器

docker - Hyperledger Fabric CLI 容器错误

ssl - letsencrypt似乎正在将域名重定向到81.21.76.62

ssl - Letsencrypt 在 Windows 上生成的文件 - 什么是什么?

ssl - letsencrypt 和 nginx 404 错误

postgresql - Postgres Docker 镜像未使用自定义名称创建数据库

docker - 需要 'y'响应的Docker构建镜像

php - 减小 docker 镜像的大小

django - 在 Nginx 后面通过 HTTPS 访问 Django Admin

php - Nginx 不执行 PHP