2016-08-02 3 views
2

У меня есть сервер приложений Node.js, который находится за конфигурацией Nginx, которая работает хорошо. Я ожидаю некоторого увеличения нагрузки и решил, что я продвинулся, настроив еще один Nginx для обслуживания статического файла на сервере приложений Node.js. Итак, по сути, у меня установлен обратный прокси Nginx перед Nginx & Node.js.Nginx медленный статический файл (медленнее, чем узел?)

Когда я перезагрузить Nginx, и пусть он начнет обслуживать запросы (Nginx < ->Nginx) по маршрутам /publicfile/, я заметил значительное уменьшение скорости. Что-то, что принимало Nginx < ->Node.js около 3 секунд не принималось Nginx < ->Nginx ~ 15 секунд!

Я новичок в Nginx и потратил большую часть дня на это и, наконец, решил опубликовать для некоторой помощи сообщества. Благодаря!

Веб перед 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; 
} 

Веб перед Nginx Server блок, который направляет статические файлы в Nginx за ним (на другой коробке):

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; 
    } 
} 

И, наконец, " backend ":

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

Ваша конфигурация хорошая. Однако есть некоторые соображения. Вы сказали, что сервер backend находится в другой коробке. Являются ли они в одной физической сети? Это может объяснить снижение производительности, особенно если это не так. Он также выглядит так, как будто у вас нет сжатия 'gzip' на бэкэнд-блоке. Теперь из внешнего интерфейса он будет выглядеть так, как будто он сжат (потому что это так), но файлы отправляются несжатыми между двумя блоками. Кроме того, постарайтесь снизить уровень сжатия примерно до 6. После этого он не сжимается, и вы освобождаете процессорные циклы. –

+0

Наконец, вы захотите изучить директиву 'sendfile_max_chunk' и поэкспериментировать с параметрами. Посмотрите [здесь] (https://www.nginx.com/blog/thread-pools-boost-performance-9x/) для тематического исследования. Отключение журнала доступа также улучшит производительность, но не сильно, если это не 1000 статических файлов, которые вы доставляете. –

+0

@KeenanLawrence Спасибо, что посмотрели код.Они находятся в одной физической сети, и я использую IP-адрес локальной сети для подключения, чтобы они не связывались за пределами локальной сети. Вы правы насчет 'sendfile_max_chunk', который сделал трюк! –

ответ

3

@keenanLawrence mentio ned в комментариях выше, sendfile_max_chunk директива.

После установки sendfile_max_chunk на 512k я увидел значительное улучшение скорости доставки моего статического файла (с диска) от Nginx.

Я экспериментировал с ним из 8k, 32k, 128k, наконец, & 512k Разница, кажется, на один сервер для конфигурации на оптимальном chunk size в зависимости от содержания доставлены, доступных потоков, & нагрузку на сервер запроса.

я заметил еще один значительный удар в исполнении, когда я изменил worker_processes auto;worker_processes 2; на который пошел от использования worker_process на каждом процессоре только с помощью 2. В моем случае это было более эффективно, так как у меня также есть серверы приложений Node.js, работающие на одном компьютере, и они также выполняют операции над процессором.

+0

Отлично! Я рад, что вам удалось улучшить ваши скорости. Да, эксперимент - это путь, потому что конфигурации сервера разные. Спасибо, что вы указали директиву 'worker_processes', я об этом не думал. –

Смежные вопросы