{"id":2667,"date":"2020-02-28T13:26:06","date_gmt":"2020-02-28T12:26:06","guid":{"rendered":"https:\/\/geko2.factoryfy.com\/forward-real-ip-to-a-nginx-behind-a-gcp-load-balancer\/"},"modified":"2021-11-03T17:33:58","modified_gmt":"2021-11-03T16:33:58","slug":"forward-real-ip-to-a-nginx-behind-a-gcp-load-balancer","status":"publish","type":"post","link":"https:\/\/geko.cloud\/en\/forward-real-ip-to-a-nginx-behind-a-gcp-load-balancer\/","title":{"rendered":"Forward real IP to a NGINX behind a GCP Load Balancer"},"content":{"rendered":"<p style=\"text-align: center;\"><span style=\"color: #000000;\"><em>This article focuses in GCP Load Balancers, but can apply to other cloud providers \/ proxy servers.<\/em><\/span><\/p>\n<h2><span style=\"color: #000000;\"><strong>Introduction<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">We worked in a project that required a nginx server to be able to whitelist some public ip addresses while denying all other connections. While this can be addressed using GCP firewall rules there were some other reasons why it was necessary to be done through nginx configuration instead of using GCP rules.<\/span><\/p>\n<p><span style=\"color: #000000;\">The problem is that nginx was not showing\u00a0the correct <strong>real ip address<\/strong> of the request in the\u00a0<strong>REMOTE_ADDR<\/strong> header.<\/span><\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">130.211.0.230 - - [23\/Jan\/2020:09:44:51 +0000] \"GET \/ HTTP\/1.1\" 404 \"108.26.106.168, 36.129.221.25\"<\/pre>\n<\/div>\n<h2><span style=\"color: #000000;\"><strong>Scenario<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">I&#8217;ll be using a very simple scenario:<\/span><\/p>\n<ul>\n<li><span style=\"color: #000000;\">Google Compute private instance running two docker containers: nginx and a php based app<\/span><\/li>\n<li><span style=\"color: #000000;\">Public GCP Load Balancer targeting the nginx container.<\/span><\/li>\n<\/ul>\n<p>Fake IP addresses used in this post:<\/p>\n<ul>\n<li>User originating requests:\u00a0108.26.106.168<\/li>\n<li>GCP Load Balancer public IP:\u00a036.129.221.25<\/li>\n<li>GCP Load Balancer private ranges:\u00a0130.211.0.0\/22 and\u00a035.191.0.0\/16<\/li>\n<\/ul>\n<p>That&#8217;s it.<\/p>\n<h2><span style=\"color: #000000;\"><strong>The problem<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">Let&#8217;s quickly review how a Load Balancer works: When a request is received\u00a0from a remote client it is terminated and a <strong>new request <\/strong>is issued from the LB against the backend,\u00a0forwarding a set of headers\u00a0(click on <a href=\"https:\/\/cloud.google.com\/load-balancing\/docs\/https#target-proxies\"><strong>GCP<\/strong><\/a>\u00a0and <a href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/classic\/x-forwarded-headers.html\"><strong>AWS<\/strong><\/a>\u00a0for specific details) that are then catched by the underlying service.<\/span><\/p>\n<p><span style=\"color: #000000;\">When you place a nginx server behind the LB you receive the <strong>Load Balancer&#8217;s private IP<\/strong>\u00a0as remote address instead of the<strong>\u00a0user&#8217;s real public ip<\/strong>.<\/span><\/p>\n<p><span style=\"color: #000000;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-828\" src=\"https:\/\/geko2.factoryfy.com\/wp-content\/uploads\/travolta-1.gif\" alt=\"\" width=\"426\" height=\"213\" \/><\/span><\/p>\n<p>If we take a look at nginx logs we can see this:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">130.211.0.130 - - [23\/Jan\/2020:09:02:51 +0000] \"GET \/ HTTP\/1.1\" 200 \"108.26.106.168, 36.129.221.25\"<\/pre>\n<\/div>\n<p>Wait! The user IP address appears in that chain at the end of the log. Why the heck is nginx taking the private range of the LB as the origin ip address? Well, this is because the LB is actually doing a new request.<\/p>\n<h2><span style=\"color: #000000;\"><strong>How did we solve the issue<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">The first IP in the log comes from the <strong>REMOTE_ADDR<\/strong> header. We need to\u00a0replace the value of this header with the real ip address received in the <strong>X-Forwarded-For<\/strong> header.<\/span><\/p>\n<p><span style=\"color: #000000;\">But there&#8217;s something else we need to deal with this second header: It actually comes not only with the user real IP but with the Load Balancer public address too.<\/span><\/p>\n<p>In order to solve all this we will use\u00a0<span style=\"color: #000000;\">the <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_realip_module.html\"><strong>real_ip module<\/strong><\/a>. We are going to apply the following configuration in nginx.conf inside the &#8220;server&#8221; block:<\/span><\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">set_real_ip_from\u00a036.129.221.25\/32; \/\/ LB Public IP address\r\nset_real_ip_from 130.211.0.0\/22; \/\/ Private IP range for GCP Load Balancers\r\nset_real_ip_from 35.191.0.0\/16; \/\/Private IP range for GCP Load Balancers\r\nreal_ip_header X-Forwarded-For;\r\nreal_ip_recursive on;<\/pre>\n<\/div>\n<p><span style=\"color: #000000;\">Let&#8217;s split it down:<\/span><\/p>\n<ul>\n<li><span style=\"color: #000000;\"><strong>set_real_ip_from<\/strong>: Tell nginx to trust GCP LB public and private IPs.<\/span><\/li>\n<li><span style=\"color: #000000;\"><strong>real_ip_header<\/strong>: Replace REMOTE_ADDR header with the values from X-Forwarded-For.<\/span><\/li>\n<li><span style=\"color: #000000;\"><strong>real_ip_recursive on<\/strong>: Filter out the trusted ips from the chain, therefore the last non-trusted address in the chain will be used as the remote address.<\/span><\/li>\n<\/ul>\n<p>Finally test it out:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">108.26.106.168 - - [23\/Jan\/2020:09:44:51 +0000] \"GET \/ HTTP\/1.1\" 200 \"108.26.106.168, 36.129.221.25\"<\/pre>\n<\/div>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p>As we can see the solution was pretty straight forward, but still it took some time diving into documentation to understand how the Load Balancer was forwarding the headers and how we can tune nginx to rewrite the headers in order to achieve the expected behaviour.<\/p>\n<p>Nevertheless it was a good learning experience.<\/p>\n<p><span style=\"color: #000000;\">Sources:\u00a0<a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_realip_module.html\"><strong>https:\/\/nginx.org\/en\/docs\/http\/ngx_http_realip_module.html<\/strong><\/a><\/span><\/p>\n<hr \/>\n<p>I hope you&#8217;ve enjoyed this post and I encourage you to <a href=\"https:\/\/geko.cloud\/en\/blog\/\">check our blog for other posts<\/a> that you might find helpful, such as &#8220;<a href=\"https:\/\/geko.cloud\/en\/what-is-the-cloud\/\">What is the cloud?<\/a>&#8220;. <a href=\"https:\/\/geko.cloud\/en\/contact\/\">Do not hesitate to contact us<\/a> if you would like us to help you on your projects.<\/p>\n<p>See you on the next post!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article focuses in GCP Load Balancers, but can apply to other cloud providers \/ proxy servers. Introduction We worked in a project that required a nginx server to be able to whitelist some public ip addresses while denying all other connections. While this can be addressed using GCP firewall rules there were some other [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":2357,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[67],"tags":[78,86],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Forward IP to a NGINX behind GCP Load Balancer<\/title>\n<meta name=\"description\" content=\"Normally when you read the REMOTE_ADDR header from NGINX you will receive the LB&#039;s private IP instead of the requestor&#039;s real IP address. In this post we are going to explain how to forward the real IP of the requestor to an nginx server sitting behind a load balancer in Google Cloud.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Forward IP to a NGINX behind GCP Load Balancer\" \/>\n<meta property=\"og:description\" content=\"Normally when you read the REMOTE_ADDR header from NGINX you will receive the LB&#039;s private IP instead of the requestor&#039;s real IP address. In this post we are going to explain how to forward the real IP of the requestor to an nginx server sitting behind a load balancer in Google Cloud.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\" \/>\n<meta property=\"og:site_name\" content=\"Geko Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-28T12:26:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-11-03T16:33:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"898\" \/>\n\t<meta property=\"og:image:height\" content=\"235\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Xavi Miranda\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geko_cloud\" \/>\n<meta name=\"twitter:site\" content=\"@geko_cloud\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\"},\"author\":{\"name\":\"Xavi Miranda\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/d496fb33d6ad37fe134ef9fb225dc732\"},\"headline\":\"Forward real IP to a NGINX behind a GCP Load Balancer\",\"datePublished\":\"2020-02-28T12:26:06+00:00\",\"dateModified\":\"2021-11-03T16:33:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\"},\"wordCount\":565,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png\",\"keywords\":[\"Google Cloud\",\"Ngnix\"],\"articleSection\":[\"Labs\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\",\"url\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\",\"name\":\"Forward IP to a NGINX behind GCP Load Balancer\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png\",\"datePublished\":\"2020-02-28T12:26:06+00:00\",\"dateModified\":\"2021-11-03T16:33:58+00:00\",\"description\":\"Normally when you read the REMOTE_ADDR header from NGINX you will receive the LB's private IP instead of the requestor's real IP address. In this post we are going to explain how to forward the real IP of the requestor to an nginx server sitting behind a load balancer in Google Cloud.\",\"breadcrumb\":{\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png\",\"width\":898,\"height\":235,\"caption\":\"ngnix google cloud logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/geko.cloud\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Forward real IP to a NGINX behind a GCP Load Balancer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/geko.cloud\/es\/#website\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"name\":\"Geko Cloud\",\"description\":\"Servicios de consultor\u00eda cloud y devops\",\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/geko.cloud\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/geko.cloud\/es\/#organization\",\"name\":\"Geko Cloud\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"width\":1650,\"height\":809,\"caption\":\"Geko Cloud\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/geko_cloud\",\"https:\/\/www.instagram.com\/gekocloud\/\",\"https:\/\/www.linkedin.com\/company\/gekocloud\",\"https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/d496fb33d6ad37fe134ef9fb225dc732\",\"name\":\"Xavi Miranda\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/aa0e61120a4b0a629b0679d9e341758d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/aa0e61120a4b0a629b0679d9e341758d?s=96&d=mm&r=g\",\"caption\":\"Xavi Miranda\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Forward IP to a NGINX behind GCP Load Balancer","description":"Normally when you read the REMOTE_ADDR header from NGINX you will receive the LB's private IP instead of the requestor's real IP address. In this post we are going to explain how to forward the real IP of the requestor to an nginx server sitting behind a load balancer in Google Cloud.","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:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/","og_locale":"en_US","og_type":"article","og_title":"Forward IP to a NGINX behind GCP Load Balancer","og_description":"Normally when you read the REMOTE_ADDR header from NGINX you will receive the LB's private IP instead of the requestor's real IP address. In this post we are going to explain how to forward the real IP of the requestor to an nginx server sitting behind a load balancer in Google Cloud.","og_url":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/","og_site_name":"Geko Cloud","article_published_time":"2020-02-28T12:26:06+00:00","article_modified_time":"2021-11-03T16:33:58+00:00","og_image":[{"width":898,"height":235,"url":"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png","type":"image\/png"}],"author":"Xavi Miranda","twitter_card":"summary_large_image","twitter_creator":"@geko_cloud","twitter_site":"@geko_cloud","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#article","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/"},"author":{"name":"Xavi Miranda","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/d496fb33d6ad37fe134ef9fb225dc732"},"headline":"Forward real IP to a NGINX behind a GCP Load Balancer","datePublished":"2020-02-28T12:26:06+00:00","dateModified":"2021-11-03T16:33:58+00:00","mainEntityOfPage":{"@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/"},"wordCount":565,"commentCount":0,"publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"image":{"@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png","keywords":["Google Cloud","Ngnix"],"articleSection":["Labs"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/","url":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/","name":"Forward IP to a NGINX behind GCP Load Balancer","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage"},"image":{"@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png","datePublished":"2020-02-28T12:26:06+00:00","dateModified":"2021-11-03T16:33:58+00:00","description":"Normally when you read the REMOTE_ADDR header from NGINX you will receive the LB's private IP instead of the requestor's real IP address. In this post we are going to explain how to forward the real IP of the requestor to an nginx server sitting behind a load balancer in Google Cloud.","breadcrumb":{"@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#primaryimage","url":"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/nginx_gcp_featured_2.png","width":898,"height":235,"caption":"ngnix google cloud logo"},{"@type":"BreadcrumbList","@id":"https:\/\/geko.cloud\/es\/reenviar-ip-real-a-un-nginx-detras-de-un-load-balancer-gcp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/geko.cloud\/en\/"},{"@type":"ListItem","position":2,"name":"Forward real IP to a NGINX behind a GCP Load Balancer"}]},{"@type":"WebSite","@id":"https:\/\/geko.cloud\/es\/#website","url":"https:\/\/geko.cloud\/es\/","name":"Geko Cloud","description":"Servicios de consultor\u00eda cloud y devops","publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geko.cloud\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/geko.cloud\/es\/#organization","name":"Geko Cloud","url":"https:\/\/geko.cloud\/es\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/","url":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","width":1650,"height":809,"caption":"Geko Cloud"},"image":{"@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/geko_cloud","https:\/\/www.instagram.com\/gekocloud\/","https:\/\/www.linkedin.com\/company\/gekocloud","https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ"]},{"@type":"Person","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/d496fb33d6ad37fe134ef9fb225dc732","name":"Xavi Miranda","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/aa0e61120a4b0a629b0679d9e341758d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/aa0e61120a4b0a629b0679d9e341758d?s=96&d=mm&r=g","caption":"Xavi Miranda"}}]}},"_links":{"self":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts\/2667"}],"collection":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/comments?post=2667"}],"version-history":[{"count":3,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts\/2667\/revisions"}],"predecessor-version":[{"id":5195,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/posts\/2667\/revisions\/5195"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/media\/2357"}],"wp:attachment":[{"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/media?parent=2667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/categories?post=2667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geko.cloud\/en\/wp-json\/wp\/v2\/tags?post=2667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}