gpt4 book ai didi

docker - Docker-compose + Nginx + Certbot +简单的Django Rest Framework应用

转载 作者:行者123 更新时间:2023-12-02 21:29:54 25 4
gpt4 key购买 nike

我正在尝试使用Docker将简单的Django Rest Framework应用程序部署到生产服务器。我的目标是为常规的Let'sEncrypt SSL同时安装带有代理和Certbot的Nginx。我在DockerFiles和docker-compose中管理我的依赖项。
因此,文件夹结构具有以下 View :

  • 应用
  • DockerFile

  • nginx
  • DockerFile
  • init-letsencrypt.sh
  • nginx.conf

  • docker-compose.yml

  • 我的想法是将所有配置保存在app / docker-compose.yml中,并从同一源启动许多不同的实例。但是我在app / DockerFile中没有任何nginx或certbot配置-仅适用于Django Rest Framework,并且运行良好。但是在 docker-compose.yml 中,我有以下代码:
    version: '3'

    'services':
    app:
    container_name: djangoserver
    command: gunicorn prototyp.wsgi:application --env DJANGO_SETTINGS_MODULE=prototyp.prod_settings --bind 0.0.0.0:8000 --workers=2 --threads=4 --worker-class=gthread
    build:
    context: ./api
    dockerfile: Dockerfile
    restart: always
    ports:
    - "8000:8000"
    depends_on:
    - otherserver
    otherserver:
    container_name: otherserver
    build:
    context: ./otherserver
    dockerfile: Dockerfile
    restart: always
    nginx:
    build: ./nginx
    ports:
    - 80:80
    depends_on:
    - app
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
    certbot:
    image: certbot/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

    这使我可以构建“app”,“otherserver”,“nginx”和“certbot”。
    最重要的部分在“nginx”文件夹中。
    我使用了 this manual,并按照描述的方式从源代码中克隆了文件“init-letsencrypt.sh”。然后我试着重击它:
    nginx / DockerFile :
    FROM nginx:1.19.0-alpine
    RUN rm /etc/nginx/conf.d/default.conf
    COPY nginx.conf /etc/nginx/conf.d
    RUN mkdir -p /usr/src/app
    COPY init-letsencrypt.sh /usr/src/app
    WORKDIR /usr/src/app
    RUN chmod +x init-letsencrypt.sh
    ENTRYPOINT ["/usr/src/app/init-letsencrypt.sh"]
    nginx / nginx.conf 中,我有以下代码:
    upstream django {
    server app:8000;
    }

    server {
    listen 80;
    server_name app.com www.app.com;
    location / {
    return 301 https://$host$request_uri;
    }
    }

    server {

    listen 443 ssl;
    server_name app.com www.app.com;
    access_log /var/log/nginx-access.log;
    error_log /var/log/nginx-error.log;

    ssl_certificate /etc/letsencrypt/live/app.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location ^/static/rest_framework/((img/|css/|js/|fonts).*)$ {
    autoindex on;
    access_log off;
    alias /usr/src/app/static/rest_framework/$1;
    }

    location / {
    proxy_pass http://django;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_body_buffer_size 256k;

    proxy_connect_timeout 120;
    proxy_send_timeout 120;
    proxy_read_timeout 120;

    proxy_buffer_size 64k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    client_max_body_size 100M;
    }
    }
    因此,使用此配置,当我执行“docker-compose build”时,构建可以正常进行,而不会出现任何错误,并且一切均已成功构建。但是,一旦我“docker-compose up”,我就遇到了certbot和nginx无法连接的问题,并且仅当我使用 http://app.com:8000而不是 https://app.com时,该应用程序才能运行。
    在控制台中,我没有任何错误。
    我做错了什么?我错过了什么?任何帮助将不胜感激。

    最佳答案

    如我所见,您尚未公开nginx容器的端口443:

    nginx:
    build: ./nginx
    ports:
    - 80:80
    - 443:443
    depends_on:
    添加更多的 443端口。

    关于docker - Docker-compose + Nginx + Certbot +简单的Django Rest Framework应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64707030/

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