首页 > 解决方案 > Nginx https 问题 docker-compose

问题描述

我在让我的 Web 应用程序使用 https 正确启动时遇到问题。目前,当尝试访问该站点时,它看起来像这样,带有 404 错误

我的docker-compose.yml文件如下:

version: '3'
services:
nginx:
restart: always
image: nginx:latest
container_name: nginx
volumes:
  - ./nginx.conf:/home/comas/COMAS/COMAS-Docker/nginx.conf
  - ./ssl:/home/comas/COMAS/COMAS-Docker/certs/
ports:
  - "80:80"
  - "443:443"
  - "5000:5000"
  - "3000:3000"
networks:
  - ephemeris-public
depends_on:
  - api
  - ephemeris-web
db:
restart: always
image: mysql:latest
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS}
  MYSQL_USER: ${MYSQL_USER_NAME}
  MYSQL_PASS: ${MYSQL_USER_PASS}
  MYSQL_DATABASE: ${MYSQL_DB_NAME}
volumes:
  - db-datavolume:/var/lib/mysql
ports:
  - "3306:3306"
networks:
  - api
api:
image: localhost:6969/comas-api:latest
expose:
  - "5000"
volumes:
  - ${API_LOCATION}:/app
depends_on:
  - db
networks:
  - api
  - ephemeris-public
  ephemeris-web:
  image: localhost:6969/ephemeris-ui:latest
  command: npm start
  expose:
  - "443"
environment:
  NODE_TLS_REJECT_UNAUTHORIZED: 0
  NODE_ENV: 'production'
  #    volumes:
  # - ${EPHEMERIS_UI_LOCATION}:/app
  networks:
  - ephemeris-public
  depends_on:
  - api
  portainer:
  image: portainer/portainer
  restart: always
  user: "${DOCKER_UID}:${DOCKER_GID}"
  networks:
  - ephemeris-public
  ports:
  - "9000:9000"
  - "8000:8000"
  volumes:
  - /var/run/docker.sock:/var/run/docker.sock
  - portainer_data:/portainer_data
  volumes:
  db-datavolume:
  portainer_data:
  networks:
  ephemeris-public:
  api:

我的nginx.conf文件如下:

# Prints everything going wrong to standard error output
error_log stderr;

events {
    worker_connections  4096;  ## Default: 1024
}

http {
    # Prints everything nginx is doing to standard output
    access_log /dev/stdout;

    # Location of the API
    upstream docker-api {
        server api:5000;
    }

    # Location of the Ephemeris interface
    upstream docker-ephemeris-web {
        server ephemeris-web:443;
    }

    # Grants access to ephemeris over port 443 (HTTPS)
    server {
        listen 443;
        listen [::]:443;

        ssl on;
        ssl_certificate /home/comas/COMAS/nginx/bundle.crt;
        ssl_certificate_key /home/comas/COMAS/nginx/ephermis.key;

        root /var/www/html;
        server_name ephemeris.ecrl.organization.edu;

        location / {
            try_files $uri $uri/ =404;
        }
    }

    # Redirect to https(HTTPS)
    server {
        listen 80;
        listen [::]:80;

        server_name ephemeris.ecrl.organization.edu;
        return 301 https://ephemeris.ecrl.organization.edu;
    }

    # Grants access to ephemeris over port 3000, its default port
    server {
        listen 443;

        location / {
            proxy_pass https://docker-ephemeris-web;
        }
    }

    server {
        listen 5000;
        location / {
            # Aight if we're being honest I just slapped everything on here until it worked, I'll fix it up later
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass https://docker-api;
            proxy_ssl_session_reuse off;
            proxy_ssl_verify off;
            proxy_set_header Host $https_host;
            proxy_set_header X_FORWARDED_PROTO https;
            proxy_redirect off;
        }
    }
}

这是我从 portainer 的 nginx 容器日志中截取的屏幕截图:

这是我第一次做任何与 docker、docker-compose 或 nginx 相关的事情,所以我只是不确定我哪里出错了。如果这篇文章中没有列出任何有助于找出解决方案的信息,请告诉我。谢谢大家的时间。

标签: dockernginxhttpsdocker-compose

解决方案


您已经开始使用这些技术迈出了相当复杂的第一步。开始更简单,逐步增加复杂性可能会更容易,学习体验更好。例如,首先从一个普通的 nginx Docker 容器开始,让它工作,然后更新你的nginx.conf并让你的 https 重定向工作。然后更新您的 docker-compose 以添加您的数据库并使其正常工作......等等,一步一步,最后添加您的 API,这本身就是一个相当复杂的部分。从这样一个复杂的配置作为您的第一步开始,您将 - 可以理解 - 不知道当它不起作用时要查看哪些移动部件拼图。

我的猜测是您将面临一系列问题,当您修复前一个问题时,每个新问题都会暴露出来。

无论如何,从我能看到的第一个开始。您已将您的映射nginx.conf到容器中:

- ./nginx.conf:/home/comas/COMAS/COMAS-Docker/nginx.conf

但是 nginx 不会知道的。 您正在使用的 nginx Docker 映像的文档显示(请参阅“复杂配置”),nginx.confnginx 服务器使用的/etc/nginx/nginx.conf. 如果你想让 nginx 使用你的 conf,你需要把它映射到那里:

- ./nginx.conf:/etc/nginx/nginx.conf

现在你的 conf 完全被忽略了,nginx 只是愉快地使用它正常的默认 conf,它在正常的默认位置保持不变。

一旦你解决了这个问题,我怀疑你会遇到下一个问题。一些注意事项:

  • 根据您的措辞,我认为您担心 404 for favicon.ico. 每个浏览器都会自动寻找一个 favicon,以显示在浏览器选项卡中。许多站点都没有,因此您一直在日志中看到这些请求的 404。这没什么好担心的——除非您已经添加了 afavicon.ico并且想知道为什么它没有出现。

  • 屏幕截图显示您正在访问一个 IP 地址 -server您的哪个块nginx.conf应该处理它?它们都有一个server_name(不包括 IP),并且没有一个被标记为default_server. 我不确定那里会发生什么。为避免疑虑,您可能应该设置一个默认服务器,并且无论如何使用您的服务器名称来访问该站点。

  • 我确信它就在 SO 中(否则你会看到各种错误)但是你的 docker-compose 的格式都被破坏了。如果您花一些时间并使用您在真实文件中使用的正确格式,其他人会更容易帮助您 - 它更容易阅读,我们甚至可以复制粘贴并自己尝试。


推荐阅读