我会尽力解释我的情况,但我现在很抱歉,因为我刚刚开始研究这个问题,也许我不知道如何正确地提供所有的细节。
我最近得到了一个脚本(后端和两个 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 连接。
或者可能是应用程序端的应用程序错误。
无论如何,您是否可以获取更多错误信息并将其发布在这里。这样我们就可以进一步指导您。
谢谢