You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Describe the bug
When I have NGF deployed with NGINX Plus and a simple cafe application, if I abruptly restart the docker container through docker restart <name of node> on Kind, all the applications successfully restart and are ready, but NGINX fails to route my traffic.
To Reproduce
Steps to reproduce the behavior:
Deploy NGF with NGINX Plus and cafe applications -- verify traffic flows when port-forwarding
Run docker restart <name of node>
After applications are all ready, restart port-forward, and try to curl cafe applications.
Expected behavior
NGINX successfully routes traffic to my applications.
Your environment
Version of the NGINX Gateway Fabric - release version or a specific commit. The first line of the nginx-gateway container logs includes the commit info. - edge on change/control-data-plane-split
Version of Kubernetes: v1.32.2
Kubernetes platform (e.g. Mini-kube or GCP): Kind
Details on how you expose the NGINX Gateway Fabric Pod (e.g. Service of type LoadBalancer or port-forward): port-forward
2025/03/18 23:15:50 [notice] 95#95: js vm init njs: 0000FFFF8E977980
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# configuration file /etc/nginx/nginx.conf:
load_module /usr/lib/nginx/modules/ngx_http_js_module.so;
include /etc/nginx/main-includes/*.conf;
worker_processes auto;
pid /var/run/nginx/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/mime.types;
js_import /usr/lib/nginx/modules/njs/httpmatches.js;
default_type application/octet-stream;
proxy_headers_hash_bucket_size 512;
proxy_headers_hash_max_size 1024;
server_names_hash_bucket_size 256;
server_names_hash_max_size 1024;
variables_hash_bucket_size 512;
variables_hash_max_size 1024;
sendfile on;
tcp_nopush on;
server_tokens off;
}
stream {
variables_hash_bucket_size 512;
variables_hash_max_size 1024;
map_hash_max_size 2048;
map_hash_bucket_size 256;
log_format stream-main '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$ssl_preread_server_name"';
access_log /dev/stdout stream-main;
include /etc/nginx/stream-conf.d/*.conf;
}
# configuration file /etc/nginx/main-includes/main.conf:
error_log stderr info;
# configuration file /etc/nginx/main-includes/mgmt.conf:
mgmt {
license_token /etc/nginx/secrets/license.jwt;
deployment_context /etc/nginx/main-includes/deployment_ctx.json;
}
# configuration file /etc/nginx/conf.d/http.conf:
http2 on;
# Set $gw_api_compliant_host variable to the value of $http_host unless $http_host is empty, then set it to the value
# of $host. We prefer $http_host because it contains the original value of the host header, which is required by the
# Gateway API. However, in an HTTP/1.0 request, it's possible that $http_host can be empty. In this case, we will use
# the value of $host. See http://nginx.org/en/docs/http/ngx_http_core_module.html#var_host.
map $http_host $gw_api_compliant_host {
'' $host;
default $http_host;
}
# Set $connection_header variable to upgrade when the $http_upgrade header is set, otherwise, set it to close. This
# allows support for websocket connections. See https://nginx.org/en/docs/http/websocket.html.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
## Returns just the path from the original request URI.
map $request_uri $request_uri_path {
"~^(?P<path>[^?]*)(\?.*)?$" $path;
}
js_preload_object matches from /etc/nginx/conf.d/matches.json;
server {
listen 80 default_server;
listen [::]:80 default_server;
default_type text/html;
return 404;
}
server {
listen 80;
listen [::]:80;
server_name cafe.example.com;
status_zone cafe.example.com;
location /coffee/ {
proxy_http_version 1.1;
proxy_set_header Host "$gw_api_compliant_host";
proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for";
proxy_set_header X-Real-IP "$remote_addr";
proxy_set_header X-Forwarded-Proto "$scheme";
proxy_set_header X-Forwarded-Host "$host";
proxy_set_header X-Forwarded-Port "$server_port";
proxy_set_header Upgrade "$http_upgrade";
proxy_set_header Connection "$connection_upgrade";
proxy_pass http://default_coffee_80$request_uri/;
}
location = /coffee {
proxy_http_version 1.1;
proxy_set_header Host "$gw_api_compliant_host";
proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for";
proxy_set_header X-Real-IP "$remote_addr";
proxy_set_header X-Forwarded-Proto "$scheme";
proxy_set_header X-Forwarded-Host "$host";
proxy_set_header X-Forwarded-Port "$server_port";
proxy_set_header Upgrade "$http_upgrade";
proxy_set_header Connection "$connection_upgrade";
proxy_pass http://default_coffee_80$request_uri/;
}
location / {
return 404 "";
proxy_http_version 1.1;
}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_reject_handshake on;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/nginx/secrets/ssl_keypair_default_cafe-secret.pem;
ssl_certificate_key /etc/nginx/secrets/ssl_keypair_default_cafe-secret.pem;
if ($ssl_server_name != $host) {
return 421;
}
server_name cafe.example.com;
status_zone cafe.example.com;
location /tea/ {
proxy_http_version 1.1;
proxy_set_header Host "$gw_api_compliant_host";
proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for";
proxy_set_header X-Real-IP "$remote_addr";
proxy_set_header X-Forwarded-Proto "$scheme";
proxy_set_header X-Forwarded-Host "$host";
proxy_set_header X-Forwarded-Port "$server_port";
proxy_set_header Upgrade "$http_upgrade";
proxy_set_header Connection "$connection_upgrade";
proxy_pass http://default_tea_80$request_uri/;
}
location = /tea {
proxy_http_version 1.1;
proxy_set_header Host "$gw_api_compliant_host";
proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for";
proxy_set_header X-Real-IP "$remote_addr";
proxy_set_header X-Forwarded-Proto "$scheme";
proxy_set_header X-Forwarded-Host "$host";
proxy_set_header X-Forwarded-Port "$server_port";
proxy_set_header Upgrade "$http_upgrade";
proxy_set_header Connection "$connection_upgrade";
proxy_pass http://default_tea_80$request_uri/;
}
location / {
return 404 "";
proxy_http_version 1.1;
}
}
server {
listen unix:/var/run/nginx/nginx-503-server.sock;
access_log off;
return 503;
}
server {
listen unix:/var/run/nginx/nginx-500-server.sock;
access_log off;
return 500;
}
upstream default_coffee_80 {
random two least_conn;
zone default_coffee_80 1m;
state /var/lib/nginx/state/default_coffee_80.conf;
}
upstream default_tea_80 {
random two least_conn;
zone default_tea_80 1m;
state /var/lib/nginx/state/default_tea_80.conf;
}
upstream invalid-backend-ref {
random two least_conn;
server unix:/var/run/nginx/nginx-500-server.sock;
}
# configuration file /var/lib/nginx/state/default_coffee_80.conf:
server 10.244.0.6:8080;
# configuration file /var/lib/nginx/state/default_tea_80.conf:
server 10.244.0.5:8080;
# configuration file /etc/nginx/conf.d/plus-api.conf:
server {
listen unix:/var/run/nginx/nginx-plus-api.sock;
access_log off;
location /api {
api write=on;
}
}
server {
listen 8765;
root /usr/share/nginx/html;
access_log off;
allow 127.0.0.1;
deny all;
location = /dashboard.html {}
location /api {
api write=off;
}
}
# configuration file /etc/nginx/mime.types:
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/avif avif;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/wasm wasm;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
# configuration file /etc/nginx/stream-conf.d/stream.conf:
server {
listen unix:/var/run/nginx/connection-closed-server.sock;
return "";
}
Additional context
When I built the nginx image with curl installed, I could successfully kubectl exec into the nginx container and curl to the service endpoints of my cafe applications. But when I tried to curl from my machine I was unable to.
The problem also seems to shift from 404 errors to 502 errors to 504 errors. I also once replicated this error but one of the applications was working, the tea application failed with 502 errors, but the coffee application successfully sent back 200 response codes.
Results can be seen when running the graceful-recovery test.
The text was updated successfully, but these errors were encountered:
mpstefan
added
bug
Something isn't working
backlog
Currently unprioritized work. May change with user feedback or as the product progresses.
labels
Apr 1, 2025
mpstefan
changed the title
CP/DP split: NGINX Plus fails to route traffic when docker container abruptly restarts
NGINX Plus fails to route traffic when docker container abruptly restarts
Apr 1, 2025
Describe the bug
When I have NGF deployed with NGINX Plus and a simple cafe application, if I abruptly restart the docker container through
docker restart <name of node>
on Kind, all the applications successfully restart and are ready, but NGINX fails to route my traffic.To Reproduce
Steps to reproduce the behavior:
docker restart <name of node>
Expected behavior
NGINX successfully routes traffic to my applications.
Your environment
kubectl -n nginx-gateway logs -l app=nginx-gateway -c nginx
kubectl -n nginx-gateway exec <gateway-pod> -c nginx -- nginx -T
Additional context
When I built the nginx image with curl installed, I could successfully
kubectl exec
into the nginx container and curl to the service endpoints of my cafe applications. But when I tried to curl from my machine I was unable to.The problem also seems to shift from 404 errors to 502 errors to 504 errors. I also once replicated this error but one of the applications was working, the tea application failed with 502 errors, but the coffee application successfully sent back 200 response codes.
Results can be seen when running the graceful-recovery test.
The text was updated successfully, but these errors were encountered: