Elektroda.pl
Elektroda.pl
X
Elektroda.pl
e-miernikie-mierniki
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sockety rozłączają połączenie

11 Sty 2019 09:20 450 12
  • Poziom 14  
    Witam,

    Mam aplikację w Node.js i tam uzywam biblioteki net do tworzenia socketów. Problem polaga na tym, ze gdy postawie lokalnie serverTcp i podłącze coś z zewnątrz, to wszystko działa. Ale gdy podłączę coś na serwerze Tcp postawionym na mydevil.net to połaczenie działa ok 6min. Nie dłużej. Czym to może być spowodowane?
  • e-miernikie-mierniki
  • Poziom 17  
    1. Jakiś log z połączenia, albo aplikacji / messages zlogów systemowych ?
    1a. możesz postawić to z verbosity ustewionym na max i logowaniem wszystkich komunikatów do osobnego pliku ?
    2. masz dostęp do /proc ? (możesz odczytać wartości z gałęzi /proc/net/ ) ?
  • Poziom 14  
    Takie logi mam z serwera:
    App 90181 output: Catched error for TCP server:
    App 90181 output: ERR.STACK------------------------
    App 90181 output: Error: write EPIPE
    App 90181 output: at _errnoException (util.js:992:11)
    App 90181 output: at WriteWrap.afterWrite [as oncomplete] (net.js:864:14)
    App 90181 output: ---------------------------------
    App 90181 output: Socket closed

    Co to jest verbosity?

    2. masz dostęp do /proc ? (możesz odczytać wartości z gałęzi /proc/net/ ) ? -> nie za bardzo wiem co to jest
  • e-miernikie-mierniki
  • Poziom 17  
    OK .
    widzę/wygląda na to, że rzeczywiście jakieś ustawienie/a stosu TCP mogą tutaj być odpowiedzialne za problem.
    Ale nie wiem czy tylko - stąd prośba o uruchomienie tego serwera z opcją podniesionego verbosity
    (czyli wtedy kiedy proces wyrzuca znacznie więcej komunikatów do logów / na ekran
    np.takich które normalnie - w produkcji są pomijane) To pomaga pryz diagnostyce problemów.
    Z reguły robi się to dodając opcję -v (-vv , -vvv) do komendy uruchamiającej dany program/serwer .
    Ale to trzeba sprawdzić bezpośrednio w dokumentacji serwera (nie wszystkie programy muszą
    przecież obsługiwać taki przełącznik )

    Ad 2. - wykonaj coś takiego :
    Code:

     cat /proc/net/stat/ndisc_cache


    I jeśli w wyniku otrzymasz coś w podobnego do :
    Code:

    entries  allocs destroys hash_grows  lookups hits  res_failed  rcv_probes_mcast rcv_probes_ucast  periodic_gc_runs forced_gc_runs unresolved_discards
    00000006  00000006 00000000 00000002  00000628 0000061e  00000000  00000000 00000000  0013fba6 00000000 00000000
    00000006  00000000 00000000 00000000  0000cd27 0000cc93  00000000  00000000 00000000  00000000 00000000 00000000

    to znaczy że masz możliwość odczytania tych parametrów .

    To istotne , bo większość ustawień dot. protokołów, stosów (np. stosu tcp) i socketów - jest zapisana właśnie w procu .
    Jeśli masz dostęp do czytania (niektóre hostingi z shellem tego nie mają - pojawia się wtedy coś w stylu :
    Code:

    markooff@markooff:~$ cat /proc/
    cat: /proc/: Permission denied
    markooff@markooff:~$
    )
    to niestety ale możliwości zdiagnozowania w ten sposób przyczyny - gdyby miała leżeć po stornie systemu masz bardzo ograniczone
    I jedyną chyba , najlepszą radą byłoby wtedy zwrócenie się do administratora danego hostingu opisanie problemu i prośba o pomoc.

    tak naprawdę choć wydaje się że ten błąd (stosu) , który podałeś
    Code:

    App 90181 output: Catched error for TCP server:
    App 90181 output: ERR.STACK------------------------
    App 90181 output: Error: write EPIPE

    nie koniecznie musi być spowodowany błednym/specyficznym ustawieniem akurat socketów
    może coś innego to rozłacza, choć pierwsza myśl moja była żeby poszukać własnie nietypowej/specyficznej konfiguracji któregoś z parametrów dot. czasu podtrzymywania połączenia, innych parametrów socketowych itp .

    Kolejna rzecz , która należało by sprawdzić to konfiguracja samego serwera www - i porównac ją z tą na której uruchamiałeś swoją aplikację u siebie.
  • Poziom 14  
    markooff napisał:
    Ad 2. - wykonaj coś takiego :

    Code:
     cat /proc/net/stat/ndisc_cache


    Wykonałem coś takiego i nie działa. Pisałem do supportu ale dali mi odp ze oni nic nie ograniczają. Masz jakiś sprawdzony hosting pod Tcp? Możesz coś polecić? Głównie pod kątem testowania tego serwera Tcp. Napisany jest w Nodejs.
  • Poziom 17  
    Cóż, najlepszy moim zdaniem byłby tutaj prawdziwy VPS - i do tego linux postawiony przez samego siebie. Nie orientuję się za dobrze tutaj w cenach polskich dostawców VPSów - bo jedyne z jakich korzystam są obecnie poza Polską (głownie z uwagi na stosunek jakości do ceny ) Mogę polecić z zamkniętymi oczami niemiecką firmę Hetzner GmbH - tam za średniej mocy (4 rdzeniowego + 16 GB RAM ) VPSa zapłacić musisz jedynie ok 30 eu /miesiąc co jest przy naprawdę świetnej jakości samej uslugi ceną stosunkowo niewielką, a w każdym razie nie do osiągnięcia (ciekawe czemu ?) przez jakiegokolwiek naszego dostawcę.... Oczywiście są też rozwiązania tańsze (np 2 rdzeniowy i 8GB RAM) . Najwazniejszą cechą teg orozwiązania jest to, że "jesteś sam sobie panem sterem i okrętem " bo instalujesz swój własny system (preinstalujesz z automatu do wyboru kilka wiodących dystrybucji w wersjach minimal , no i potem sobie sam rzeźbisz juz co i jak chcesz) masz do niego pełnego root'a a w dodatku system ratunkowy i backupy kilkudniowe , gdyby coś poszło naprawde mocno nie tak ;) :P
    Podobne, choć droższe VPSy mają w Anglii.
    Podobne w Stanach- choć z uwagi na odległość nie wiem czy jestto akurat najlepsze rozwiązanie ..

    Jesli nie chcesz w ten sposób - możesz skorzystać z krajowego dobrego hostingu z shellem + predefiniowanym postawionym całkiem niezłym środowiskiem dla wszelakiego rodzaju usług www - tutaj pierwsze co mi przyszło na myśl to nazwa.pl (netart) i ich hostingi z shellem - całość za ok 600-800 PLN /rok . Podobne , choć nieco droższe ma home.pl . Sam użytkuje podobne rozwiązania (do wielu zastosowań) i się to opłaca a możesz zrobic praktycznie wszystko co potrzebujesz do bieżacych testów z poziomu shella - a to czeog nie możesz - do tego masz całkiem wygodny panel sterujący parametrami webservera , php'a sql'a itd...

    Wszystkie opisane powyżej rozwiązania mam sam przetestowane .
    We wszystkich mam przedeptane kontakty z supportem i muszę przyznać że (nawet w Polsce) działa on jakoś nie najgorzej.
    Nie bardzo wiem co mógłbym Ci jeszcze więcej polecić
  • Poziom 14  
    Dzięki za wyczerpującą odpowiedź. Mam u siebie Windows 10. Sądzisz, że da się zrobić z niego serwer. Tak by komp. chodził cały czas i najważniejsze by można podłączyć się do niego z zewnątrz. Mam portal na heroku. I jeśli miałbym u siebie postawiony serwer i działałoby podłączenie do niego to rozwiązałoby mój problem.
  • Poziom 17  
    Niestety - nie znam tego rozwiązania (heroka). A co do Windowsa 10 - to jak postawiłeś serwer www na nim? XAMPP czy coś podobnego? IIS owszem, ale to na systemach z rodziny Windows Server (2008 R2, 2012, 2016, 2019) dopiero...
  • Poziom 14  
    Chyba dalej pomecze się z tym mydevil ze względu na ograniczony fundusz (studencki).
    Uruchamiam apkę teraz w inn sposób, recznie za pomocą komendy: "screen node app.js" ale problem jest dalej ten sam.
    W logach aktualnie mam:

    App 88459 output: { Error: read ETIMEDOUT
    App 88459 output: at _errnoException (util.js:992:11)
    App 88459 output: at TCP.onread (net.js:618:25) code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }

    Powyższą komendę dostałem od supportu ale nic nie pomogło. Dostałem się do listy procesów, jest tam takie coś (po tym jak arduino rozłączyło połączenie z serwerem):
    Sockety rozłączają połączenie

    Tylko nie potrafię nic z tego wywnioskować.
  • Poziom 17  
    Błędy które złączyłeś każą mi pomyśleć też o innej, możliwej przyczynie . Jest/może nią być sama koniguracja podstawy serwera , php-fpm , czy wreszcie innych mechanizmów dodatkowych z których być może korzysta Twój program. Wielokrotnie, podczas wdrażania różnych enginów czy aplikacji miałem do czynienia z nie opisanymi nawet w dokumentacji (takiej ogólno-wdrożeniowej) ale wynikającymi z konkretneog środowiska koniecznymi do zmiany/tuningu parametrami pracy . I dlatego może to nie mieć nic wspólnego z ustawieniami samego stosu TCP czy socketów w systemie.

    Dlatego, może na krótką metę najlepszym pomysłem byłoby przerzucenie się z nim (z programem) na jakiś sój prywatny serwer/środowisko webowe- typu XAMPP czy podobne. Czyli coś nad czym będziesz mieć całowita i jedyną kontrolę - nad wszystkimi jego parametrami pracy itp itd.

    A na dalsza , skoro jesteś studentem -rozejrzyj się , być moze na towjej uczelni jest coś takiego jak jakiś rodzaj inkubatora przedsiębiorczosci czy wręcz są możliwości postawienia (tez testowo) jakiejś bardziej rozbudowanej instancji , do której równeiz miabyś dostęp (do jej konfiguracji) . I potem metodą prób, błedów i czytania logów - odnajdziesz przyczynę takiego stanu rzeczy - szczególnie, że , jak pisałes, naswoim komputerze wszystko działało... .

    Wartało by tez spróbować zanalizować róznice w konfiguracji obu tych środowisk , masz kontakt do supportu - możesz poprosić o odpowiedniki twoich plików konfiguracyjnych dla serwera www, php'a , i innych.
  • Poziom 14  
    Sprawdzałem rózne kody i pod różnym kątem na tym mydevil.net, dziś sprawdziłem na uczelni- połączenie z serwerem zadziałało i działało jakieś 2h dopoki nie przerwałem. Potem w domu próba- znów problem. Ale gdy postawiłem punkt dostępowy w telefonie- działa jak powinno.

    Okazuje się, że mój kod jak i konfiguracja serwera są i były ok.

    Czyli problem robi router. Mam router Edimax z mobilnym internetem od Orange. Co może powodować to rozłączanie w routerze??

    ps próbowałem teraz połączyć lokalny serwer z moim Tcp na mydevil.net przez router (miał i ma ten sam objaw co Arduino). Wyszedłem z założenia, że gdy mój serwer zadziała w połączeniu z Tcp to i Arduino zadziała. Pytanie teraz jak skonfigurować porty? W necie wszyscy piszą o konfiguracji portów. Mam coś takiego jak na obrazku- dodałem mój serwer (teoretycznie). To jest jego port i adres w sieci lokalnej. Napisałem teoretycznie bo nie działa.
    Sockety rozłączają połączenie
    Mój lokalny serwer ma adres np 192.168.2.103 i port 3000. Jak to ustawić by połaczenia z zewnątrz były kierowane w to miejsce?
  • Poziom 17  
    Służyć do tego będzie zakładka NAT (oraz być może jeszce trzeba będzie dodać regułki dla puszczenia ruchu przychodzącego - w zakładce Firewall)

    Czyli:
    1) Na pewno w zakładce NAT (nie mam pojęcia jak na tym Edim wygląda jej wnętrze) trzeba będzie ustawić przekierowanie portu z jakiegoś (który sobie wybierzesz w zasadzie dowolnie, alemoże to też być port 3000 ) na zewnętrznym adresie IP -> na adres wewnętrzny Twojego serwera 192.168.2.103 i port 3000.
    To jedno.
    2) Potem musisz sprawdzić czy to już wystarczy , czy jeszcze musisz dodać jakąś regułę na odblokowanie dostępu do tego portu który wystawiłeś na zewnątrz (na adresie zewnętrznym) , jeśli standardowe przekierowanie portu samo nie wystarczy.
  • Poziom 14  
    Zrobiłem tak jak opisałeś i nie działa. Mój lokalny serwer ma za zadanie po strarcie połączyć się z serwerem który jest na mydevil i porcie 13379. Mój lokaly jest na porcie 3000. Czy ten zewnętrzny na pewno powinien być 3000? Dodaje logi z wiresharka, może Ci coś powiedzą
    Sockety rozłączają połączenie

    Ten czerwony pasek dość często się pojawia.

    Konfiguracja NAT:
    Sockety rozłączają połączenie

    Firewall: (wyłączyłem na razie)
    Sockety rozłączają połączenie