Предыстория (которая может иметь или не иметь отношение):
У меня есть домашняя настройка, как указано в заголовке:
WiFi router > RPi > Docker > nginx > php app
Настройка работала нормально в течение нескольких месяцев, пока я не сменил провайдера. Именно тогда мне пришлось решить несколько вопросов:
- Интернет-провайдер использовал CG-NAT по умолчанию. К счастью, я смог запросить публичный динамический IP.
- Провайдер предоставил мне маршрутизатор Sagemcom 5655 v2AC, который по умолчанию использует порты 80/443 для удаленного управления, и мне пришлось перепрыгнуть через несколько обручей, чтобы отключить эту функцию и вместо этого перенаправить эти порты на RPi. (проверил с помощью portchecker.co, что порт 80 открыт)
Просто когда я подумал, что сюрпризы закончились, и я проверял, как выглядит мое веб-приложение при доступе через доменное имя (Google DNS + DDClient), это не сработало. Сначала я думал, что все еще не могу получить доступ к RPi, используя публичный IP-адрес, но затем я открыл консоль разработчика Chrome и увидел, что некоторые ресурсы действительно загружаются, а другие - нет. Именно тогда я попытался зайти на сайт с использованием локального IP-адреса RPi из любопытства, и это сработало просто отлично.
Текущая ситуация:
- Доступ к веб-приложению с использованием локального IP-адреса работает нормально
- Доступ к веб-приложению с использованием общедоступного IP-адреса обслуживает некоторые ресурсы (index, manifest.js), в то время как другие, кажется, обслуживаются частично (app.css, vendor.js) и в конечном итоге завершаются с
net::ERR_CONNECTION_RESET
ошибкой
Вот так это выглядит, когда я пытаюсь загрузить <my_domain>.net/css/app.css
Раньше я ngrep
видел, как различается сетевой трафик между локальными и публичными IP-запросами, <my_domain>.net/css/app.css
и заметил кое-что странное. При загрузке ресурса через локальный IP-адрес я только что видел пакет TCP-пакетов, которые содержали части ресурса, однако при загрузке его через публичный IP-адрес он мог бы повторно отправить первый пакет несколько раз, пока он не сдался:
$ sudo ngrep port 80
interface: eth0 (192.168.1.0/255.255.255.0)
filter: (ip or ip6) and ( port 80 )
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
HTTP/1.1 200 OK..Server: nginx..Date: Sun, 20 Jan 2019 12:07:56 GMT..Content-Type: text/css..Content-Length: 155254..Last-Modified: Thu, 17 Jan 2019 18:15:47 GMT..Connection: keep-alive..ETag: "5c40c
653-25e76"..Accept-Ranges: bytes....@import url(https://fonts.googleapis.com/css?family=Nunito);/*!. * Bootstrap v4.1.3 (https://getbootstrap.com/). * Copyright 2011-2018 The Bootstrap Authors. * Cop
yright 2011-2018 Twitter, Inc.. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE). */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--o
range:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--w
arning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nun
ito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-f
amily:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}artic
le,aside,figcaption,figure,footer,header,hgroup,main,na
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
HTTP/1.1 200 OK..Server: nginx..Date: Sun, 20 Jan 2019 12:07:56 GMT..Content-Type: text/css..Content-Length: 155254..Last-Modified: Thu, 17 Jan 2019 18:15:47 GMT..Connection: keep-alive..ETag: "5c40c
653-25e76"..Accept-Ranges: bytes....@import url(https://fonts.googleapis.com/css?family=Nunito);/*!. * Bootstrap v4.1.3 (https://getbootstrap.com/). * Copyright 2011-2018 The Bootstrap Authors. * Cop
yright 2011-2018 Twitter, Inc.. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE). */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--o
range:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--w
arning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nun
ito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-f
amily:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}artic
le,aside,figcaption,figure,footer,header,hgroup,main,na
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
HTTP/1.1 200 OK..Server: nginx..Date: Sun, 20 Jan 2019 12:07:56 GMT..Content-Type: text/css..Content-Length: 155254..Last-Modified: Thu, 17 Jan 2019 18:15:47 GMT..Connection: keep-alive..ETag: "5c40c
653-25e76"..Accept-Ranges: bytes....@import url(https://fonts.googleapis.com/css?family=Nunito);/*!. * Bootstrap v4.1.3 (https://getbootstrap.com/). * Copyright 2011-2018 The Bootstrap Authors. * Cop
yright 2011-2018 Twitter, Inc.. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE). */:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--o
range:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--w
arning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nun
ito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-f
amily:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}artic
le,aside,figcaption,figure,footer,header,hgroup,main,na
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
<same as first>
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
<same as first>
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
<same as first>
####
T 192.168.1.1:64447 -> <public_ip>:80 [A]
......
#
T 192.168.1.128:80 -> 192.168.1.1:64447 [A]
<same as first>
#
T 192.168.1.1:64447 -> <public_ip>:80 [A]
......
#####
T 192.168.1.1:64447 -> 192.168.1.128:80 [A]
......
#^Cexit
25 received, 0 dropped
Сначала у меня были некоторые подозрения относительно части настройки RPi / Docker / nginx, но как только я понял, что веб-сайт работает нормально при локальном доступе, я уже не знаю, что и думать. Есть идеи?
PS
Я переместил Docker / nginx на порт 8080 и перенаправил этот порт на RPi, но все еще испытываю ту же проблему.