{"id":901,"date":"2020-08-07T13:23:55","date_gmt":"2020-08-07T13:23:55","guid":{"rendered":"https:\/\/blog.samarthya.me\/wps\/?p=901"},"modified":"2020-08-07T13:25:51","modified_gmt":"2020-08-07T13:25:51","slug":"performance-tweaks-kibana","status":"publish","type":"post","link":"https:\/\/blog.samarthya.me\/wps\/2020\/08\/07\/performance-tweaks-kibana\/","title":{"rendered":"Performance Tweaks: Kibana"},"content":{"rendered":"<p>The performance I was getting after deploying <code>Elasticsearch<\/code> 7.6.2 and <code>Kibana<\/code> in my local VM&#8217;s was not satisfactory, so I thought of deploying a front proxy <code>Nginx<\/code> in front and enabling static resources caching.<\/p>\n<p>The journey starts at installing NGINX the steps are very much simple and covered <a href=\"https:\/\/www.nginx.com\/resources\/wiki\/start\/topics\/tutorials\/install\/\">here<\/a> in detail.<\/p>\n<p>My <code>\/etc\/yum.repos.d\/nginx.repo<\/code> looks like below<\/p>\n\n\n<pre class=\"wp-block-code\"><code>&#91;nginx-stable]\nname=nginx stable repo\nbaseurl=http:\/\/nginx.org\/packages\/centos\/$releasever\/$basearch\/\ngpgcheck=1\nenabled=1\ngpgkey=https:\/\/nginx.org\/keys\/nginx_signing.key\nmodule_hotfixes=true\n\n&#91;nginx-mainline]\nname=nginx mainline repo\nbaseurl=http:\/\/nginx.org\/packages\/mainline\/centos\/$releasever\/$basearch\/\ngpgcheck=1\nenabled=1\ngpgkey=https:\/\/nginx.org\/keys\/nginx_signing.key\nmodule_hotfixes=true<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>nginx -v\nnginx version: nginx\/1.19.1<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>nginx -V\nnginx version: nginx\/1.19.1\nbuilt by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) \nbuilt with OpenSSL 1.0.2k-fips  26 Jan 2017\nTLS SNI support enabled\nconfigure arguments: --prefix=\/etc\/nginx --sbin-path=\/usr\/sbin\/nginx --modules-path=\/usr\/lib64\/nginx\/modules --conf-path=\/etc\/nginx\/nginx.conf --error-log-path=\/var\/log\/nginx\/error.log --http-log-path=\/var\/log\/nginx\/access.log --pid-path=\/var\/run\/nginx.pid --lock-path=\/var\/run\/nginx.lock --http-client-body-temp-path=\/var\/cache\/nginx\/client_temp --http-proxy-temp-path=\/var\/cache\/nginx\/proxy_temp --http-fastcgi-temp-path=\/var\/cache\/nginx\/fastcgi_temp --http-uwsgi-temp-path=\/var\/cache\/nginx\/uwsgi_temp --http-scgi-temp-path=\/var\/cache\/nginx\/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'<\/code><\/pre>\n\n\n\n<p>My Kibana is deployed on the same host and listening on <code>5601<\/code><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\"><li>Handy commands <ol><li><code>nginx -t<\/code> to test the changes are syntactically correct before loading the nginx.<\/li><li><code>systemctl reload nginx<\/code> reloads the nginx configurations.<\/li><\/ol><\/li><\/ul>\n<\/div><\/div>\n\n\n\n<p>Let&#8217;s get started with the configuration definition and I will explain as I do it. The default configuration for me looks like below<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user  nginx;\nworker_processes  1;\n\nerror_log  \/var\/log\/nginx\/error.log warn;\npid        \/var\/run\/nginx.pid;\n\n\nevents {\n    worker_connections  1024;\n}\n\n\nhttp {\n    include       \/etc\/nginx\/mime.types;\n    default_type  application\/octet-stream;\n\n    log_format  main  '$remote_addr - $remote_user &#91;$time_local] \"$request\" '\n                      '$status $body_bytes_sent \"$http_referer\" '\n                      '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n    access_log  \/var\/log\/nginx\/access.log  main;\n\n    sendfile        on;\n    #tcp_nopush     on;\n\n    keepalive_timeout  65;\n\n    #gzip  on;\n\n    include \/etc\/nginx\/conf.d\/*.conf;\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Notice<\/strong> the line <code><a href=\"http:\/\/nginx.org\/en\/docs\/ngx_core_module.html#include\">include<\/a> \/etc\/nginx\/conf.d\/*.conf;<\/code> this allows you to define multiple configurations within the http context. <\/li><li><a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#server\">Server<\/a> block has a scope context of http and sets the configuration for a virtual server hence you will notice in the configuration files we defined in <code>conf.d<\/code> we usually have only <code>server<\/code> blocks<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status nginx<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\u25cf nginx.service - nginx - high performance web server\n   Loaded: loaded (\/usr\/lib\/systemd\/system\/nginx.service; enabled; vendor preset: disabled)\n   Active: active (running) since Fri 2020-08-07 11:53:24 UTC; 9s ago\n     Docs: http:\/\/nginx.org\/en\/docs\/\n  Process: 224365 ExecStart=\/usr\/sbin\/nginx -c \/etc\/nginx\/nginx.conf (code=exited, status=0\/SUCCESS)\n Main PID: 224366 (nginx)\n    Tasks: 2\n   CGroup: \/system.slice\/nginx.service\n           \u251c\u2500224366 nginx: master process \/usr\/sbin\/nginx -c \/etc\/nginx\/nginx.conf\n           \u2514\u2500224367 nginx: worker process<\/code><\/pre>\n\n\n\n<p>Let&#8217;s make some changes<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-very-dark-gray-color\"><p>Syntax:<\/p><p><code><strong>worker_processes<\/strong> <em>number<\/em> | auto;<\/code><\/p><cite>http:\/\/nginx.org\/en\/docs\/ngx_core_module.html#worker_processes<\/cite><\/blockquote><\/figure>\n\n\n\n<p>The default value of 1 not going to suffice for my case so bump it up to <code>auto<\/code> which should be ideal. Please note the <code>auto<\/code> parameter is supported starting from versions 1.3.8 and 1.2.5 only.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>worker_processes  auto;<\/code><\/pre>\n\n\n\n<p>It allows to create a more conducive environment and in my case since the VM has 16 cores the number of workers launched when I enabled Nginx it is pushed to 16 (+1 master).<\/p>\n\n\n\n<p>To allow more information in case of <a href=\"http:\/\/nginx.org\/en\/docs\/ngx_core_module.html#error_log\">errors<\/a>, let me add the debug log information as well<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>error_log \/var\/log\/nginx\/error.log debug;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-very-dark-gray-color\"><p>Syntax:<\/p><p><code><strong>error_log<\/strong> <em>file<\/em> [<em>level<\/em>];<\/code><\/p><\/blockquote><\/figure>\n\n\n\n<p>Time to reload the configuration and see if the number of worker thread changes<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl status nginx\n\u25cf nginx.service - nginx - high performance web server\n   Loaded: loaded (\/usr\/lib\/systemd\/system\/nginx.service; enabled; vendor preset: disabled)\n   Active: active (running) since Fri 2020-08-07 11:53:24 UTC; 42s ago\n     Docs: http:\/\/nginx.org\/en\/docs\/\n  Process: 224398 ExecReload=\/bin\/sh -c \/bin\/kill -s HUP $(\/bin\/cat \/var\/run\/nginx.pid) (code=exited, status=0\/SUCCESS)\n  Process: 224365 ExecStart=\/usr\/sbin\/nginx -c \/etc\/nginx\/nginx.conf (code=exited, status=0\/SUCCESS)\n Main PID: 224366 (nginx)\n    Tasks: 17\n   CGroup: \/system.slice\/nginx.service\n           \u251c\u2500224366 nginx: master process \/usr\/sbin\/nginx -c \/etc\/nginx\/nginx.conf\n           \u251c\u2500224402 nginx: worker process\n           \u251c\u2500224403 nginx: worker process\n           \u251c\u2500224404 nginx: worker process\n           \u251c\u2500224405 nginx: worker process\n           \u251c\u2500224406 nginx: worker process\n           \u251c\u2500224407 nginx: worker process\n           \u251c\u2500224408 nginx: worker process\n           \u251c\u2500224409 nginx: worker process\n           \u251c\u2500224410 nginx: worker process\n           \u251c\u2500224411 nginx: worker process\n           \u251c\u2500224412 nginx: worker process\n           \u251c\u2500224413 nginx: worker process\n           \u251c\u2500224414 nginx: worker process\n           \u251c\u2500224415 nginx: worker process\n           \u251c\u2500224416 nginx: worker process\n           \u2514\u2500224417 nginx: worker process<\/code><\/pre>\n\n\n\n<p>The <code>default.conf<\/code> defined in <code>\/etc\/nginx\/conf.d <\/code>looks like<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n    listen       80;\n    server_name  localhost;\n\n\n    location \/ {\n        root   \/usr\/share\/nginx\/html;\n        index  index.html index.htm;\n    }\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#listen\">listen<\/a> directive sets the <code><em>address<\/em><\/code> and <code><em>port<\/em><\/code> for IP. An <code><em>address<\/em><\/code> may also be a hostname<\/li><li><code>server_name<\/code> sets names of a virtual server, for example<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>server_name example.com www.example.com;<\/code><\/pre>\n\n\n\n<p>If you browse to <code>http:\/\/machine.host:80<\/code> you will be presented the Nginx welcome page, now lets tweak it a little to validate if our changes do work.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>listen      &#91;::]:8989 default_server;<\/code><\/pre>\n\n\n\n<p>I changed the port and restarted the server. The same page is now presented when I hit <code>http:\/\/machine.host:8989<\/code>. <\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-very-dark-gray-color\"><p>The <code>default_server<\/code> parameter, if present, will cause the server to become the default server for the specified <code><em>address<\/em><\/code>:<code><em>port<\/em><\/code> pair.<\/p><\/blockquote><\/figure>\n\n\n\n<p>Undo the port change to default to 80 again.<\/p>\n\n\n\n<p>Let&#8217;s have only SSL communication and we shall redirect all the incoming <code>http<\/code> communication to <code>https<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Generate SSL certificates<\/h3>\n\n\n\n<p>Step 1, requires generating certificates. Follow the steps below to generate <code>private.key<\/code> and <code>public.pem<\/code> at <code>\/etc\/nginx\/ssl<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir \/etc\/nginx\/ssl<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -x509 -nodes -days 365 \\\n>   -newkey rsa:2048 \\\n>   -keyout \/etc\/nginx\/ssl\/private.key \\\n>   -out \/etc\/nginx\/ssl\/public.pem\nGenerating a 2048 bit RSA private key\n..........................+++\n.........................+++\nwriting new private key to '\/etc\/nginx\/ssl\/private.key'\n-----\nYou are about to be asked to enter information that will be incorporated\ninto your certificate request.\nWhat you are about to enter is what is called a Distinguished Name or a DN.\nThere are quite a few fields but you can leave some blank\nFor some fields there will be a default value,\nIf you enter '.', the field will be left blank.\n-----\nCountry Name (2 letter code) &#91;XX]:IN\nState or Province Name (full name) &#91;]:Telangana\nLocality Name (eg, city) &#91;Default City]:Hyderabad\nOrganization Name (eg, company) &#91;Default Company Ltd]:Samarthya.me\nOrganizational Unit Name (eg, section) &#91;]:Security\nCommon Name (eg, your name or your server's hostname) &#91;]:localmachine.host\nEmail Address &#91;]:s.r@gmail.com<\/code><\/pre>\n\n\n\n<p>Let us redirect all the traffic to https by using <code><a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_rewrite_module.html#return\">return<\/a><\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-very-dark-gray-color\"><p><code><strong>return<\/strong> <code><em>code<\/em><\/code> <code><em>URL<\/em><\/code>;<\/code><\/p><\/blockquote><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>return 301 https:\/\/$host$request_uri;<\/code><\/pre>\n\n\n\n<p>Create a sample page<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"It Works\" >\/usr\/share\/nginx\/html\/ssltest.html<\/code><\/pre>\n\n\n\n<p>Add a new configuration called <code>ssl.conf<\/code> at <code>\/etc\/nginx<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n        listen 443 ssl;\n        server_name .host;\n\n        ssl_certificate    \/etc\/nginx\/ssl\/public.pem;\n        ssl_certificate_key \/etc\/nginx\/ssl\/private.key;\n\n\n        location \/ {\n                root   \/usr\/share\/nginx\/html;\n                index   ssltest.html;\n        }\n}<\/code><\/pre>\n\n\n\n<p>Specify the certificate and key as specified above. Now, after you reload nginx and hit the default location <code>http:\/\/host<\/code> it should redirect you to <code>https:\/\/<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/ HTTP\/1.1\nHost: machine.host\nUser-Agent: Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko\/20100101 Firefox\/79.0\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,*\/*;q=0.8\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate\nDNT: 1\nConnection: keep-alive\nUpgrade-Insecure-Requests: 1\nPragma: no-cache\nCache-Control: no-cache<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP\/1.1 301 Moved Permanently\nServer: nginx\/1.19.1\nDate: Fri, 07 Aug 2020 12:53:14 GMT\nContent-Type: text\/html\nContent-Length: 169\nConnection: keep-alive\nLocation: https:\/\/machine.host\/<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;machine.host\/\nGET \/ HTTP\/1.1\nHost: machine.host\nUser-Agent: Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko\/20100101 Firefox\/79.0\nAccept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,*\/*;q=0.8\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nDNT: 1\nConnection: keep-alive\nUpgrade-Insecure-Requests: 1\nPragma: no-cache\nCache-Control: no-cache<\/code><\/pre>\n\n\n\n<p>Finally it shows <\/p>\n\n\n\n<h2 class=\"has-text-align-center wp-block-heading\">It Works<\/h2>\n\n\n\n<p>This was a simple http to https configuration the bigger question is enabling cache and forwarding the request to another server. Let&#8217;s use the <code><a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_cache\">proxy_cache<\/a><\/code> to define a zone.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-background has-luminous-vivid-orange-background-color is-style-solid-color\"><blockquote class=\"has-text-color has-very-dark-gray-color\"><p><code>proxy_cache<\/code> defines a shared memory zone used for caching.<\/p><\/blockquote><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy_cache kibana;\nproxy_cache_background_update on;\nproxy_cache_valid 200 302 60m;<\/code><\/pre>\n\n\n\n<p><code>proxy_cache_path<\/code> sets the path and other parameters of a cache.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy_cache_path \/var\/cache\/nginx\/kibana levels=1:2 keys_zone=kibana:10m max_size=1g inactive=60m;<\/code><\/pre>\n\n\n\n<p>Mind you the <code>proxy_cache_path<\/code> context is <code>http<\/code> so we will be defining it at the top<\/p>\n\n\n\n<p>Finally proxy to the kibanaserver using <code>proxy_pass<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy_cache_path \/var\/cache\/nginx\/kibana levels=1:2 keys_zone=kibana:10m max_size=1g inactive=60m;\n\nserver {\n        listen 443 ssl;\n        server_name .host;\n\n        ssl_certificate    \/etc\/nginx\/ssl\/public.pem;\n        ssl_certificate_key \/etc\/nginx\/ssl\/private.key;\n\n\n        location \/ {\n                # root   \/usr\/share\/nginx\/html;\n                # index   ssltest.html;\n                proxy_cache kibana;\n                proxy_cache_background_update on;\n                proxy_cache_valid 200 302 60m;\n                proxy_pass_request_headers on;\n                proxy_pass_request_body on;\n\n                proxy_set_header HOST $host;\n                proxy_set_header X-Forwarded-Proto $scheme;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n                \n                proxy_pass https:\/\/kibanaserver.net:5601\/;\n        }\n}<\/code><\/pre>\n\n\n\n<p>A quick listing of cache on <code>fs<\/code> can be seen by doing a directory listing<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls \/var\/cache\/nginx\/kibana\/ -als\ntotal 0\n0 drwx------ 17 nginx root  141 Aug  7 13:16 .\n0 drwxr-xr-x  8 root  root  112 Aug  7 13:05 ..\n0 drwx------ 10 nginx nginx  86 Aug  7 13:17 0\n0 drwx------ 10 nginx nginx  86 Aug  7 13:17 1\n0 drwx------ 24 nginx nginx 226 Aug  7 13:18 2\n0 drwx------ 13 nginx nginx 116 Aug  7 13:18 3\n0 drwx------ 12 nginx nginx 106 Aug  7 13:17 4\n0 drwx------  8 nginx nginx  66 Aug  7 13:18 5\n0 drwx------  8 nginx nginx  66 Aug  7 13:17 6\n0 drwx------ 12 nginx nginx 106 Aug  7 13:18 7\n0 drwx------ 11 nginx nginx  96 Aug  7 13:17 8\n0 drwx------ 16 nginx nginx 146 Aug  7 13:18 a\n0 drwx------ 14 nginx nginx 126 Aug  7 13:18 b\n0 drwx------ 15 nginx nginx 136 Aug  7 13:17 c\n0 drwx------ 10 nginx nginx  86 Aug  7 13:17 d\n0 drwx------  9 nginx nginx  76 Aug  7 13:17 e\n0 drwx------  6 nginx nginx  46 Aug  7 13:16 f<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>https:\/\/www.nginx.com\/resources\/wiki\/start\/topics\/tutorials\/install\/<\/li><li>http:\/\/nginx.org\/en\/docs\/<\/li><li>http:\/\/nginx.org\/en\/docs\/install.html<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/request_processing.html<\/li><li>http:\/\/nginx.org\/en\/docs\/ngx_core_module.html#error_log<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#listen<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#server<\/li><li>http:\/\/nginx.org\/en\/docs\/ngx_core_module.html#include<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html#ssl<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_cache<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_cache_path<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_pass<\/li><li>http:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html#var_request_uri<\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The performance I was getting after deploying Elasticsearch 7.6.2 and Kibana in my local VM&#8217;s was not satisfactory, so I thought of deploying a front proxy Nginx in front and enabling static resources caching. The journey starts at installing NGINX the steps are very much simple and covered here in detail. My \/etc\/yum.repos.d\/nginx.repo looks like [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[34],"tags":[92,93],"class_list":["post-901","post","type-post","status-publish","format-image","has-post-thumbnail","hentry","category-technical","tag-nginx","tag-performance","post_format-post-format-image"],"_links":{"self":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/comments?post=901"}],"version-history":[{"count":0,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/901\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media\/906"}],"wp:attachment":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media?parent=901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/categories?post=901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/tags?post=901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}