2016-08-02 33 views
2

Ich habe einen Node.js App-Server, der hinter einer Nginx-Konfiguration sitzt, die gut funktioniert hat. Ich erwarte eine Erhöhung der Auslastung und dachte mir, dass ich weiterkommen würde, indem ich ein weiteres Nginx-System für die statische Datei auf dem Node.js-Anwendungsserver einrichten würde. Also, im Wesentlichen habe ich Nginx Reverse Proxy vor Nginx & Node.js eingerichtet.Nginx langsamer statischer Dateiserver (langsamer als Knoten?)

Wenn ich Nginx nachladen und lassen Sie es starten, um die Anfragen dienen (Nginx < ->Nginx) auf den Strecken /publicfile/, bemerke ich eine signifikante Abnahme der Geschwindigkeit. Etwas, das Nginx - Node.js ->Node.js um 3 Sekunden dauerte nicht Nginx < ->Nginx ~ 15 Sekunden!

Ich bin neu bei Nginx und habe den größten Teil des Tages damit verbracht und mich schließlich dazu entschieden, für einige Community-Hilfe zu posten. Vielen Dank!

Die Bahn zugewandt Nginx nginx.conf:

http { 
# Main settings 
sendfile      on; 
tcp_nopush      on; 
tcp_nodelay      on; 
client_header_timeout   1m; 
client_body_timeout    1m; 
client_header_buffer_size  2k; 
client_body_buffer_size   256k; 
client_max_body_size   256m; 
large_client_header_buffers  4 8k; 
send_timeout     30; 
keepalive_timeout    60 60; 
reset_timedout_connection  on; 
server_tokens     off; 
server_name_in_redirect   off; 
server_names_hash_max_size  512; 
server_names_hash_bucket_size 512; 

# Log format 
log_format main '$remote_addr - $remote_user [$time_local] $request ' 
        '"$status" $body_bytes_sent "$http_referer" ' 
        '"$http_user_agent" "$http_x_forwarded_for"'; 
log_format bytes '$body_bytes_sent'; 

access_log   /var/log/nginx/access.log main; 

# Mime settings 
include    /etc/nginx/mime.types; 
default_type  application/octet-stream; 


# Compression 
gzip    on; 
gzip_comp_level  9; 
gzip_min_length  512; 
gzip_buffers  8 64k; 
gzip_types   text/plain text/css text/javascript 
        application/x-javascript application/javascript; 
gzip_proxied  any; 


# Proxy settings 
#proxy_redirect  of; 
proxy_set_header Host   $host; 
proxy_set_header X-Real-IP  $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_pass_header Set-Cookie; 
proxy_connect_timeout 90; 
proxy_send_timeout 90; 
proxy_read_timeout 90; 
proxy_buffers  32 4k; 

real_ip_header  CF-Connecting-IP; 


# SSL PCI Compliance 
# - removed for brevity 

# Error pages 
# - removed for brevity 


# Cache 
proxy_cache_path /var/cache/nginx levels=2 keys_zone=cache:10m inactive=60m max_size=512m; 
proxy_cache_key "$host$request_uri $cookie_user"; 
proxy_temp_path /var/cache/nginx/temp; 
proxy_ignore_headers Expires Cache-Control; 
proxy_cache_use_stale error timeout invalid_header http_502; 
proxy_cache_valid any 3d; 

proxy_http_version 1.1; # recommended with keepalive connections 
# WebSocket proxying - from http://nginx.org/en/docs/http/websocket.html 
proxy_set_header Upgrade $http_upgrade; 
proxy_set_header Connection "upgrade"; 

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    ''  close; 
} 

map $http_cookie $no_cache { 
    default 0; 
    ~SESS 1; 
    ~wordpress_logged_in 1; 
} 

upstream backend { 
    # my 'backend' server IP address (local network) 
    server xx.xxx.xxx.xx:80; 
} 

# Wildcard include 
include    /etc/nginx/conf.d/*.conf; 
} 

Die Bahn zugewandt Nginx Server Block, der die statischen Dateien auf die Nginx dahinter (auf einem anderen Kasten) leitet:

server { 
    listen  80 default; 
    access_log /var/log/nginx/nginx.log main; 

    # pass static assets on to the app server nginx on port 80 
    location ~* (/min/|/audio/|/fonts/|/images/|/js/|/styles/|/templates/|/test/|/publicfile/) { 
    proxy_pass http://backend; 
    } 
} 

Und schließlich die " Backend "Server:

http { 

sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
keepalive_timeout 65; 
types_hash_max_size 2048; 
sendfile_max_chunk 32; 
# server_tokens off; 

# server_names_hash_bucket_size 64; 

include /etc/nginx/mime.types; 
default_type application/octet-stream; 


access_log /var/log/nginx/access.log; 
error_log /var/log/nginx/error.log; 

server { 
    root /home/admin/app/.tmp/public; 

    listen  80 default; 
    access_log /var/log/nginx/app-static-assets.log; 

    location /publicfile { 
    alias /home/admin/APP-UPLOADS; 
    } 
} 
} 
+0

Ihre Konfiguration ist gut. Es gibt jedoch einige Überlegungen. Sie haben gesagt, dass sich der Backend-Server in einer anderen Box befindet. Sind sie im selben physischen Netzwerk? Dies könnte den Leistungsabfall erklären, vor allem wenn dies nicht der Fall ist. Es scheint auch, als ob Sie nicht die 'gzip' Kompression auf der Backend-Box haben. Jetzt wird es vom Frontend so aussehen, als ob es komprimiert wird (weil es ist), aber die Dateien werden unkomprimiert zwischen den 2 Boxen gesendet. Versuchen Sie außerdem, den Komprimierungsgrad auf etwa 6 zu senken. Sie werden danach nicht viel komprimiert und Sie werden CPU-Zyklen freigeben. –

+0

Schließlich sollten Sie die Anweisung 'sendfile_max_chunk' untersuchen und mit den Parametern experimentieren. Sehen Sie [hier] (https://www.nginx.com/blog/thread-pools-boost-performance-9x/) für eine Fallstudie. Durch das Deaktivieren des Zugriffsprotokolls wird auch die Leistung verbessert, jedoch nicht um ein Vielfaches, wenn es sich nicht um 1000 von statischen Dateien handelt, die Sie bereitstellen. –

+0

@KeenanLawrence Danke, dass Sie sich den Code angesehen haben.Sie sind im selben physischen Netzwerk und ich verwende lokale Netzwerk-IP, um eine Verbindung herzustellen, so dass sie nicht außerhalb des lokalen Netzwerks kommunizieren. Du hast Recht mit 'sendfile_max_chunk', das hat den Trick gemacht! –

Antwort

3

@keenanLawrence mentio ned in den obigen Kommentaren, sendfile_max_chunk Direktive.

Nachdem ich sendfile_max_chunk auf 512k gesetzt hatte, sah ich eine deutliche Geschwindigkeitsverbesserung in meiner statischen Datei (von der Platte) Lieferung von Nginx.

Ich experimentierte mit ihm aus 8k, 32k, 128k, & schließlich 512k Der Unterschied pro Server für die Konfiguration auf dem optimalen chunk size auf den Inhalt abhängig zu sein scheint Last geliefert wird, Threads zur Verfügung, & Serveranfrage.

Ich habe auch einen weiteren signifikanten Stoß in Leistung, wenn ich worker_processes auto;-worker_processes 2;, die von der Nutzung worker_process auf jeder CPU nur ging geändert 2 verwenden. In meinem Fall war dies effizienter, da ich auch Node.js-App-Server auf dem gleichen Computer ausgeführt habe und sie auch Operationen auf den CPUs ausführen.

+0

Ausgezeichnet! Ich bin froh, dass du es geschafft hast, deine Geschwindigkeit zu verbessern. Ja, Experimentieren ist der Weg zu gehen, weil Serverkonfigurationen unterschiedlich sind. Danke, dass Sie die "worker_processes" -Richtlinie erwähnt haben, daran hatte ich nicht gedacht. –