{"id":1010,"date":"2026-08-29T23:07:44","date_gmt":"2026-08-29T23:07:44","guid":{"rendered":"https:\/\/virtualserversvps.com\/blog\/?p=1010"},"modified":"2026-09-29T22:04:09","modified_gmt":"2026-09-29T22:04:09","slug":"nginx-reverse-proxy-vps-setup-guide","status":"publish","type":"post","link":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/","title":{"rendered":"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A reverse proxy is the single highest-leverage piece of software on a small VPS. It terminates TLS, absorbs slow clients, and keeps a pool of persistent connections open to your application so that PHP-FPM, Node, or Gunicorn never has to pay for a TCP handshake. This guide skips the &#8220;apt install nginx&#8221; filler and focuses on the directives that change behaviour under load: upstream keepalive, proxy buffering, and timeout arithmetic that prevents the classic 502 and 504 cascade.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why the default proxy config falls over<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Out of the box, Nginx opens a new TCP connection to the upstream for every proxied request and closes it immediately afterwards. On a 2 vCPU VPS serving 300 requests\/second, that is 600 extra socket operations and 300 TIME_WAIT entries per second. The upstream&#8217;s accept queue becomes the bottleneck long before CPU does.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix is an upstream block with keepalive, and the matching <code>proxy_set_header Connection \"\"<\/code> that stops Nginx from passing <code>Connection: close<\/code> to the backend.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>upstream app_backend {\n    server 127.0.0.1:9000;\n    keepalive 32;          # idle connections cached per worker\n    keepalive_requests 1000;\n    keepalive_timeout 60s;\n}\n\nserver {\n    listen 443 ssl http2;\n    server_name example.com;\n\n    location \/ {\n        proxy_pass http:\/\/app_backend;\n        proxy_http_version 1.1;\n        proxy_set_header Connection \"\";   # required for keepalive\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Sizing the keepalive pool<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>keepalive<\/code> value is per worker process, not global. With <code>worker_processes auto<\/code> on a 2 vCPU box you get 2 workers, so <code>keepalive 32<\/code> means up to 64 idle backend connections. Measure the real concurrency first:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># active connections to the upstream, sampled over 10s\nss -tn state established '( dport = :9000 )' | wc -l\n\n# verify Nginx is reusing backend sockets (TIME_WAIT should be near zero)\nwatch -n1 \"ss -tn state time-wait '( dport = :9000 )' | wc -l\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A healthy keepalive pool shows a flat, low TIME_WAIT count. If TIME_WAIT climbs in step with request rate, the <code>Connection \"\"<\/code> header is missing or <code>proxy_http_version<\/code> is still 1.0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Buffering: protect the backend from slow clients<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without buffering, a backend worker stays occupied for the entire duration of a slow client download. For dynamic sites the right posture is to buffer responses on disk up to a sane limit, then stream.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy_buffering on;\nproxy_buffers 16 16k;        # 256 KB total per connection\nproxy_buffer_size 16k;       # headers, must exceed largest response header\nproxy_busy_buffers_size 32k;\nproxy_max_temp_file_size 1024m;\n\n# stream large downloads instead of buffering them\nlocation ~* \\.(mp4|zip|iso)$ {\n    proxy_buffering off;\n    proxy_request_buffering off;\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Directive<\/th><th>Too low<\/th><th>Too high<\/th><\/tr><\/thead><tbody><tr><td>proxy_buffer_size<\/td><td>502 &#8220;upstream sent too big header&#8221;<\/td><td>wasted RAM per idle conn<\/td><\/tr><tr><td>proxy_busy_buffers_size<\/td><td>client sees stuttering<\/td><td>memory growth on many conns<\/td><\/tr><tr><td>keepalive<\/td><td>TIME_WAIT churn<\/td><td>idle sockets held on backend<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Timeout arithmetic that prevents 504s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Timeouts must be ordered from the outside in: the proxy must wait longer than the backend, so the backend&#8217;s error surfaces as a clean 502\/500 rather than a truncated connection. A common production set:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>proxy_connect_timeout 5s;\nproxy_send_timeout    60s;\nproxy_read_timeout    60s;\nsend_timeout          60s;\n\n# make Nginx try the next upstream on a timeout, not just a 502\nproxy_next_upstream error timeout http_502 http_504;\nproxy_next_upstream_tries 2;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If your application legitimately needs 90 seconds for a report export, raise <code>proxy_read_timeout<\/code> only for that location rather than globally. Global long timeouts are how a single stuck request consumes a worker slot that thousands of fast requests needed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verifying the change<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reload without dropping connections and confirm the behaviour with a quick benchmark against the loopback:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nginx -t && systemctl reload nginx\n\n# 5000 requests, 50 concurrent, against the proxied endpoint\nwrk -t4 -c50 -d20s http:\/\/127.0.0.1\/\n\n# backend handshake churn should not scale with request count\nnstat -az TcpExtTCPReqQFullDrop TcpPassiveOpens<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>TcpPassiveOpens<\/code> grows by roughly one per request, keepalive is not working. After the fix it should grow only as workers cycle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TLS and CPU on a small VPS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Terminating TLS at the proxy is the right call, but RSA handshakes are expensive on a single vCPU. Prefer an ECDSA certificate, enable session resumption, and let <a href=\"https:\/\/virtualserversvps.com\/\">the main site&#8217;s comparison pages<\/a> guide your instance sizing \u2014 a proxy plus app plus database rarely fits comfortably under 2 GB.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssl_protocols TLSv1.2 TLSv1.3;\nssl_session_cache shared:SSL:10m;\nssl_session_timeout 1d;\nssl_session_tickets on;   # or off if you rotate keys aggressively\n\n# check resumption is actually happening\nopenssl s_client -connect example.com:443 -reconnect -no_ticket 2>\/dev\/null | grep -c \"New,\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">HTTP\/2, WebSockets and upgrade headers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A reverse proxy that forwards plain HTTP\/1.1 will silently break two things people rely on: HTTP\/2 multiplexing to the client, and WebSocket upgrades to the backend. The first requires <code>http2<\/code> on the listening socket (or <code>http2 on;<\/code> in newer Nginx), the second requires explicit upgrade headers and a long read timeout on the specific location.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># enable HTTP\/2 on the TLS listener\nlisten 443 ssl;\nhttp2 on;\n\n# WebSocket upgrade location\nlocation \/ws\/ {\n    proxy_pass http:\/\/app_backend;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_read_timeout 3600s;   # long-lived sockets\n    proxy_send_timeout 3600s;\n    proxy_buffering off;        # never buffer a socket stream\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note the conflict: <code>Connection \"upgrade\"<\/code> defeats keepalive for that location. Keep application traffic and WebSocket traffic on separate <code>location<\/code> blocks so the general path can retain its persistent connection pool.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Real client IP behind a CDN or load balancer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When a CDN or an upstream load balancer sits in front of your VPS proxy, <code>$remote_addr<\/code> becomes the balancer&#8217;s address and every log line is useless for rate limiting or forensics. The <code>real_ip<\/code> module restores the true client address, but only from sources you trust.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># trust only the CDN edge ranges\nset_real_ip_from 203.0.113.0\/24;\nreal_ip_header X-Forwarded-For;\nreal_ip_recursive on;\n\n# confirm the module is compiled in\nnginx -V 2>&1 | tr ' ' '\\n' | grep -i realip<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Getting this wrong is a security issue, not just a logging one: if you blindly trust <code>X-Forwarded-For<\/code> from any source, a client can spoof its own IP and evade your <code>limit_req<\/code> rules. Restrict <code>set_real_ip_from<\/code> to the actual proxy ranges.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Observing the proxy under real traffic<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># enable a status endpoint (restrict to localhost)\nlocation = \/nginx_status {\n    stub_status;\n    allow 127.0.0.1;\n    deny all;\n}\n\n# read active\/idle counts and accepted vs handled requests\ncurl -s http:\/\/127.0.0.1\/nginx_status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>active<\/code> connections sit near your worker_connections limit, or <code>handled<\/code> lags <code>accepted<\/code>, you are dropping connections and should revisit worker sizing rather than proxy timeouts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Upstream <code>keepalive<\/code> plus <code>Connection \"\"<\/code> eliminates per-request handshakes; verify with <code>TcpPassiveOpens<\/code>.<\/li><li><code>proxy_buffer_size<\/code> must exceed your largest response header or you get 502s that look like app bugs.<\/li><li>Order timeouts so the backend fails first; use <code>proxy_next_upstream<\/code> to retry cleanly.<\/li><li>Keep global timeouts short and override per-location only where genuinely needed.<\/li><li>On low-RAM instances, see the <a href=\"https:\/\/virtualserversvps.com\/managed-vs-unmanaged\">managed vs unmanaged comparison<\/a> before deciding to self-manage the TLS stack.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A reverse proxy is the single highest-leverage piece of software on a small VPS. It terminates TLS, absorbs slow clients, and keeps a pool of persistent connections open to your&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":3,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1010","post","type-post","status-publish","format-standard","hentry","category-vps-guides-tutorials"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter - Virtual Servers VPS Blog<\/title>\n<meta name=\"description\" content=\"A reverse proxy is the single highest-leverage piece of software on a small VPS. It terminates TLS, absorbs slow clients, and keeps a pool of persistent\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter\" \/>\n<meta property=\"og:description\" content=\"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter\" \/>\n<meta property=\"og:url\" content=\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Virtual Servers VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-29T23:07:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-29T22:04:09+00:00\" \/>\n<meta name=\"author\" content=\"Virtual-Servers-Vps-Editor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Virtual-Servers-Vps-Editor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/\",\"name\":\"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter - Virtual Servers VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\"},\"datePublished\":\"2026-08-29T23:07:44+00:00\",\"dateModified\":\"2026-09-29T22:04:09+00:00\",\"author\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\"},\"description\":\"A reverse proxy is the single highest-leverage piece of software on a small VPS. It terminates TLS, absorbs slow clients, and keeps a pool of persistent\",\"breadcrumb\":{\"@id\":\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/virtualserversvps.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#website\",\"url\":\"https:\/\/virtualserversvps.com\/blog\/\",\"name\":\"Virtual Servers VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0\",\"name\":\"Virtual-Servers-Vps-Editor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g\",\"caption\":\"Virtual-Servers-Vps-Editor\"},\"sameAs\":[\"https:\/\/virtualserversvps.com\/blog\"],\"url\":\"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter - Virtual Servers VPS Blog","description":"A reverse proxy is the single highest-leverage piece of software on a small VPS. It terminates TLS, absorbs slow clients, and keeps a pool of persistent","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/","og_locale":"en_US","og_type":"article","og_title":"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter","og_description":"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter","og_url":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/","og_site_name":"Virtual Servers VPS Blog","article_published_time":"2026-08-29T23:07:44+00:00","article_modified_time":"2026-09-29T22:04:09+00:00","author":"Virtual-Servers-Vps-Editor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Virtual-Servers-Vps-Editor","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/","url":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/","name":"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter - Virtual Servers VPS Blog","isPartOf":{"@id":"https:\/\/virtualserversvps.com\/blog\/#website"},"datePublished":"2026-08-29T23:07:44+00:00","dateModified":"2026-09-29T22:04:09+00:00","author":{"@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0"},"description":"A reverse proxy is the single highest-leverage piece of software on a small VPS. It terminates TLS, absorbs slow clients, and keeps a pool of persistent","breadcrumb":{"@id":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/virtualserversvps.com\/blog\/nginx-reverse-proxy-vps-setup-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/virtualserversvps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Nginx Reverse Proxy on a VPS: Upstream Keepalive, Buffering and Timeouts That Actually Matter"}]},{"@type":"WebSite","@id":"https:\/\/virtualserversvps.com\/blog\/#website","url":"https:\/\/virtualserversvps.com\/blog\/","name":"Virtual Servers VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/virtualserversvps.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/82a299a8284a66ff49f97c74684724a0","name":"Virtual-Servers-Vps-Editor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/virtualserversvps.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d820b15f1cd028e97610d9adf536df7be5cb6423869967037d468d5355fa003f?s=96&d=mm&r=g","caption":"Virtual-Servers-Vps-Editor"},"sameAs":["https:\/\/virtualserversvps.com\/blog"],"url":"https:\/\/virtualserversvps.com\/blog\/author\/virtualserversvps\/"}]}},"_links":{"self":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/comments?post=1010"}],"version-history":[{"count":5,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1010\/revisions"}],"predecessor-version":[{"id":1249,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/posts\/1010\/revisions\/1249"}],"wp:attachment":[{"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/media?parent=1010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/categories?post=1010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtualserversvps.com\/blog\/wp-json\/wp\/v2\/tags?post=1010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}