ubuntuusers.de

nginx löst Upstream nicht auf

Status: Gelöst | Ubuntu-Version: Server 12.04 (Precise Pangolin)
Antworten |

Skalbjarn

Anmeldungsdatum:
27. August 2012

Beiträge: Zähle...

Hallo Gemeinde,

derzeit will ich einen nginx Server als Softwareloadbalancer so konfigurieren, dass er eintreffende Requests je nach Domain an verschiedene Tomcats weiterreicht. Meine nginx.conf sieht wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
user www-data www-data;
worker_processes 6;
worker_priority 0;
error_log /var/log/nginx/error.log;
#log_not_found off;
worker_cpu_affinity 000001 000010 000100 001000 010000 100000;
events {
        multi_accept off;
        worker_connections 6144;  #Muss eventuell an die Hardware angepasst werden. Erlaubt derzeit 6 * 6144 gleichzeitige Anfragen)

}

http {
        upstream test_loads {
                server 192.168.1.117:8080 weight=1 max_fails=10 fail_timeout=60s;
                server 192.168.1.115:8080 weight=1 max_fails=10 fail_timeout=60s;
        }
        include /example/config/nginx/upstreams.conf;
        include mime.types;
        default_type application/ooctet-stream;
#       send_file on;
        keepalive_timeout 65;
        server {
                listen 80;
                server_name localhost;
                location /nginx_status {
                        stub_status on;
                        access_log off;
                        allow 127.0.0.1;
                        deny all;
                }

                error_page 500 502 503 504 /50x.html;
                location = /50x.html {
                        root html;
                }
        }
#       include /etc/nginx/conf.d/*.conf;
        include /example/config/nginx/sites/*.conf;
}

In der upstreams.conf sind insgesamt 3 Upstreamgruppen definiert. Alle wie folgt:

1
2
3
4
upstream myupstream {
        server 192.168.1.117:10080 weight=1 max_fails=10 fail_timeout=60s;
        server 192.168.1.115:10080 weight=1 max_fails=10 fail_timeout=60s;
}

In der zugehörigen Konfigdatei unter /example/config/nginx/sites/ ist folgendes enthalten:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
        error_log /var/log/nginx/co2ol.error;
        listen 80;
              server_name test.example.com;

        location = / {
                return 301 http://test.example.com/home/index?layoutTheme=mytheme_theme?;
        }

        location / {
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://cocalc$request_uri;
        #       proxy_pass http://test_loads;
        }
}

Die Prüfung der Konfiguration mittels nginx -t wirft keine Fehler. Allerdings, wenn ich versuche die Seite aufzurufen, sagt Firefox "Der Server unter www.myupstream.com konnte nicht gefunden werden". und Chromium "Fehler 105 (net::ERR_NAME_NOT_RESOLVED): Die DNS-Adresse des Servers kann nicht aufgelöst werden". Woran liegt das und wie könnte ich das abstellen?

Grüße Skalbjarn

masche85

Anmeldungsdatum:
12. Juni 2009

Beiträge: 352

Hi,

passt der DNS-Eintrag für www.myupstream.com? Ist der DNS-Eintrag evtl. nur bei myupstream.com eingetragen? Poste doch mal die gesamte Config. (Kannst ja mit Suchen&Ersetzen die Domains umbenennen) www.myupstream.com taucht in deinem Post garnicht auf.

Skalbjarn

(Themenstarter)

Anmeldungsdatum:
27. August 2012

Beiträge: 21

Hi masche85,

danke für Deine Antwort, aber ich glaube, Du hast das Grundprinzip der Upstreams von nginx nicht richtig verstanden. Mittels Upstreams, die in meinem 2. Listing definiert wurden, hast Du die Möglichkeit beliebig viele reale Server in einer einzigen Gruppe zusammen zufassen. Je nach Einstellung verteilt nginx dann die eintreffenden Requests an die Server. Die Anweisung proxy_pass http://myupstream$requesturi (in Listing 3 steht cocalc statt myupstream, da hab ich wohl das Umbenennen vergessen, sorry for that) reicht also nur weiter an einen echten Server und sollte nur intern verwendet werden. Der Upstreamname soll den Client nicht interessieren und nicht an ihn zurück geschickt werden.

Die Domain myupstream.com gibt es daher auch gar nicht. Dennoch danke für Deine Anregung.

Mittlerweile hat sich das Problem lösen lassen.

Ich hatte noch eine jsessionid in der URL. Diese musste im Serverblock gefiltert werden und in der Location als Cookie im Header gesetzt werden. Jetzt muss ich die nur noch irgendwie weiter durchreichen. Listing 3 wurde nun so angepasst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
server {
        error_log /var/log/nginx/test.error debug;
        rewrite_log on;
        access_log /var/log/nginx/test_access.log;
        listen 80;
        server_name test.example.com;
        include /raumo/config/nginx/proxy.conf;
        if ($http_cookie ~* "jsessionid=([^;]+)(?:;|$)") {
                set $co "jsessionid=$1";
        }
        location = / {
                proxy_pass http://myupstream/home/index?layoutTheme=mytheme_theme;
                proxy_set_header Cookie "$co";
                proxy_redirect default;
        }

        location / {
                proxy_pass http://myupstream;
                proxy_set_header Cookie "$co";
        }
}

Grüßle Skalbjarn

masche85

Anmeldungsdatum:
12. Juni 2009

Beiträge: 352

Hallo Skalbjarn,

ich kenne das Grundprinzip der Upstreams ziemlich gut. Habe mehrere Installationen mit diversen configs.

Das hat mich eben auch verwundert dass myupstream nicht bei proxy_pass auftauchte.

Skalbjarn

(Themenstarter)

Anmeldungsdatum:
27. August 2012

Beiträge: 21

Hi masche85,

dann entschuldige ich mich für die Unterstellung und hoffe, dass meine Erklärung wenigstens keine allzugroben Fehler enthielt 😉

Das hat mich dann auch gewundert, als ich's gesehen habe.

Grüßle

Antworten |