繁体   English   中英

docker docker-compose multiple sub.domains with SSL/ port 443 & Apache ssl.conf VirtualHost and Dockerfile

[英]docker docker-compose multiple sub.domains with SSL/ port 443 & Apache ssl.conf VirtualHost and Dockerfile

如何使用子域而不需要使用附加到 sub_n.domain.com:444 的端口号

我有:

  • 多个 sub.domains.com 通过 DNS 重定向到我的 VPS(sub1.sub2.sub3.)
  • every.sub_n 应与其自己的 (L)AMP-Stack-Containers 连接(它们在 Ubuntu 上运行。使用相同的 Kernel 加一个 Apache-PHP-Container 每个具有 sub1 / sub2 / sub3 服务加上数据库和 phpMyAdmin )
  • 每个 sub_n 都有自己的目录,例如 sub1/ 有自己的 docker-compose.yml,
  • core/ 包含 Dockerfile(用于 apache-PHP & the databases & phpMyAdmin)加上
  • ssl.conf

我确实在端口 443 上运行了以下“实例”之一:

------下面,sub1.domain.com的docker-compose.yml:------------

 sub1:
    hostname: localhost
    container_name: sub1
    build:
      context: ./core
    restart: always
    volumes:
      - ./core/html:/var/www/html
      - ./core/apacheErrorLog:/var/www/apacheErrorLog

    tty: true
    ports:
      - "443:443"
      - "80:80" 

------下面,Dockerfile(用于 PHP-Apache): -------------

ADD ssl.conf /etc/apache2/sites-available/ssl.conf

RUN rm -rf /etc/apache2/sites-enabled/000-default.conf

COPY ./html/ /var/www/html/sub1/
 
RUN a2enmod ssl
RUN a2ensite ssl
RUN a2enmod vhost_alias
RUN a2enmod rewrite

CMD echo "ServerName localhost" >> /etc/apache2/apache2.conf

并且,ssl.conf

--------下面是ssl.conf -----------

<VirtualHost *:80>
    ServerName sub1.domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log common
</VirtualHost>

<VirtualHost *:443>
    ServerName sub1.domain.com
    ServerAdmin webmaster@domain.com
    DocumentRoot /var/www/html/sub1
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    SSLEngine on
    
    SSLCertificateFile /etc/apache2/ssl_keys/cert.crt
    SSLCertificateKeyFile /etc/apache2/ssl_keys/key.key
    SSLCertificateChainFile /etc/apache2/ssl_keys/bundle.ca-bundle

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>

    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>



    <Directory /var/www/html/sub1>
        Options Indexes FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>


    DirectoryIndex index.php
</VirtualHost>

==================================================== =============

问题是:如果我现在添加一个 sub2.domain.com 以下/调整这些步骤,我需要将 docker-container 暴露到另一个端口,例如 444 - 现在,正确的“重定向”ro DocumentRoot 只会起作用,当端口显式输入 url - 否则,将使用“443 的默认值(此处:var/www/html/”,无论哪个 sub_n. - 域输入到浏览器的 url 地址。

所以: https://sub2.domain.com:444/ -> 好的,进入 var/www/html/sub2/ (根据服务定义)

但是https://sub2.domain.com/ -> false,进入 var/www/html/ (= 为在 sub1-docker-container 中运行的 sub1 定义的那个,因此,完全错误的 docker 服务......)

好的,我找到了“答案”:

--> 只有一个端口 443 - 如果您需要多个 docker-containerized-LAMP-stacks 运行 SSL 连接/可通过一个特定端口访问,您需要一个特殊的解决方案来完成这项工作,例如traefik 反向代理https://doc.traefik.io/traefik/providers/docker/

也许,还有其他/更简单的解决方案,但我已经对 traefik 和 docker-compose 及其路由范式有一些经验......

随意添加其他可能更简单的解决方案!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM