Docker:具有ssl后端的nginx-proxy

时间:2019-02-26 13:16:54

标签: docker ssl nginx docker-compose nginx-reverse-proxy

我目前正在将wordpress应用进行容器化以进行开发。到目前为止,一切进展顺利:)

目前,我每个应用使用一个docker-compose.yml文件(和一些配置)。每个应用程序都由一个nginx网络服务器,一个数据库和带有fpm的wordpress组成。 (下面的示例docker-compose.yml)。每个应用程序都自己处理ssl,我已经确认它可以正常工作。

我的总体规划的下一步是使用nginx反向代理来同时启动所有应用程序容器,而无需使用主机上的其他端口。

据我了解,jwilder/nginx-proxy是工作的最佳工具。所以我在想-如果不是最佳实践,请纠正我-我可以为nginx-proxy创建一个compose.yml文件,该文件可以一直运行,并且在自动生成端口时将端口80和443暴露给主机之后我为每个容器旋转的nginx-configs。

version: '3.6'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx_proxy
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

networks:
  default:
    external:
      name: nginx-proxy

我尝试使用nginx-proxy将端口80暴露给主机,并使用mariadb:latest和wordpress:latest图像在其自己的docker-compose.yml文件中安装了wordpress应用程序。确实确实如此,只需添加暴露值:\ -80和VIRTUAL_HOST环境变量即可。

但是我在前面提到的wordpress应用之前还不太了解如何使用反向代理。该文档指出:

  

SSL后端

     

如果您希望反向代理使用HTTPS而不是HTTP连接到后端,请在后端容器上设置VIRTUAL_PROTO = https。

     

注意:如果使用VIRTUAL_PROTO = https并且后端容器公开端口80和443,则nginx-proxy将在端口80上使用HTTPS。这几乎肯定不是您想要的,因此您还应该包括VIRTUAL_PORT = 443。 / p>

所以我尝试将这些环境变量添加到应用程序的docker-compose.yml文件中。特别是在内部的nginx服务上,并添加了公开的端口80和443。

version: '3.6'
services:

  wordpress:
    image: wordpress:4.7.2-php7.1-fpm
    volumes:
      - ../public:/var/www/html
    environment:
      - WORDPRESS_DB_NAME=${WORDPRESS_DB_NAME:-wordpress}
      - WORDPRESS_TABLE_PREFIX=${WORDPRESS_TABLE_PREFIX:-wp_}
      - WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST:-mysql}
      - WORDPRESS_DB_USER=${WORDPRESS_DB_USER:-root}
      - WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD:-password}
    depends_on:
      - db
    restart: always

  db:
    image: mariadb:${MARIADB_VERSION:-latest}
    volumes:
      - tss-data:/var/lib/mysql
      # - ./db:/docker-entrypoint-initdb.d/
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-password}
      - MYSQL_USER=${MYSQL_USER:-root}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD:-password}
      - MYSQL_DATABASE=${MYSQL_DATABASE:-wordpress}
    restart: always

  nginx:
    image: nginx:${NGINX_VERSION:-latest}
    container_name: nginx
    volumes:
      - ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
      - ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
      - ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html
      - ${SSL_CERTS_DIR:-./certs}:/etc/letsencrypt
      - ${SSL_CERTS_DATA_DIR:-./certs-data}:/data/letsencrypt
    environment:
      - VIRTUAL_HOST:local.my-app.com
      - VIRTUAL_PROTO:https
      - VIRTUAL_PORT:443
    expose:
      - 80
      - 443
    depends_on:
      - wordpress
    restart: always

volumes:
  tss-data:

networks:
  default:
    external:
      name: nginx-proxy

A,如果我尝试通过端口80浏览至local.my-app.com, 503服务暂时不可用

如果我尝试使用端口443,nginx反向代理完全不响应。我觉得我似乎遗漏了一些明显的东西,但似乎找不到,我对此表示感谢。

1 个答案:

答案 0 :(得分:0)

最后,我选择不处理每个应用程序中的SSL加密。但是相反,我将反向代理更改为

version: '3.6'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: nginx_proxy
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: unless-stopped

networks:
  default:
    external:
      name: nginx-proxy

现在,我可以在端口80上访问每个应用程序,直到为其添加证书为止,在这种情况下,它可以在端口443上访问。