使用Apache在example.com:8080(Docker)上启用https时,应用程序中出现连接错误
我会尽力解释我的情况,但我现在道歉,因为我刚开始研究这个问题,可能我不知道如何正确地给出所有细节 我最近得到了一个脚本(后端和两个Android应用程序),它可以在http上完美运行,但这些应用程序有一个只能使用https的支付网关。代码的作者创建了一个文档,教您如何在服务器上自动安装后端,只需安装Docker并使用链接使用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 安装程序为数据库和后端文件创建了容器,并创
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
注意:通常还包括标准HTTP端口80,以便实现到HTTPS的连接services: proxy: image: … ports: - '80:80' - '443:443' …
- 从您的
出租车服务中删除
规范(否则端口:[“8080:8080”]
仍将可访问)http://example.com:8080
- 不要使用
属性,因为它是一个链接:
- 相反,将必须相互通信的各种容器放在同一个自定义网络中:
- 添加
在docker compose服务中(
,taxi
,mysql
),而不是redis
links: - mysql - redis
- 添加 在docker-compose.yml的末尾
- 添加
在docker compose服务中(
- 指定URL,例如
或http://mysql:3306
出租车服务内的http://redis:6379
服务。
理想情况下,这些URL应该设置为
服务的docker compose环境变量taxi
- 同样,指定URL
在您的http://taxi:8080
服务中(类似于您在问题中提到的最后一个代码片段,即代理
)从const val Backend=”http://taxi:8080/“
访问代理
服务出租车
为此,您可能还需要创建另一个自定义docker compose网络,该网络是(
,代理
)服务的通用网络出租车
- 请注意,上面的URL以
开头,而不是http:
,因为它们对应于容器之间的内部http请求,并且这些URL中的域名是docker compose service namehttps:
回答您的问题有两个方面: 1.TLS终止代理 您可能希望对TLS反向代理进行dockerize,这将增加易维护性(不需要Docker之外的一些手动安装/配置),并隔离主机;有关指针,请参见例如 2.Docker网络 在docker-compose.yml中,当添加一个额外的服务(Docked TLS termination proxy)时(名为
proxy
),负责处理主机上的入站请求,您应该解决以下问题:
- 公开此服务的
和80
端口:443
注意:通常还包括标准HTTP端口80,以便实现到HTTPS的连接services: proxy: image: … ports: - '80:80' - '443:443' …
- 从您的
出租车服务中删除
规范(否则端口:[“8080:8080”]
仍将可访问)http://example.com:8080
- 不要使用
属性,因为它是一个链接:
- 相反,将必须相互通信的各种容器放在同一个自定义网络中:
- 添加
在docker compose服务中(
,taxi
,mysql
),而不是redis
links: - mysql - redis
- 添加 在docker-compose.yml的末尾
- 添加
在docker compose服务中(
- 指定URL,例如
或http://mysql:3306
出租车服务内的http://redis:6379
服务。
理想情况下,这些URL应该设置为
服务的docker compose环境变量taxi
-
links: - mysql - redis
networks: network-name: driver: bridge