API端点性能

时间:2017-11-17 18:44:33

标签: node.js mongodb rest api nginx

我正在尝试对我的其余API端点的性能进行基准测试。它是一个node / mongdb端点,带有非常讨厌的聚合查询 - 一些unwraps,group和lookup。我正在使用Apache Bench(ab)来测试它在100次并发1000次下的性能。我的问题:我根据运行ab测试的位置得到了不同的结果:

  1. localhost:3000 / api_endpoint /使用ngrok隧道它=我 每秒大约50个请求。
  2. 运行测试 生产应用程序服务器直接在我看到应用程序的软管 每秒6000个请求。
  3. 从我的Web服务器/反向代理运行它我每秒看到类似5000reqs - 如果我使用API​​的相对路径。
  4. 现在:如果我在网络服务器上运行相同的测试 但这次使用域名或从本地dev运行它 机器,但击中域,现在它下降到每个9个请求 第二
  5. 我可以推断出什么?对我来说,如果我直接点击它时获得如此高的性能,那么查询似乎不应该是那么讨厌。我的nginx.conf文件中有一些配置错误,用于处理我的域请求或者存在DNS解析问题?它是一个充满异国情调的顶级域名(.ly)可能是它吗?我应该在哪里看?

    编辑:添加我的nginx.conf文件进行分析:

    user www-data;
    worker_processes 1;
    #error_log /log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    #include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    
    http {
    
      #optimizations per digitalOcean
      client_body_buffer_size 10K;
      client_header_buffer_size 1k;
      client_max_body_size 8m;
      large_client_header_buffers 2 1k;
    
      client_body_timeout 12;
      client_header_timeout 12;
      keepalive_timeout 15;
      send_timeout 10;
    
      #compression
      gzip             on;
      gzip_disable "msie6";
      gzip_proxied any;
      gzip_comp_level  6;
      gzip_buffers 16 8k;
      gzip_http_version 1.1;
      gzip_min_length  256;
      gzip_proxied     expired no-cache no-store private auth;
      gzip_types       text/plain application/x-javascript text/xml text/css application/xml application/json text/xml application/xml+rss application/javascript text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
     
    
      access_log off;
    
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
      #access_log  /var/log/nginx/access.log  main;
      sendfile            on;
      tcp_nopush          on;
      tcp_nodelay         on;
      types_hash_max_size 2048;
      include             /etc/nginx/mime.types;
      default_type        application/octet-stream;
      # Load modular configuration files from the /etc/nginx/conf.d directory.
      # See http://nginx.org/en/docs/ngx_core_module.html#include
      # for more information.
       
      include /etc/nginx/conf.d/*.conf;
    
      #redirect to https
      server {
        server_name www.staq.ly staq.ly getstackrank.com www.getstackrank.com;
        return 301 https://staq.ly;
      }
      
      server {
        listen 80;
        listen 443 ssl;
        
        server_name staq.ly;
        ssl_certificate /etc/nginx/ssl/staqly.crt;
        ssl_certificate_key /etc/nginx/ssl/staqly.key;
       	
        root /var/local;  
       
        location ~ ^/(sitemap.xml) {
           
        }  
        location ~ ^/(robots.txt) {
         
        }
        location ~ ^/(googlee828ea2f1ef594b3.html) {
        
        }
        location / {
          try_files $uri @prerender;
        }
        location @prerender {
          proxy_set_header X-Prerender-Token XXXXXXXX;
          set $prerender 0;
          if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
            set $prerender 1;
          }
          if ($args ~ "_escaped_fragment_") {
            set $prerender 1;
          }
          if ($http_user_agent ~ "Prerender") {
            set $prerender 0;
          }
          if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {
            set $prerender 0;
          }
          #resolve using Google's DNS server to force DNS resolution and prevent caching of IPs
          resolver 8.8.8.8;
          if ($prerender = 1) {
            #setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing
            set $prerender "service.prerender.io";
            rewrite .* /$scheme://$host$request_uri? break;
            proxy_pass http://$prerender;
          }
          if ($prerender = 0) {
            # rewrite .* /index.ejs break; # Throw away the path because this is a single page web app with only an index.html
            proxy_pass http://10.132.126.36:3000;
          }
        }
      }
    }

0 个答案:

没有答案