No se puede abrir el puerto 8080 para que Varnish acceda a Nginx

No se puede abrir el puerto 8080 para que Varnish acceda a Nginx

Estoy configurando Varnish and Hitch para atender solicitudes HTTP y HTTPS entrantes para mi sitio web Drupal. El sitio web Drupal se ejecuta en Nginx en un VPS Digital Ocean y estaba escuchando en los puertos 80 y 443. Cambié todos los bloques del servidor para escuchar en el puerto 8080. Configuré Varnish para escuchar en 80 en la misma máquina. Creé un script de shell para configurar iptables. El script contiene las siguientes líneas

iptables -F
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 9999 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 4949 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ipchains -A input -p icmp --icmp-type timestamp-request -j DROP ipchains -A output -p icmp --icmp-type timestamp-reply -j DROP
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -L -n
iptables-save | sudo tee /etc/sysconfig/iptables
service iptables restart

Cuando enumero las reglas de iptables después de ejecutar el script anterior, este es el resultado

sridhar@SastraTechnologies:~$ sudo iptables -L
[sudo] password for sridhar: 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
DROP       tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:9999
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:urd
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:pop3
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:pop3s
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imap2
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imaps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:munin
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http-alt

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (0 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION (0 references)
target     prot opt source               destination     

El http-alt es el puerto 8080 ya que esa es la última regla en mi script de shell de iptables. Sin embargo, cuando intento hacer telnet aparece el error "Conexión rechazada".

sridhar@SastraTechnologies:~$ telnet localhost 8080
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

Intenté verificar si Barniz puede conectarse a Nginx usando curl desde mi computadora portátil para recuperar los encabezados y este es el resultado (la dirección IP está ofuscada por razones obvias)

sridhar@sridhar-HP-Laptop-15-bs0xx:~$ curl -I 139.99.99.99 
HTTP/1.1 503 Backend fetch failed
Date: Mon, 11 Jan 2021 08:57:53 GMT
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
X-Varnish: 4271
Age: 0
Via: 1.1 varnish-v4
Connection: keep-alive

Sin embargo, si verifico el estado del puerto usando netstat, veo que Nginx está escuchando en el puerto 8080.

sridhar@SastraTechnologies:~$ sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:6082          0.0.0.0:*               LISTEN      2246/varnishd   
tcp        0      0 127.0.0.1:8999          0.0.0.0:*               LISTEN      1543/perl       
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      541/php-fpm.conf)
tcp        0      0 139.99.99.99:3306       0.0.0.0:*               LISTEN      1472/mysqld     
tcp        0      0 0.0.0.0:9999            0.0.0.0:*               LISTEN      9050/sshd       
tcp        0      0 139.99.99.99:8080       0.0.0.0:*               LISTEN      4071/nginx -g daemo
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2246/varnishd   
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      4071/nginx -g daemo
tcp6       0      0 :::9999                 :::*                    LISTEN      9050/sshd       
tcp6       0      0 :::80                   :::*                    LISTEN      2246/varnishd   
tcp6       0      0 :::4949                 :::*                    LISTEN      7923/perl 

Pero escuchar el puerto 80 solo en la IP pública en lugar de todas las IP, no es lo mismo para todos los demás puertos. ¿Hay algo que me falta? ¿Cómo consigo que el puerto 8080 sea accesible para Varnish?

EDITAR

Contenido del archivo de la unidad del sistema

[Unit]
Description=Varnish HTTP accelerator
Documentation=https://www.varnish-cache.org/docs/4.1/ man:varnishd

[Service]
Type=simple
LimitNOFILE=131072
LimitMEMLOCK=82000
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
ExecReload=/usr/share/varnish/reload-vcl
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
PrivateDevices=true

[Install]
WantedBy=multi-user.target

Definición de back-end para barniz

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
}

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.
}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}

Solo cambió la configuración predeterminada del backend por ahora

Configuración de Nginx

server {
        listen mydomain.co.in:8080;
        server_name mydomain.co.in www.mydomain.co.in;
    root /home/sridhar/public_html/newanybank/public; ## <-- Your only path reference.

    keepalive_timeout 70;
    access_log /home/sridhar/public_html/newanybank/log/access.log;
    error_log /home/sridhar/public_html/newanybank/log/error.log;

    # Enable compression, this will help if you have for instance advagg  ^ modue# by serving Gzip versions of the files.
    gzip_static on;

    index index.php;

    location = /favicon.ico {
            log_not_found off;
            access_log off;
    }

    location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
    }


    # Very rarely should these ever be accessed outside of your lan
    location ~* \.(txt|log)$ {
            allow 192.168.0.0/16;
            deny all;
    }

    location ~ \..*/.*\.php$ {

      return 403;
    }

    # No no for private
    location ~ ^/sites/.*/private/ {
            return 403;
    }

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
            return 403;
    }

    location / {
           try_files $uri $uri/ @rewrite;
            expires max;
    }

    location @rewrite {
            # You have 2 options here
            # For D7 and above:
            # Clean URLs are handled in drupal_environment_initialize().
            rewrite ^ /index.php;
            # For Drupal 6 and bwlow:
            # Some modules enforce no slash (/) at the end of the URL
            # Else this rewrite block wouldn't be needed (GlobalRedirect)
            #rewrite ^/(.*)$ /index.php?q=$1;
    }
    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
            #fastcgi_pass unix:/tmp/phpfpm.sock;
            fastcgi_pass 127.0.0.1:9000;
    }
    # Fighting with Styles? This little gem is amazing.
    # This is for D6
    #location ~ ^/sites/.*/files/imagecache/ {
    # This is for D7 and D8
    location ~ ^/sites/.*/files/styles/ {
            try_files $uri $uri/ @rewrite;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires 365d;
            log_not_found off;
            add_header Cache-Control "public, no-transform";
    }

    location ~* \.(pdf|css|html|js|swf)$ {
            expires 7d;
            log_not_found off;
            add_header Cache-Control "public, no-transform";
    }

Respuesta1

La listen mydomain.co.in:8080;directiva en su configuración de Nginx probablemente sea el problema.

Nginx solo escuchará en la interfaz de red la IP resuelta por el dominio. Soy muy consciente de que el dominio está redactado por motivos de privacidad. Pero probablemente sepas a qué me refiero.

Esto también se refleja en la 139.99.99.99:8080dirección local en su netstatsalida.

La localhostdirección no se resuelve en esa dirección IP y utiliza la interfaz de bucle invertido. Probablemente por eso no funcionará.

Cambie su dirección de escucha de Nginx de la siguiente manera:

listen 8080;

Esto vinculará el proceso Nginx a todas las interfaces de red disponibles en ese servidor, incluidas localhost.

información relacionada