포트 8080과 8443에 캐디 웹 서버를 노출하고 각각 80과 443에 매핑된 도커가 있습니다.
https://localhost:8443을 사용하여 로컬 브라우저를 통해 액세스할 수 있지만 브라우저는 먼저 SSL 인증서가 자체 서명되었다고 불평합니다. 알 수 없는 이유로 http://localhost:8080을 사용하여 액세스하려고 하면 브라우저가 https://localhost(https이지만 포트는 없음)로 리디렉션됩니다.
[michael@localhost api-platform]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4f9c942d02f api-platform_caddy "caddy run --config …" 22 minutes ago Up 22 minutes 2019/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp, 0.0.0.0:8443->443/tcp, 0.0.0.0:8443->443/udp, :::8443->443/tcp, :::8443->443/udp api-platform_caddy_1
120471adcb43 api-platform_php "docker-entrypoint p…" 22 minutes ago Up 22 minutes (healthy) 9000/tcp api-platform_php_1
4ab23f9bd5d9 postgres:13-alpine "docker-entrypoint.s…" 22 minutes ago Up 22 minutes 0.0.0.0:5433->5432/tcp, :::5433->5432/tcp api-platform_database_1
958944520bd5 api-platform_pwa "docker-entrypoint.s…" 22 minutes ago Up 22 minutes 3000/tcp api-platform_pwa_1
[michael@localhost api-platform]$
다른 컴퓨터에서 Docker의 웹 서버에 액세스하고 싶습니다. 나는 다음 접근 방식을 시도했지만 호스트의 Apache 웹 서버를 사용하는 것보다 더 나은 방법이 있다면 이를 변경할 수 있습니다.
두 버전을 모두 사용해 보았습니다(아래 두 개의 가상 호스트 프로필 참조). Apache 없이 사용하는 것과 유사합니다.http://api-platform.example.com:80https로 리디렉션됩니다.
요청을 다음으로 전달하세요.http://127.0.0.1:8080. 동작은 https://localhost를 사용하는 로컬 시스템이나 다음을 사용하는 원격 시스템에서 동일합니다.https://api-platform.example.com/브라우저에 "클라이언트가 HTTPS 서버에 HTTP 요청을 보냈습니다."가 표시됩니다. Docker 로그는 자동이며 Apache는 오류를 기록하지 않습니다. 그러나 Apache 로그 액세스는 다음과 같습니다.
127.0.0.1 - - [05/Sep/2021:10:18:32 -0700] "GET / HTTP/1.1" 400 48 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0" (localhost)
11.22.33.44 - - [05/Sep/2021:10:34:18 -0700] "GET / HTTP/1.1" 400 48 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" (remote)
요청 통과https://127.0.0.1:8443. localhost의 경우 브라우저가 자체 서명된 서명에 대해 먼저 불평하는 것을 제외하면 예상대로 작동하지만 원격 액세스의 경우 브라우저는 The proxy server received an invalid response from an upstream server
아래와 같이 Apache의 액세스 및 오류 로그를 표시합니다.
11.22.33.44 - - [05/Sep/2021:10:29:10 -0700] "GET / HTTP/1.1" 502 341 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"
11.22.33.44 - - [05/Sep/2021:10:29:10 -0700] "GET /favicon.ico HTTP/1.1" 200 - "https://api-platform.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"
11.22.33.44 - - [05/Sep/2021:10:29:10 -0700] "GET /favicon.ico HTTP/1.1" 502 341 "https://api-platform.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"
[Sun Sep 05 10:29:30.461504 2021] [proxy_http:error] [pid 111778:tid 140510476093184] (103)Software caused connection abort: [client 11.22.33.44:53690] AH01102: error reading status line from remote server 127.0.0.1:8443
[Sun Sep 05 10:29:30.461535 2021] [proxy:error] [pid 111778:tid 140510476093184] [client 11.22.33.44:53690] AH00898: Error reading from remote server returned by /
[Sun Sep 05 10:29:30.481675 2021] [proxy_http:error] [pid 111778:tid 140510240954112] (103)Software caused connection abort: [client 11.22.33.44:53690] AH01102: error reading status line from remote server 127.0.0.1:8443, referer: https://api-platform.example.com/
[Sun Sep 05 10:29:30.483998 2021] [proxy_http:error] [pid 111778:tid 140510257739520] (103)Software caused connection abort: [client 11.22.33.44:59869] AH01102: error reading status line from remote server 127.0.0.1:8443, referer: https://api-platform.example.com/
[Sun Sep 05 10:29:30.484012 2021] [proxy:error] [pid 111778:tid 140510257739520] [client 11.22.33.44:59869] AH00898: Error reading from remote server returned by /favicon.ico, referer: https://api-platform.example.com/
방화벽 설정은 이 문서 하단에 표시됩니다. HTTP 서버에 대한 원격 액세스를 어떻게 허용해야 합니까?
가상 호스트 구성 파일:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName api-platform.example.com
ProxyPreserveHost On
ProxyRequests off
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ErrorLog /var/log/httpd/api-platform.example.com-error.log
CustomLog /var/log/httpd/api-platform.example.com-access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/testing.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/testing.example.com/privkey.pem
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName api-platform.example.com
ProxyPreserveHost On
ProxyRequests off
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire off
SSLProxyCheckPeerName off
ProxyPass / https://127.0.0.1:8443/
ProxyPassReverse / https://127.0.0.1:8443/
ErrorLog /var/log/httpd/api-platform.example.com-error.log
CustomLog /var/log/httpd/api-platform.example.com-access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/testing.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/testing.example.com/privkey.pem
</VirtualHost>
</IfModule>
방화벽 설정
[michael@localhost api-platform]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s31f6 wlp0s20f3
sources:
services: cockpit dhcpv6-client ssh
ports: 80/tcp 443/tcp 8080/tcp 8443/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[michael@localhost api-platform]$
답변1
호스트 시스템에는 웹 서버가 필요하지 않습니다. 나는 이것이 호스트 시스템의 파일 벽일 수 있다고 생각합니다. 포트를 차단할 수 있습니다.