NGINX unter OSX - Furchtbar langsame Leistung

7

Ich habe versucht, NGINX auf meinem OSX 10.7 Lion-Computer zum Laufen zu bringen. Ich habe es ausgeführt, aber einfache HTML-Seiten alle paar brauchen lange Zeit zum Laden; zum Beispiel:

<html> 
  <body>
    test
  </body> 
</html>

Gleiches passiert mit PHP:

<?php
  echo('hi');
?>

Wenn ich auf Aktualisieren drücke, scheint es, als würde fast die gesamte Seite neu erstellt, bevor sie gerendert und eine Art Objekt erstellt wird. Nur schmerzhaft langsam ..

Dies scheint am häufigsten zu sein, wenn ich etwas codiere und dann zurück gehe, um eine Seite zu aktualisieren. (10-20 + Sekunden, dann geht das Zurückgehen und Aktualisieren einer Seite gut 4-6 Sekunden). Es scheint fast so, als ob es nach dem Leerlauf eine Weile dauert, bis es wieder aufwacht.

Ich ziehe mir die Haare aus und versuche zu verstehen, was los ist. Hoffentlich kann mir jemand etwas Licht ins Dunkel bringen.

Systemkonfiguration:

  • Betriebssystem: OSX 10.7.2

  • Prozessor: 2 x 2,66 GHz Dual-Core Intel Xeon

  • Speicher: 8 GB 667 MHz

Nginx-Version: 1.0.11

PHP-Version: 5.3.9

Ich habe dies von einem sauberen OSX-Format installiert (was ich anfangs für meinen Fehler hielt, leider nicht).

Aktualisieren

Nachdem ich meine error_log-Datei so aktualisiert habe, dass sie das Debugging gemäß Fox 'Vorschlag in Kommentaren enthält, wird in meinem error_log die folgende Meldung angezeigt:

2012/01/23 11:57:02 [info] 88015#0: *26 client closed prematurely connection 
while reading client request line, client: 127.0.0.1, server: sandbox.local

Update Zwei

Bei der Inspektion mit Chrom stellte ich fest, dass die DNS-Auflösung anscheinend etwas dauert. Geben Sie hier die Bildbeschreibung ein

Update Drei - Gelöst

Nach dem Update Zwei feste / etc / hosts-Dateien zur Verwendung:

127.0.0.1 sandbox.local

UND

:: 1 sandbox.local

Dank @thinice konnte ich feststellen, dass alle Anfragen, die direkt von Telnet auf localhost abzielen, immer sofort eingingen. was dann zur DNS-Überprüfung führte und schließlich dazu führte, dies zu finden!

OSX / etc / hosts Bugs

Ich bin nicht sicher, ob dies ein Nginx-Fehler ist. Als ich zuvor Appache installiert hatte, funktionierte dies einwandfrei.

============

Hier sind meine Konfigurationsdateien:

NGINX Konfig

user petrogad staff;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /usr/local/ngnix/var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include mime.types;

    default_type text/plain;
    server_tokens off;

    sendfile on;
    tcp_nopush on;
    keepalive_timeout 10;

   # gzip on;
   # gzip_comp_level 2;
   # gzip_proxied any;
   # gzip_types text/plain text/css text/javascript application/json application/x-javascript text/xml application/xml application/xml+rss;

    index index.html index.php;
    include /usr/local/ngnix/conf/sites-enabled/*.link;
}

Serverkonfiguration

{
    listen 80;
    server_name sandbox.local;
    root /www/sandbox;

    access_log /Users/petrogad/logs/ngnix-sites/sandbox_log.txt;
    error_log /Users/petrogad/logs/ngnix-sites/sandbox_log.txt;

    location /
    {
        # First attempt to serve request as file, then
        # as directory, then fall back to index.html
        try_files $uri $uri/ /index.html;
        autoindex on;
    }

    include /usr/local/ngnix/conf/php.conf;
}

PHP einschließen

fastcgi_intercept_errors on;

location ~ \.php$
{
    #fastcgi_intercept_errors on;
    fastcgi_param PATH_INFO         $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info;
    fastcgi_param QUERY_STRING      $query_string;
    fastcgi_param REQUEST_METHOD    $request_method;
    fastcgi_param CONTENT_TYPE      $content_type;
    fastcgi_param CONTENT_LENGTH    $content_length;
    fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME   $request_filename;
    fastcgi_param REQUEST_URI       $request_uri;
    fastcgi_param DOCUMENT_URI      $document_uri;
    fastcgi_param DOCUMENT_ROOT     $document_root;
    fastcgi_param SERVER_PROTOCOL   $server_protocol;
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE   nginx;
    fastcgi_param REMOTE_ADDR       $remote_addr;
    fastcgi_param REMOTE_PORT       $remote_port;
    fastcgi_param SERVER_ADDR       $server_addr;
    fastcgi_param SERVER_PORT       $server_port;
    fastcgi_param SERVER_NAME       $server_name;

    fastcgi_read_timeout 60; # Set fairly high for debugging

    fastcgi_pass  127.0.0.1:9001; # Non-default port
    fastcgi_index index.php;
}

Schnelle CGI-Konfiguration

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

PHP-FPM-Konfiguration

[global]
pid = /usr/local/php-5.3.9/var/run/php-fpm.pid
daemonize = yes

[www]
listen = 127.0.0.1:9001
user = petrogad
group = staff
pm = dynamic
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

Versucht Einfache Lösung mit der folgenden Nginx-Konfiguration, dasselbe langsame Ergebnis wie oben:

user petrogad staff;
worker_processes  2;


pid        /usr/local/ngnix/var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {

    include mime.types;

    default_type text/plain;
    server_tokens off;

    sendfile on;
    tcp_nopush off;
    keepalive_timeout 0;

    index index.html;

  server
  {
    listen 80;
    server_name sandbox.local;
    root /www/sandbox;

    access_log /Users/petrogad/logs/ngnix-sites/sandbox_log.txt;
    error_log /Users/petrogad/logs/ngnix-sites/sandbox_log.txt;

    location /
    {
        autoindex on;
    }

  }



}
Petrogad
quelle
2
Sehr gut komponierte Frage.
GWaldo
Gute Frage - das einzige, was auffällt, ist der Wert von worker_processes. Versuchen Sie, ihn so zu reduzieren, dass er kleiner oder gleich der Anzahl Ihrer CPU-Kerne ist. Versuchen Sie auch, einen Benchmark (ab, seige, httperf usw.) direkt für den Nginx-Server auszuführen (um Rendering-Probleme, Netzwerke usw. auszuschließen, die bei einem Browser auftreten können)
cyberx86
ändert die Einstellung resolver_timeout 1s;etwas? Auch die Einstellung error_log /Users/petrogad/logs/ngnix-sites/sandbox_log.txt debug;könnte einen Einblick bringen ...
Fox
@ cyberx86 Ich werde heute jmeter dagegen ausführen, um dies zu bestätigen. Ich habe mit den Arbeitsprozessen experimentiert und habe diese mit dem gleichen Ergebnis immer noch auf 2 gesenkt. Ich melde mich zurück, nachdem ich jmeter dagegen ausgeführt habe. Prost
Petrogad
@ Fox Ich habe beide hinzugefügt; es machte keinen Unterschied; Allerdings habe ich einen Fehler in der Protokolldatei gesehen (oben aktualisiert)
Petrogad

Antworten:

2

Entfernen Sie zunächst alle unnötigen Konfigurationsoptionen.

Holen Sie sich das Setup auf eine Standardkonfiguration "Ich bediene nur HTML-Dateien". Optimierungen entfernen.

Fügen Sie langsam nach und nach Aspekte hinzu, starten Sie Ihren Stack neu und testen Sie.

Wenn Sie sich ehrgeizig fühlen, können Sie straceauf einem einzelnen Serverprozess laufen , um Timings zu erhalten. Schauen Sie sich das für einen Crashkurs an .

dünnes Eis
quelle
Werde dies heute Abend testen, habe ich zunächst das gesamte PHP auskommentiert, um einfach zu versuchen, HTML zum Laufen zu bringen; hatte jedoch kein Glück. Ich werde es aber noch einmal versuchen und wirklich alles zu einem nackten Aussehen ausziehen. Danke für Ihre Antwort.
Petrogad
Habe dies heute Abend mit der obigen Lösung versucht; hat nicht funktioniert, immer noch langsam. Ich werde sehen, ob ich nicht durch Strace kommen kann. Vielen Dank!
Petrogad
Wenig mehr zu aktualisieren; Vielen Dank für den Strace Link, sehr informativ! Wenn ich versuche, mit Telnet auf meine Testseite zuzugreifen, kann ich keine Verzögerung feststellen, jedes Mal, wenn sofort identische Header wie beim Chrome-Browser verwendet werden. Ich habe das obige Bild jedoch in Chrom gesehen. Ich bin mir nicht sicher, ob das überhaupt hilft. Vielen Dank für Ihre Zeit und Hilfe.
Petrogad
Versuchen Sie, 'fetch' oder 'wget' (nicht sicher, was OSX hat) in der URL zu verwenden, um die Geschwindigkeit zu bestätigen. Haben Sie einen alternativen Browser zum Testen? Versuchen Sie vielleicht, Chrome in-cognito (Strg-Umschalt-n unter Windows) zu starten, um alle Schnickschnack zu deaktivieren und es zu versuchen.
Dünne
1
Bei weiteren Untersuchungen konnte ich :: 1 zu meiner Host-Datei hinzufügen, wodurch das Problem behoben wurde! Anscheinend gibt es ein Problem mit NGINX unter OSX Lion und ipv6
Petrogad