{"id":900,"date":"2026-07-02T06:15:44","date_gmt":"2026-07-01T23:15:44","guid":{"rendered":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/mastering-nginx-as-a-reverse-proxy-a-comprehensive-step-by-step-guide-for-beginners-and-experts\/"},"modified":"2026-07-02T06:15:44","modified_gmt":"2026-07-01T23:15:44","slug":"mastering-nginx-as-a-reverse-proxy-a-comprehensive-step-by-step-guide-for-beginners-and-experts","status":"publish","type":"post","link":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/mastering-nginx-as-a-reverse-proxy-a-comprehensive-step-by-step-guide-for-beginners-and-experts\/","title":{"rendered":"Mastering Nginx as a Reverse Proxy: A Comprehensive Step-by-Step Guide for Beginners and Experts"},"content":{"rendered":"<h1>Mastering Nginx as a Reverse Proxy: A Comprehensive Step-by-Step Guide for Beginners and Experts<\/h1>\n<h2>Introduction<\/h2>\n<p>In modern web architecture, the reverse proxy has become an indispensable component for scaling, securing, and optimizing web applications. Among the many tools available for this purpose, Nginx stands out as a lightweight, high-performance web server that excels at reverse proxying. Whether you are running a single application on a VPS or managing a fleet of microservices in a containerized environment, Nginx can act as the single entry point that handles traffic routing, SSL termination, caching, load balancing, and much more. This tutorial is designed to take you from a basic understanding of what a reverse proxy is to confidently configuring Nginx in production environments. We will cover installation, essential configuration directives, advanced features like caching and load balancing, and common troubleshooting techniques. By the end of this guide, you will have a solid foundation to deploy Nginx as a reverse proxy for any backend service \u2013 be it Node.js, Python (Django, Flask), Ruby on Rails, Java (Tomcat), or a static site generator.<\/p>\n<p>The primary advantage of using a reverse proxy like Nginx is abstraction. Your backend application servers are never directly exposed to the internet; instead, they listen only on internal network interfaces or Unix sockets. Nginx receives client requests, forwards them to the appropriate backend, and returns the response to the client. This architecture not only improves security (by hiding backend addresses and mitigating direct attacks) but also enhances performance through connection pooling, SSL termination (offloading expensive cryptographic operations from the application), and content caching. Additionally, Nginx can distribute incoming traffic across multiple backend instances, ensuring high availability and even load distribution. In this tutorial, we will explore each of these capabilities in depth, using real-world examples and sample configurations. Whether you are a DevOps engineer, a full\u2011stack developer, or a system administrator, the knowledge you gain here will help you design robust and scalable web infrastructures.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/via.placeholder.com\/800x600\/4a90d9\/ffffff?text=how%20to%20use%20Nginx%20as%20reverse%20proxy\" alt=\"Article illustration\" style=\"display:block;margin:20px auto;max-width:100%;height:auto;border-radius:8px;\" \/><\/p>\n<h2>Step-by-Step Guide: Configuring Nginx as a Reverse Proxy<\/h2>\n<h3>Step 1: Installing Nginx on Your Server<\/h3>\n<p>Before you can start reverse proxying, you need Nginx installed and running. The installation process varies depending on your operating system, but we will cover the most common distributions: Ubuntu\/Debian (using APT) and CentOS\/RHEL (using YUM or DNF). For Ubuntu 20.04 or newer, update your package lists and install Nginx with the following commands:<\/p>\n<pre><code>sudo apt update\nsudo apt install nginx -y\n<\/code><\/pre>\n<p>On CentOS 8 or Rocky Linux, you may need to enable the EPEL repository first:<\/p>\n<pre><code>sudo dnf install epel-release -y\nsudo dnf install nginx -y\n<\/code><\/pre>\n<p>After installation, start the Nginx service and enable it to launch at reboot:<\/p>\n<pre><code>sudo systemctl start nginx\nsudo systemctl enable nginx\n<\/code><\/pre>\n<p>Verify that Nginx is running by checking its status:<\/p>\n<pre><code>sudo systemctl status nginx\n<\/code><\/pre>\n<p>You should see an &#8220;active (running)&#8221; message. Additionally, you can visit your server\u2019s IP address in a web browser \u2013 the default Nginx welcome page indicates a successful installation. If you have a firewall enabled (such as UFW on Ubuntu or firewalld on CentOS), ensure that HTTP (port 80) and HTTPS (port 443) are allowed. For example, on Ubuntu:<\/p>\n<pre><code>sudo ufw allow 'Nginx Full'\n<\/code><\/pre>\n<p>With Nginx installed, you are ready to move on to basic configuration.<\/p>\n<h3>Step 2: Understanding Nginx Configuration Structure<\/h3>\n<p>Nginx configuration files are organized in a hierarchical manner. The main configuration file is typically located at <code>\/etc\/nginx\/nginx.conf<\/code>. This file includes global settings (worker processes, events, error logs) and imports other configuration files from directories like <code>\/etc\/nginx\/conf.d\/<\/code> and <code>\/etc\/nginx\/sites-enabled\/<\/code> (on Debian-based systems). The most important concept for reverse proxying is the <em>server block<\/em>, which defines how requests for a particular domain (or port) are handled. Inside a server block, you use <em>location<\/em> directives to match specific URI paths. For a reverse proxy, the key directive is <code>proxy_pass<\/code>, which forwards requests to a backend server (or upstream group).<\/p>\n<p>To get started, it is recommended to create a separate configuration file for each domain or application. On Ubuntu, you can place your new file in <code>\/etc\/nginx\/sites-available\/<\/code> and create a symbolic link in <code>\/etc\/nginx\/sites-enabled\/<\/code>. On CentOS, you can directly add a <code>.conf<\/code> file in <code>\/etc\/nginx\/conf.d\/<\/code>. Let\u2019s create a simple reverse proxy configuration for an application running locally on port 3000 (for example, a Node.js Express server). Create a file named <code>myapp.conf<\/code> with the following content:<\/p>\n<pre><code>server {\n    listen 80;\n    server_name example.com www.example.com;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3000;\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}\n<\/code><\/pre>\n<p>After saving the file, test the configuration for syntax errors:<\/p>\n<pre><code>sudo nginx -t\n<\/code><\/pre>\n<p>If the test passes, reload Nginx to apply the changes:<\/p>\n<pre><code>sudo systemctl reload nginx\n<\/code><\/pre>\n<p>Now, when a client requests <code>http:\/\/example.com<\/code>, Nginx forwards the request to the Node.js application running on port 3000. The <code>proxy_set_header<\/code> directives ensure that the backend receives the original host, client IP, and protocol, which is critical for applications that rely on these headers for URL generation or logging.<\/p>\n<h3>Step 3: Configuring a Simple Reverse Proxy with Additional Directives<\/h3>\n<p>In Step 2, we saw a basic proxy configuration. However, production environments often require fine-tuning. Let\u2019s expand the configuration to include timeouts, buffer settings, and error page handling. When proxying, you may want to adjust the timeouts to match your backend\u2019s performance characteristics. For example, if your application occasionally performs long-running tasks, increase the <code>proxy_read_timeout<\/code>:<\/p>\n<pre><code>location \/ {\n    proxy_pass http:\/\/127.0.0.1:3000;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection 'upgrade';\n    proxy_set_header Host $host;\n    proxy_cache_bypass $http_upgrade;\n\n    proxy_connect_timeout 60s;\n    proxy_send_timeout 60s;\n    proxy_read_timeout 120s;\n\n    proxy_buffering off;\n    proxy_buffer_size 4k;\n    proxy_buffers 8 4k;\n    proxy_busy_buffers_size 8k;\n}\n<\/code><\/pre>\n<p>Notice the inclusion of <code>proxy_http_version 1.1<\/code> and the <code>Upgrade<\/code>\/<code>Connection<\/code> headers \u2013 these are essential if your application uses WebSockets. Setting <code>proxy_buffering off<\/code> can be beneficial for streaming responses (like Server-Sent Events) or real-time data feeds. You can also add a custom error page if your backend is down:<\/p>\n<pre><code>error_page 502 503 \/error.html;\nlocation = \/error.html {\n    root \/usr\/share\/nginx\/html;\n    internal;\n}\n<\/code><\/pre>\n<p>This way, if the backend fails to respond (HTTP 502) or is temporarily unavailable (503), Nginx serves a static error page without exposing internal error messages. Always test your configuration after modifications.<\/p>\n<h3>Step 4: Load Balancing Across Multiple Backend Servers<\/h3>\n<p>One of the most powerful features of Nginx is its ability to distribute traffic across a group of backend servers using the <code>upstream<\/code> block. This is crucial for high-availability applications where you have multiple identical application servers. Define an upstream group in the <code>http<\/code> block (or inside a <code>server<\/code> block, but typically at the http level) and reference it in <code>proxy_pass<\/code>. Here is an example with three Node.js instances running on ports 3001, 3002, and 3003:<\/p>\n<pre><code>upstream backend_nodes {\n    least_conn;\n    server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;\n    server 127.0.0.1:3002 weight=2;\n    server 127.0.0.1:3003 down;\n}\n\nserver {\n    listen 80;\n    server_name example.com;\n\n    location \/ {\n        proxy_pass http:\/\/backend_nodes;\n        proxy_set_header Host $host;\n        # ... other proxy headers\n    }\n}\n<\/code><\/pre>\n<p>The upstream block supports several load\u2011balancing methods: <code>least_conn<\/code> (least connections), <code>ip_hash<\/code> (session persistence based on client IP), <code>random<\/code>, and the default round\u2011robin. You can assign <code>weight<\/code> to give a server more traffic, mark a server as <code>down<\/code> (to avoid sending requests), and set <code>max_fails<\/code> and <code>fail_timeout<\/code> to control health checks. For example, <code>max_fails=3 fail_timeout=30s<\/code> means that after three consecutive failures within 30 seconds, the server is considered unavailable for 30 seconds. This passive health checking is lightweight and effective.<\/p>\n<p>The table below summarizes the most common load\u2011balancing algorithms available in Nginx:<\/p>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr>\n<th>Algorithm<\/th>\n<th>Directive<\/th>\n<th>Description<\/th>\n<th>Use Case<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Round Robin<\/td>\n<td>(default)<\/td>\n<td>Distributes requests sequentially across servers.<\/td>\n<td>Simple, even distribution when backend capacities are equal.<\/td>\n<\/tr>\n<tr>\n<td>Least Connections<\/td>\n<td><code>least_conn;<\/code><\/td>\n<td>Sends requests to the server with the fewest active connections.<\/td>\n<td>Unequal request loads or long\u2011lived connections (e.g., WebSockets).<\/td>\n<\/tr>\n<tr>\n<td>IP Hash<\/td>\n<td><code>ip_hash;<\/code><\/td>\n<td>Maps client IP to a server using a hash, ensuring session persistence.<\/td>\n<td>Applications that store session data in\u2011memory on the server.<\/td>\n<\/tr>\n<tr>\n<td>Random<\/td>\n<td><code>random;<\/code><\/td>\n<td>Picks a server at random (with optional weight).<\/td>\n<td>Distributing load in large clusters with similar capacities.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Step 5: SSL Termination (HTTPS Reverse Proxy)<\/h3>\n<p>Reversing proxying with HTTPS is a common pattern: clients connect to Nginx over secure SSL\/TLS, and Nginx forwards the requests to internal backends over plain HTTP (or optionally HTTPS). This offloads the encryption overhead from application servers. To set this up, you need an SSL certificate. The easiest way to obtain a free, trusted certificate is via Let\u2019s Encrypt using the Certbot tool. Install Certbot and obtain a certificate for your domain:<\/p>\n<pre><code>sudo apt install certbot python3-certbot-nginx -y\nsudo certbot --nginx -d example.com -d www.example.com\n<\/code><\/pre>\n<p>Certbot will automatically modify your Nginx configuration to include the SSL directives. Alternatively, you can manually configure SSL. A typical server block for HTTPS looks like this:<\/p>\n<pre><code>server {\n    listen 443 ssl http2;\n    server_name example.com www.example.com;\n\n    ssl_certificate \/etc\/letsencrypt\/live\/example.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/example.com\/privkey.pem;\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers HIGH:!aNULL:!MD5;\n    ssl_prefer_server_ciphers on;\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:3000;\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}\n\nserver {\n    listen 80;\n    server_name example.com www.example.com;\n    return 301 https:\/\/$server_name$request_uri;\n}\n<\/code><\/pre>\n<p>In this configuration, the second server block redirects all HTTP traffic to HTTPS. The secure server block uses SSL and also enables HTTP\/2 for better performance. The <code>proxy_set_header X-Forwarded-Proto $scheme<\/code> directive sends the protocol (<code>https<\/code>) to the backend, which is essential if your application generates absolute URLs (e.g., OAuth callbacks). Remember to reload Nginx after updating the config.<\/p>\n<h3>Step 6: Implementing Caching with proxy_cache<\/h3>\n<p>Caching static or even dynamic responses can drastically reduce load on your backend and improve response times for clients. Nginx provides a built\u2011in caching mechanism using the <code>proxy_cache<\/code> directives. First, define a cache path in the <code>http<\/code> block:<\/p>\n<pre><code>proxy_cache_path \/var\/cache\/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;\n<\/code><\/pre>\n<p>Then, within a location block, enable caching and specify how to cache responses:<\/p>\n<pre><code>location \/api\/ {\n    proxy_cache my_cache;\n    proxy_cache_key \"$scheme$request_method$host$request_uri\";\n    proxy_cache_valid 200 302 60m;\n    proxy_cache_valid 404 1m;\n    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;\n    proxy_pass http:\/\/backend;\n    # ... other proxy headers\n}\n<\/code><\/pre>\n<p>The <code>proxy_cache_valid<\/code> directive tells Nginx how long to cache responses based on their status code. The <code>proxy_cache_use_stale<\/code> option serves stale content if the backend fails, increasing availability. You can also invalidate the cache by sending a <code>Cache-Control<\/code> header or using the <code>proxy_cache_bypass<\/code> directive. For purging, you might need a third\u2011party module like ngx_cache_purge.<\/p>\n<h3>Step 7: Advanced Headers and Security Hardening<\/h3>\n<p>When Nginx is exposed to the internet, it should be configured to protect both itself and the backend. Beyond the standard proxy headers, you can add security headers, rate limiting, and IP blocking. For example, add the following inside your server block to improve security:<\/p>\n<pre><code>add_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n<\/code><\/pre>\n<p>Rate limiting prevents abuse by limiting the number of requests a client can make in a given time. Define a limit zone in the <code>http<\/code> block:<\/p>\n<pre><code>limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r\/s;\n<\/code><\/pre>\n<p>Then apply it in a location:<\/p>\n<pre><code>location \/ {\n    limit_req zone=mylimit burst=20 nodelay;\n    proxy_pass http:\/\/backend;\n}\n<\/code><\/pre>\n<p>Additionally, you can block certain IP ranges (e.g., known attackers) using the <code>deny<\/code> directive:<\/p>\n<pre><code>location \/admin\/ {\n    allow 192.168.1.0\/24;\n    deny all;\n    proxy_pass http:\/\/backend_admin;\n}\n<\/code><\/pre>\n<p>These steps, combined with regular updates and monitoring, create a robust reverse proxy configuration.<\/p>\n<h3>Tips and Best Practices for Nginx Reverse Proxy<\/h3>\n<ul>\n<li><strong>Always test configurations<\/strong> \u2013 Use <code>nginx -t<\/code> before reloading. This simple step prevents syntax errors from taking your site offline. Consider adding a pre\u2011commit hook in your CI\/CD pipeline that runs this check.<\/li>\n<li><strong>Separate configuration files<\/strong> \u2013 For each domain or application, create a dedicated config file. This makes maintenance easier and allows team members to work on different services without conflict. Use <code>include<\/code> statements to share common snippets (e.g., SSL settings, proxy defaults).<\/li>\n<li><strong>Monitor logs and metrics<\/strong> \u2013 Nginx access and error logs are invaluable for troubleshooting. Send logs to a centralized system (ELK, Graylog) and set up alerts for 5xx errors. Consider integrating with monitoring tools like Prometheus via the nginx-prometheus-exporter.<\/li>\n<li><strong>Tune buffer and timeout values<\/strong> \u2013 Default settings may not suit every backend. If you see frequent upstream timeouts, increase <code>proxy_read_timeout<\/code>. If memory is tight, reduce buffer sizes. Always benchmark under realistic load.<\/li>\n<li><strong>Use variables cautiously<\/strong> \u2013 Avoid using Nginx variables in <code>proxy_pass<\/code> if the target is static, as variable processing may cause performance issues. When variables are necessary (e.g., dynamic backends), ensure they are validated to prevent SSRF attacks.<\/li>\n<li><strong>Enable gzip compression<\/strong> \u2013 Compressing responses reduces bandwidth usage. Add these lines inside the <code>http<\/code> block to enable gzip for proxy responses:<\/li>\n<\/ul>\n<pre><code>gzip on;\ngzip_proxied any;\ngzip_types text\/plain text\/css application\/json application\/javascript text\/xml application\/xml application\/xml+rss text\/javascript;\n<\/code><\/pre>\n<h2>Frequently Asked Questions (FAQ)<\/h2>\n<ol>\n<li>\n<h3>What is the difference between a reverse proxy and a forward proxy?<\/h3>\n<p>A forward proxy sits between clients and the internet, making requests on behalf of clients (typical in corporate networks to filter or cache web content). A reverse proxy, on the other hand, sits in front of backend servers and receives requests from clients, forwarding them to the appropriate internal resource. The reverse proxy shields the backend while providing additional features like SSL termination, load balancing, and caching. In simple terms: forward proxy serves clients, reverse proxy serves servers.<\/p>\n<\/li>\n<li>\n<h3>Can Nginx handle WebSocket proxying?<\/h3>\n<p>Yes. To proxy WebSocket connections, you must set the HTTP version to 1.1 and include the <code>Upgrade<\/code> and <code>Connection<\/code> headers in the proxy configuration. The sample code in Step 3 already includes these directives. Ensure your backend supports WebSockets and that no other proxy in front strips the upgrade headers. Nginx also maintains connection persistence, which is essential for WebSockets.<\/p>\n<\/li>\n<li>\n<h3>How do I set up multiple reverse proxies for different domains on the same server?<\/h3>\n<p>Simply create multiple server blocks, each with its own <code>server_name<\/code> and <code>proxy_pass<\/code> pointing to the corresponding backend. Nginx uses the <code>Host<\/code> header to match the incoming request to the correct server block. For example, you can have <code>server_name app1.example.com<\/code> proxying to <code>localhost:3001<\/code> and <code>server_name app2.example.com<\/code> proxying to <code>localhost:3002<\/code>. Just make sure the DNS resolves both domains to the same server IP.<\/p>\n<\/li>\n<li>\n<h3>Why do I get a 502 Bad Gateway error when using Nginx as a reverse proxy?<\/h3>\n<p>A 502 error indicates that Nginx is unable to communicate with the upstream backend. Common causes: the backend is not running, the port is incorrect, the backend is listening only on a network interface not accessible to Nginx (e.g., <code>localhost<\/code> vs <code>127.0.0.1<\/code>), or a firewall blocks the connection. Check the backend logs, verify the <code>proxy_pass<\/code> URL, and ensure Nginx can reach the host:port. Also, inspect Nginx\u2019s error log (<code>\/var\/log\/nginx\/error.log<\/code>) for more details.<\/p>\n<\/li>\n<li>\n<h3>How do I pass the real client IP to the backend application?<\/h3>\n<p>Use the <code>proxy_set_header X-Real-IP $remote_addr;<\/code> and <code>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<\/code> directives. The backend application should be configured to read the <strong>X-Real-IP<\/strong> or <strong>X-Forwarded-For<\/strong> header and use it instead of the direct connection IP (which will be the IP of the Nginx server). For applications behind multiple reverse proxies, you may need to use the <code>real_ip<\/code> module in Nginx to extract the correct IP from a trusted header.<\/p>\n<\/li>\n<li>\n<h3>How can I enable HTTPS with free certificates and automatic renewal?<\/h3>\n<p>Use Let\u2019s Encrypt\u2019s Certbot tool. After installing Certbot, run <code>sudo certbot --nginx -d yourdomain.com<\/code>. Certbot will automatically obtain the certificate and update your Nginx configuration. To set up automatic renewal, add a cron job or systemd timer that runs <code>certbot renew<\/code> twice a day. Certbot will reload Nginx only if renewal succeeds. Most distributions include a built-in timer \u2013 check with <code>systemctl list-timers | grep certbot<\/code>.<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>Nginx as a reverse proxy is a cornerstone of modern web infrastructure. By mastering its configuration, you gain the ability to optimize performance, enhance security, and ensure high availability for your applications. In this comprehensive guide, we covered everything from initial installation to advanced topics like load balancing, SSL termination, caching, and security hardening. The step-by-step approach, combined with practical examples, should equip you with the confidence to deploy Nginx in production scenarios. Remember to always test changes in a staging environment, monitor your logs, and keep your Nginx version updated. As your needs grow, explore additional modules such as <code>ngx_http_auth_request_module<\/code> for authentication, or integration with <code>nginx-module-vts<\/code> for metrics. With Nginx, the possibilities are vast, and the skills you have learned here will serve you throughout your career. Now, go ahead and put your knowledge into practice \u2013 start proxying, load balancing, and securing your applications with the best reverse proxy in the open-source world.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mastering Nginx as a Reverse Proxy: A Comprehensive Step-by-Step Guide for Beginners and Experts Introduction In modern web architecture, the reverse proxy has become an indispensable component for scaling, securing, and optimizing web applications. Among the many tools available for this purpose, Nginx stands out as a lightweight, high-performance web server that excels at reverse &hellip; <\/p>\n","protected":false},"author":2716,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[],"tags":[],"class_list":["post-900","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/900","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/users\/2716"}],"replies":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/comments?post=900"}],"version-history":[{"count":0,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/900\/revisions"}],"wp:attachment":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/media?parent=900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/categories?post=900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/tags?post=900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}