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

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

我会尽力解释我的情况,但我现在很抱歉,因为我刚刚开始研究这个问题,也许我不知道如何正确地提供所有的细节。

我最近得到了一个脚本(后端和两个 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:8080,但即便如此,后端现在已开始在 正常工作https://example.com。我可以使用 https 访问面板,但当尝试使用 打开应用程序时https://example.com,如示例所示:

class Config {
    companion object {
        const val Backend = "https://example.com/"
    }
}

或者

class Config {
    companion object {
        const val Backend = "https://example.com:8080/"
    }
}

应用程序开始显示连接错误并且无法正常运行。

我不知道这是否是正确的方法,后端可以使用提到的更改,以前是这样,http://example.com:8080现在我可以通过 访问它https://example.com,但这个新的 URL 使应用程序无法以相同的方式工作并出现连接错误。如果我保留原始 URL:

class Config {
    companion object {
        const val Backend = "http://example.com:8080/"
    }
}

应用程序已恢复正常运行。

我究竟做错了什么?

答案1

您的 Apache 方法是正确的。并且,您的应用程序配置也是正确的(即https://example.com)。

这可能是中间证书问题,因为您的应用不信任该证书并且无法打开与 apache 的 HTTPS 连接。

或者可能是应用程序端的应用程序错误。

无论如何,您是否可以获取更多错误信息并将其发布在这里。这样我们就可以进一步指导您。

谢谢

相关内容