У меня есть сервер приложений 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;
}
}
}
Ваша конфигурация хорошая. Однако есть некоторые соображения. Вы сказали, что сервер backend находится в другой коробке. Являются ли они в одной физической сети? Это может объяснить снижение производительности, особенно если это не так. Он также выглядит так, как будто у вас нет сжатия 'gzip' на бэкэнд-блоке. Теперь из внешнего интерфейса он будет выглядеть так, как будто он сжат (потому что это так), но файлы отправляются несжатыми между двумя блоками. Кроме того, постарайтесь снизить уровень сжатия примерно до 6. После этого он не сжимается, и вы освобождаете процессорные циклы. –
Наконец, вы захотите изучить директиву 'sendfile_max_chunk' и поэкспериментировать с параметрами. Посмотрите [здесь] (https://www.nginx.com/blog/thread-pools-boost-performance-9x/) для тематического исследования. Отключение журнала доступа также улучшит производительность, но не сильно, если это не 1000 статических файлов, которые вы доставляете. –
@KeenanLawrence Спасибо, что посмотрели код.Они находятся в одной физической сети, и я использую IP-адрес локальной сети для подключения, чтобы они не связывались за пределами локальной сети. Вы правы насчет 'sendfile_max_chunk', который сделал трюк! –