Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Apache在example.com:8080(Docker)上启用https时,应用程序中出现连接错误_Apache_Docker_Https_Docker Compose_Proxy - Fatal编程技术网

使用Apache在example.com:8080(Docker)上启用https时,应用程序中出现连接错误

使用Apache在example.com:8080(Docker)上启用https时,应用程序中出现连接错误,apache,docker,https,docker-compose,proxy,Apache,Docker,Https,Docker Compose,Proxy,我会尽力解释我的情况,但我现在道歉,因为我刚开始研究这个问题,可能我不知道如何正确地给出所有细节 我最近得到了一个脚本(后端和两个Android应用程序),它可以在http上完美运行,但这些应用程序有一个只能使用https的支付网关。代码的作者创建了一个文档,教您如何在服务器上自动安装后端,只需安装Docker并使用链接wget运行后端http://authorsite/docker-compose.yaml &&docker compose up-d 安装程序为数据库和后端文件创建了容器,并创

我会尽力解释我的情况,但我现在道歉,因为我刚开始研究这个问题,可能我不知道如何正确地给出所有细节

我最近得到了一个脚本(后端和两个Android应用程序),它可以在http上完美运行,但这些应用程序有一个只能使用https的支付网关。代码的作者创建了一个文档,教您如何在服务器上自动安装后端,只需安装Docker并使用链接
wget运行后端http://authorsite/docker-compose.yaml &&docker compose up-d

安装程序为数据库和后端文件创建了容器,并创建了docker-compose.yaml文件:

 version: '3'

 services:
   mysql:
     image: mysql
     command: --default-authentication-plugin=mysql_native_password
     volumes:
       - mysqlvol:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: defaultpassword

   redis:
     image: redis
     volumes:
       - redisvol:/data

   taxi:
     image: author/taxi
     restart: always
     depends_on:
       - "redis"
       - "mysql"
     volumes:
       - ./img:/app/public/img
       - ./config:/app/config
       - taxiassets:/app/public/assets
     links:
       - mysql
       - redis
     ports:
       - "8080:8080"

 volumes:
    redisvol:
    mysqlvol:
    taxiassets:
后端页面在
http://example.com:8080
我只需要在应用程序的config.kt文件中添加相同的url:

class Config {
    companion object {
        const val Backend = "http://example.com:8080/"
    }
}
一切都很好,但正如我提到的,我需要https才能让支付网关在应用程序中工作,也可以摆脱http。作者没有提供这些信息,所以我研究并找到了一些关于反向代理的教程,我已经在我的服务器上安装了Apache(Docker之外),并遵循了与Apache相关的教程

我的.conf文件(使用Let's Encrypt)如下所示:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
    ProxyPreserveHost On
    ProxyPassReverseCookiePath / /

    <Proxy *>
        Order deny,allow
        Allow from all
        Allow from localhost
    </Proxy>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName example.com
    ServerAlias www.example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    ProxyPass / ws://127.0.0.1:8080/

</VirtualHost>
</IfModule>

应用程序开始显示连接错误,无法正常工作

我不知道这是否是正确的方法,在
http://example.com:8080
现在我可以在
https://example.com
,但这个新的url使应用程序无法以相同的方式工作,并且存在连接错误。如果我保留原始url:

class Config {
    companion object {
        const val Backend = "http://example.com:8080/"
    }
}
应用程序已恢复正常工作


我做错了什么?

回答你的问题有两个方面:

1.TLS终止代理 您可能希望对TLS反向代理进行dockerize,这将增加易维护性(不需要Docker之外的一些手动安装/配置),并隔离主机;有关指针,请参见例如

2.Docker网络 在docker-compose.yml中,当添加一个额外的服务(Docked TLS termination proxy)时(名为
proxy
),负责处理主机上的入站请求,您应该解决以下问题:

  • 公开此服务的
    80
    443
    端口:

    services:
      proxy:
        image: …
        ports:
          - '80:80'
          - '443:443'
        …
    
    注意:通常还包括标准HTTP端口80,以便实现到HTTPS的连接

  • 从您的
    出租车服务中删除
    端口:[“8080:8080”]
    规范(否则
    http://example.com:8080
    仍将可访问)

  • 不要使用
    链接:
    属性,因为它是一个

  • 相反,将必须相互通信的各种容器放在同一个自定义网络中:

    • 添加 在docker compose服务中(
      taxi
      mysql
      redis
      ),而不是
        links:
          - mysql
          - redis
      
    • 添加 在docker-compose.yml的末尾
  • 指定URL,例如
    http://mysql:3306
    http://redis:6379
    出租车服务内的
    服务。
    理想情况下,这些URL应该设置为
    taxi
    服务的docker compose环境变量

  • 同样,指定URL
    http://taxi:8080
    在您的
    代理
    服务中(类似于您在问题中提到的最后一个代码片段,即
    const val Backend=”http://taxi:8080/“
    )从
    代理
    访问
    出租车
    服务
    为此,您可能还需要创建另一个自定义docker compose网络,该网络是(
    代理
    出租车
    )服务的通用网络

  • 请注意,上面的URL以
    http:
    开头,而不是
    https:
    ,因为它们对应于容器之间的内部http请求,并且这些URL中的域名是docker compose service name

有关这些docker compose网络概念的更多详细信息,请参阅

最后,这里是一个示例组件图,它总结了您考虑的应用程序中涉及的各种容器:


回答您的问题有两个方面:

1.TLS终止代理 您可能希望对TLS反向代理进行dockerize,这将增加易维护性(不需要Docker之外的一些手动安装/配置),并隔离主机;有关指针,请参见例如

2.Docker网络 在docker-compose.yml中,当添加一个额外的服务(Docked TLS termination proxy)时(名为
proxy
),负责处理主机上的入站请求,您应该解决以下问题:

  • 公开此服务的
    80
    443
    端口:

    services:
      proxy:
        image: …
        ports:
          - '80:80'
          - '443:443'
        …
    
    注意:通常还包括标准HTTP端口80,以便实现到HTTPS的连接

  • 从您的
    出租车服务中删除
    端口:[“8080:8080”]
    规范(否则
    http://example.com:8080
    仍将可访问)

  • 不要使用
    链接:
    属性,因为它是一个

  • 相反,将必须相互通信的各种容器放在同一个自定义网络中:

    • 添加 在docker compose服务中(
      taxi
      mysql
      redis
      ),而不是
        links:
          - mysql
          - redis
      
    • 添加 在docker-compose.yml的末尾
  • 指定URL,例如
    http://mysql:3306
    http://redis:6379
    出租车服务内的
    服务。
    理想情况下,这些URL应该设置为
    taxi
    服务的docker compose环境变量

  •   links:
        - mysql
        - redis
    
    networks:
      network-name:
        driver: bridge