#2315 closed defect (invalid)
set environment in nginx configuration does not work
Reported by: | Owned by: | ||
---|---|---|---|
Priority: | blocker | Milestone: | |
Component: | documentation | Version: | 1.19.x |
Keywords: | Cc: | ||
uname -a: | Linux ip-xxx-xx-xxx-xx.AWS_REGION.compute.internal 4.14.252-195.483.amzn2.x86_64 #1 SMP Mon Nov 1 20:58:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux | ||
nginx -V: |
nginx version: nginx/1.20.0
built by gcc 7.3.1 20180712 (Red Hat 7.3.1-13) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 TLS SNI support enabled configure arguments: --prefix=/usr/share/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 --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --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-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E' |
Description (last modified by )
Hello,
We have production deployment in AWS EKS where traffic from public Load balancer is routed to internal load balancer using nginx - using proxy_pass.
However, due to nginx caching of old load balancer IP addresses, nginx forward traffic to an IP address which does not exists as load balancer IP address is changed.
To address this issue, we have used following approach in nginx configuration - https://www.nginx.com/blog/dns-service-discovery-nginx-plus/#:~:text=resolver%2010.0.0.2%20valid%3D10s%3B%0A%0Aserver%20%7B%0A%20%20%20%20location%20/%20%7B%0A%20%20%20%20%20%20%20%20set%20%24backend_servers%20backends.example.com%3B%0A%20%20%20%20%20%20%20%20proxy_pass%20http%3A//%24backend_servers%3A8080%3B%0A%20%20%20%20%7D%0A%7D
resolver 10.0.0.2 valid=10s;
server {
location / {
set $backend_servers backends.example.com;
proxy_pass http://$backend_servers:8080;
}
}
But the above solution did not work. With set $env, nginx returns 404 error.
Please suggest.
We are seeing performance issue with Nginx caching the Load balancer IP address in production deployment. This is with nginx 1.20 running in AWS EC2 instance.
Attachments (2)
Change History (5)
by , 3 years ago
Attachment: | user-config.txt added |
---|
comment:1 by , 3 years ago
Description: | modified (diff) |
---|
comment:2 by , 3 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Your configuration does not seem to include any attempts to configure name resolution by using variables in the proxy_pass
directive, but given the following snippet in your config:
location /abc { proxy_pass http://1234.web-svc.domain.com:80/abc; ...
My best guess is that you've tried to use something like proxy_pass http://$backend:80/abc;
. Note that when variables are used in proxy_pass
and URI is specified in the directive, it is passed to the server as is, replacing the original request URI, see docs. Using proxy_pass http://$backend:80;
, without an URI, should work.
If you need further help with configuring nginx, please use support options available.
comment:3 by , 3 years ago
Hello Maxim Dounin,
Thanks for your suggestion. With proxy_pass http://$backend:80 worked for us as shown below:
resolver DNS_IP_ADDR
server {
listen 8080;
server_name <ROUTE-53-PUBLIC-DNS>;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /abc {
set $web_service 1234.web-svc.domain.com
proxy_pass http://$web_service:80;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
user config files