AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-507647

FalcoGer's questions

Martin Hope
FalcoGer
Asked: 2025-01-23 02:49:20 +0800 CST

apache2 sem memória ao servir arquivos estáticos grandes

  • 6

Estou executando um servidor apache2 com vários hosts virtuais. Eu o executo em um raspberry pi 4 com recursos bastante limitados. Em particular, a RAM é muito apertada (4 GB). Não há muito tráfego, eu o uso principalmente para hospedar o nextcloud, um site de streaming personalizado e alguns arquivos estáticos.

O problema são os arquivos estáticos. Sempre que eu, ou qualquer outra pessoa, baixa um arquivo, parece que o arquivo inteiro é carregado na RAM. Isso não é um problema para arquivos pequenos, mas qualquer coisa > 500 MB causa problemas sérios, frequentemente enchendo o SWAP e eventualmente causando uma morte OOM do apache.

Não consigo descobrir como fazer para simplesmente transmitir os arquivos do disco, em vez de armazená-los em cache na memória antes de enviá-los. Isso pode ser uma coisa viável a se fazer se você tiver 128 GB de RAM em um servidor adequado, mas está me matando no meu pobre pi.

Então, como faço para que o apache apenas transmita o arquivo do disco? E por que ele carrega o arquivo para a ram de qualquer maneira? O disco i/o é muito mais rápido do que a rede, então não há sentido em armazenar o arquivo do disco para a memória.

Eu tentei:

  • alternando de mpm_prefetch para mpm_event.
  • EnableSendfile On, o que parece não fazer nada.
  • mod_xsendfile comXSendFile On
  • Procurando outras soluções, incluindo
    • este , não aplicável porque um único trabalhador está usando toda a RAM para carregar um único arquivo enorme na RAM
    • este , não aplicável porque mesmo que eu rode PHP, o problema é com solicitações get para arquivos estáticos no disco, não PHP. Também não consigo instalar mais RAM.
    • este aqui , onde eu nem sei do que diabos eles estão falando com aquele arquivo de configuração. Também, novamente, não é um problema de PHP.
    • Muitos outros falam sobre grandes uploads para PHP e solicitações PUT, e outras coisas do PHP.

Gostaria de evitar fazer um proxy reverso para arquivos hospedados no nginx, se possível, pois isso só aumentaria a complexidade de tudo.

Um dos meus hosts virtuais, para o qual o problema existe:

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName host.tld
        ServerAdmin [email protected]

        DocumentRoot /var/www/web
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # Generate more pleasing and modern looking listing
        IndexOptions FancyIndexing IconsAreLinks FoldersFirst

        EnableSendfile On
        EnableMMAP     Off
        <IfModule mod_xsendfile.c>
            <Directory "/var/www/web">
                XSendFile On
                XSendFilePath /var/www/web
            </Directory>
        </IfModule>

        <IfModule mod_rewrite.c>
            RewriteEngine on
            RewriteRule ^/\.well-known/carddav /nextcloud/remote.php/dav [R=301,L]
            RewriteRule ^/\.well-known/caldav /nextcloud/remote.php/dav [R=301,L]
            RewriteRule ^/\.well-known/webfinger /nextcloud/index.php/.well-known/webfinger [R=301,L]
            RewriteRule ^/\.well-known/nodeinfo /nextcloud/index.php/.well-known/nodeinfo [R=301,L]

            RewriteRule ^/ocm-provider/?$ index.php [QSA,L]
        </IfModule>

        <IfModule mod_headers.c>
            # disallow embedding of non https
            Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
            # Prevents browsers from interpreting text files as javascript
            Header onsuccess unset X-Content-Type-Options
            Header always set X-Content-Type-Options "nosniff"
            # enable browser side cross site script filter
            Header onsuccess unset X-XSS-Protection
            Header always set X-XSS-Protection "1; mode=block"
            # prevent search engines from indexing the site
            Header onsuccess unset X-Robots-Tag
            Header always set X-Robots-Tag "noindex, nofollow"
            # prevent embedding in other sites
            Header onsuccess unset X-Frame-Options
            Header always set X-Frame-Options "SAMEORIGIN"
            Header onsuccess unset X-Permitted-Cross-Domain-Policies
            Header always set X-Permitted-Cross-Domain-Policies "none"
            # prevent browser from sending referrer data when clicking links
            Header onsuccess unset Referrer-Policy
            # Header always set Referrer-Policy "no-referrer"
            Header always set Referrer-Policy "same-origin"
        </IfModule>

        # Private, password protected directory
        <Location "/private">
            # authentication
            AuthType                basic
            AuthName                "My Server"

            # Cache credentials with socache
            AuthBasicProvider       socache dbd

            # also needed for caching: tell cache to cache dbd lookups
            AuthnCacheProvideFor    dbd

            AuthDBDUserPWQuery      "SELECT password FROM authn WHERE user = %s"

            # block all non users.
            Require                 valid-user
        </Location>

        <Location /nextcloud/>
            Require all granted
            AllowOverride All
            Options FollowSymLinks MultiViews

            <IfModule mod_dav.c>
                Dav off
            </IfModule>

            # Disable Basic auth for this
            Satisfy Any
        </Location>

        # SSL settings
        SSLEngine on
        SSLCertificateFile      /etc/letsencrypt/live/host.tld/cert.pem
        SSLCertificateChainFile /etc/letsencrypt/live/host.tld/fullchain.pem
        SSLCertificateKeyFile   /etc/letsencrypt/live/host.tld/privkey.pem
        #Include /etc/letsencrypt/options-ssl-apache.conf

        # Add vhost name to log entries:
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
        LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
    </VirtualHost>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr et

Meus módulos habilitados:

access_compat.load  authn_core.load authz_core.load  autoindex.load  dir.conf     headers.load    mpm_event.load    proxy.load      reqtimeout.conf  security3.load     socache_shmcb.load  status.load
alias.conf     authn_dbd.load   authz_host.load  dbd.load   dir.load     mime.conf       negotiation.conf   proxy_fcgi.load      reqtimeout.load  setenvif.conf     ssl.conf        unique_id.load
alias.load     authn_file.load  authz_user.load  deflate.conf   env.load     mime.load       negotiation.load   proxy_http.load      rewrite.load     setenvif.load     ssl.load        xsendfile.load
auth_basic.load     authn_socache.load  autoindex.conf  deflate.load    filter.load  mpm_event.conf  proxy.conf proxy_wstunnel.load  security3.conf   socache_memcache.load  status.conf

mpm_event.conf:

<IfModule mpm_event_module>
    StartServers             2
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadLimit          64
    ThreadsPerChild      25
    MaxRequestWorkers     150
    MaxConnectionsPerChild   0
</IfModule>

apachectl -V:

Server built:   2024-07-17T18:57:26
Server's Module Magic Number: 20120211:126
Server loaded:  APR 1.7.0, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_PROC_PTHREAD_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/apache2"
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="mime.types"
 -D SERVER_CONFIG_FILE="apache2.conf"

/proc/meminfo ao baixar um arquivo estático de 2 GB com curl. O texto é quando a conexão ssh morreu aproximadamente 10 segundos após o início do download. Até então, nem um único byte foi recebido pelo curl ainda.

MemTotal:        3880848 kB
MemFree:          190000 kB
MemAvailable:     479864 kB
Buffers:           52840 kB
Cached:           458780 kB
SwapCached:        63000 kB
Active:           502232 kB
Inactive:        2665432 kB
Active(anon):     318696 kB
Inactive(anon):  2479580 kB
Active(file):     183536 kB
Inactive(file):   185852 kB
Unevictable:       26756 kB
Mlocked:           26756 kB
SwapTotal:       4095996 kB
SwapFree:        2418916 kB
Dirty:                52 kB
Writeback:           192 kB
AnonPages:       2626292 kB
Mapped:           172496 kB
Shmem:            134752 kB
KReclaimable:     292096 kB
Slab:             411324 kB
SReclaimable:     292096 kB
SUnreclaim:       119228 kB
KernelStack:        8768 kB
PageTables:        22876 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6036420 kB
Committed_AS:    8174592 kB
VmallocTotal:   133143592960 kB
VmallocUsed:       27632 kB
VmallocChunk:          0 kB
Percpu:             3216 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:          65536 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
apache-2.4
  • 1 respostas
  • 93 Views
Martin Hope
FalcoGer
Asked: 2020-11-12 13:06:24 +0800 CST

iptables udp port encaminhado, mas ICMP UDP Port inacessível

  • 0

Desejo hospedar um servidor de jogos (Zandronum Doom) na porta 10666 UDP, mas ninguém pode se conectar a ele. Eu solucionei o problema e acho que é um problema com o meu roteamento. Minha arquitetura de rede física é assim:

[WAN] - [Router] - [Switch] - [Pi]
                            - [Desktop]
                            - [Other]

Meu roteamento é o seguinte

[WAN] - [(pub. ip) Router (192.168.1.1)] - [Pi (192.168.1.5)] - [Desktop (192.168.1.11)]
                                                    - [Other (tv, printer, laptop, phone, etc)]

Meu roteador está configurado para encaminhar qualquer coisa que eu queira para o raspberry pi e somente lá. O raspberry pi está configurado como um IDS/IPS e também atua como servidor DNS e servidor DHCP para toda a minha rede. Quero que todo o meu tráfego passe por lá. O rasperry pi é definido como gateway padrão via dhcp, o próprio rasperry pi tem o roteador como gateway padrão.

O roteador está configurado para encaminhar tráfego tcp e udp na porta 10666 para o pi. Este é o tráfego que me dá problemas. O rasperry pi tem as seguintes regras relevantes no iptable:

$> sudo iptables --list -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  fritz.box            pi.lan               tcp dpt:10666 to:192.168.1.11
DNAT       udp  --  fritz.box            pi.lan               udp dpt:10666 to:192.168.1.11

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere

$> sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
QUEUE      all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Não sei por que alguns desses nomes são resolvidos enquanto outros não.

Não consigo me conectar ao servidor via ip público. TCP Dump revela o seguinte:

$> sudo tcpdump -i eth0 | grep 10666
[...]
21:34:57.456103 IP paul-pc.lan.10667 > <pub-ip>.10666: UDP, length 50
21:34:57.457635 IP pi.lan.10667 > <pub-ip>.10666: UDP, length 50
21:34:57.458130 IP <pub-ip>.10667 > pi.lan.10666: UDP, length 50
21:34:57.458279 IP pi.lan > <pub-ip>: ICMP pi.lan udp port 10666 unreachable, length 86
21:34:57.458451 IP <pub-ip> > pi.lan: ICMP <pub-ip> udp port 10666 unreachable, length 86
21:34:57.458711 IP <pub-ip> > paul-pc.lan: ICMP <pub-ip> udp port 10666 unreachable, length 86
[repeating]
[...]

Para testar as coisas, alterei as configurações de rede do servidor para ignorar o pi e o roteador para encaminhar a porta diretamente para a área de trabalho. Então funcionou perfeitamente.

udp port-forwarding iptables
  • 1 respostas
  • 1041 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve