{"id":643,"date":"2026-02-19T23:25:30","date_gmt":"2026-02-19T14:25:30","guid":{"rendered":"https:\/\/tech.softbell.net\/?p=643"},"modified":"2026-02-20T20:39:38","modified_gmt":"2026-02-20T11:39:38","slug":"ingress-controller-%ec%a0%84%ed%99%98-%ec%8b%9c-websocket-%ec%9e%a5%ec%95%a0-%ec%82%ac%eb%a1%80-60%ec%b4%88%eb%a7%88%eb%8b%a4-%eb%81%8a%ea%b8%b0%eb%8a%94-%ec%97%b0%ea%b2%b0%ec%9d%98","status":"publish","type":"post","link":"https:\/\/tech.softbell.net\/?p=643","title":{"rendered":"Ingress Controller \uc804\ud658 \uc2dc WebSocket \uc7a5\uc560 \uc0ac\ub840 \u2014 60\ucd08\ub9c8\ub2e4 \ub04a\uae30\ub294 \uc5f0\uacb0\uc758 \uc6d0\uc778 \ucd94\uc801"},"content":{"rendered":"<h2 id=\"summary\">\ud83d\udccc \ud83d\udccc \ud575\uc2ec \uc694\uc57d<\/h2>\n<p>Kubernetes \ud658\uacbd\uc5d0\uc11c NGINX Inc Ingress Controller\uc5d0\uc11c \ucee4\ubba4\ub2c8\ud2f0 ingress-nginx\ub85c \uc804\ud658 \ud6c4, \ubc29\ud654\ubcbd \uc7a5\uc560 \ubcf5\uad6c \uc774\ud6c4 Mattermost WebSocket \uc5f0\uacb0\uc774 \uc815\ud655\ud788 <strong>60\ucd08\ub9c8\ub2e4 \uc7ac\uc5f0\uacb0<\/strong>\uc744 \ubc18\ubcf5\ud55c \uc778\uc2dc\ub358\ud2b8. \uadfc\ubcf8 \uc6d0\uc778\uc740 <strong>\uc5b4\ub178\ud14c\uc774\uc158 \ud638\ud658\uc131 \ubb38\uc81c<\/strong>\ub85c, \uae30\uc874 <code>nginx.org\/websocket-services<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc774 ingress-nginx\uc5d0\uc11c \ubb34\uc2dc\ub418\uba74\uc11c proxy timeout\uc774 \uae30\ubcf8\uac12(60\ucd08)\uc73c\ub85c \ub3d9\uc791\ud574 WebSocket idle \uc5f0\uacb0\uc774 \ub04a\uae34 \uac83\uc73c\ub85c \ud655\uc778\ub428.<\/p>\n<hr \/>\n<h2 id=\"1\">1. \ud658\uacbd \ubc0f \ubc30\uacbd<\/h2>\n<h3 id=\"_1\">\uc778\ud504\ub77c \uad6c\uc131<\/h3>\n<ul>\n<li><strong>\ud50c\ub7ab\ud3fc<\/strong>: Kubernetes (\uc790\uccb4 \uc6b4\uc601 \ud074\ub7ec\uc2a4\ud130)<\/li>\n<li><strong>Ingress Controller<\/strong>: NGINX Inc(F5) Ingress Controller \u2192 \ucee4\ubba4\ub2c8\ud2f0 <strong>ingress-nginx<\/strong>\ub85c \uc804\ud658 (\ucd5c\uadfc \uc644\ub8cc)<\/li>\n<li><strong>\uc11c\ube44\uc2a4<\/strong>: Mattermost (WebSocket \uae30\ubc18 \uc2e4\uc2dc\uac04 \uba54\uc2dc\uc9d5)<\/li>\n<li><strong>\ud074\ub77c\uc774\uc5b8\ud2b8<\/strong>: 16\uac1c\uc758 WebSocket \ud074\ub77c\uc774\uc5b8\ud2b8 (\ubd07)<\/li>\n<\/ul>\n<h3 id=\"_2\">\uc804\ud658 \ubc30\uacbd<\/h3>\n<p>\ucd5c\uadfc \uc0c1\uc6a9 F5 NGINX Ingress Controller\uc5d0\uc11c \uc624\ud508\uc18c\uc2a4 \ucee4\ubba4\ub2c8\ud2f0 <code>ingress-nginx<\/code>\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc744 \uc9c4\ud589\ud588\ub2e4. \ub450 \ud504\ub85c\uc81d\ud2b8\ub294 \uc774\ub984\uc740 \ube44\uc2b7\ud558\uc9c0\ub9cc <strong>\uc644\uc804\ud788 \ub2e4\ub978 \ud504\ub85c\uc81d\ud2b8<\/strong>\ub85c, \uad00\ub9ac \uc8fc\uccb4\uc640 \uc5b4\ub178\ud14c\uc774\uc158 \uccb4\uacc4\uac00 \ub2e4\ub974\ub2e4.<\/p>\n<p>\uc804\ud658 \uc791\uc5c5\uc740 ArgoCD \uae30\ubc18 GitOps \uccb4\uacc4\ub85c \uad00\ub9ac\ub418\ub294 \uc6cc\ud06c\ub85c\ub4dc\ub97c \ub300\uc0c1\uc73c\ub85c \uc804\uccb4 \uac80\uc0c9\uc744 \ud1b5\ud574 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \uc77c\uad04 \uc804\ud658\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \uc9c4\ud589\ub418\uc5c8\ub2e4. \ub300\ubd80\ubd84\uc758 \uc6cc\ud06c\ub85c\ub4dc\ub294 \uc774 \ubc29\uc2dd\uc73c\ub85c \ubb38\uc81c\uc5c6\uc774 \uc804\ud658\ub418\uc5c8\uc73c\ub098, <strong>Mattermost\ub294 \uc544\uc9c1 ArgoCD \uad00\ub9ac \uccb4\uacc4\ub85c \uc804\ud658\ub418\uc9c0 \uc54a\uc740 \uc0c1\ud0dc<\/strong>\uc600\ub2e4. Mattermost Operator CR(Custom Resource)\uc740 \uc5ec\uc804\ud788 <code>kubectl<\/code>\uc744 \ud1b5\ud574 \uc218\ub3d9\uc73c\ub85c \ubc30\ud3ec\ub418\uace0 \uc788\uc5c8\uace0, \uc774 \uc0ac\uc2e4\uc744 \uc778\uc9c0\ud558\uc9c0 \ubabb\ud55c \uc0c1\ud0dc\uc5d0\uc11c GitOps \uc77c\uad04 \uc804\ud658\uc5d0\uc11c \ub204\ub77d\ub41c \uac83\uc774 \ubb38\uc81c\uc758 \uc2dc\uc791\uc810\uc774\uc5c8\ub2e4.<\/p>\n<table>\n<thead>\n<tr>\n<th>\ud56d\ubaa9<\/th>\n<th>NGINX Inc (F5)<\/th>\n<th>\ucee4\ubba4\ub2c8\ud2f0 ingress-nginx<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>GitHub \uc800\uc7a5\uc18c<\/strong><\/td>\n<td><code>nginxinc\/kubernetes-ingress<\/code><\/td>\n<td><code>kubernetes\/ingress-nginx<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>\uad00\ub9ac \uc8fc\uccb4<\/strong><\/td>\n<td>F5 NGINX<\/td>\n<td>Kubernetes \ucee4\ubba4\ub2c8\ud2f0<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc5b4\ub178\ud14c\uc774\uc158 prefix<\/strong><\/td>\n<td><code>nginx.org\/*<\/code><\/td>\n<td><code>nginx.ingress.kubernetes.io\/*<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>WebSocket \uc124\uc815<\/strong><\/td>\n<td><code>nginx.org\/websocket-services<\/code><\/td>\n<td>timeout \uc5b4\ub178\ud14c\uc774\uc158\uc73c\ub85c \ub300\uccb4<\/td>\n<\/tr>\n<tr>\n<td><strong>\ubb38\uc11c \uc704\uce58<\/strong><\/td>\n<td>docs.nginx.com<\/td>\n<td>kubernetes.github.io<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"2\">2. \uc778\uc2dc\ub358\ud2b8 \ud0c0\uc784\ub77c\uc778<\/h2>\n<h3 id=\"21\">2.1. \ucd08\uae30 \uc7a5\uc560 \ubc1c\uc0dd<\/h3>\n<ul>\n<li><strong>KST 07:00<\/strong>: \ubc29\ud654\ubcbd \uc7a5\uc560 \ubc1c\uc0dd<\/li>\n<li><strong>KST 07:00~14:00<\/strong>: \uc57d 7\uc2dc\uac04 \ub3d9\uc548 \ub124\ud2b8\uc6cc\ud06c \ub2e8\uc808<\/li>\n<li><strong>KST 14:00<\/strong>: \ubc29\ud654\ubcbd \ubcf5\uad6c \uc644\ub8cc<\/li>\n<\/ul>\n<h3 id=\"22\">2.2. \ubd80\ubd84 \ubcf5\uad6c\uc640 \uc794\uc874 \ubb38\uc81c<\/h3>\n<ul>\n<li>\u2705 <strong>\uc544\uc6c3\ubc14\uc6b4\ub4dc HTTP API<\/strong>: \ubc29\ud654\ubcbd \ubcf5\uad6c \uc989\uc2dc \uc815\uc0c1 \ub3d9\uc791<\/li>\n<li>\u274c <strong>\uc778\ubc14\uc6b4\ub4dc WebSocket<\/strong>: <strong>\uc815\ud655\ud788 60\ucd08\ub9c8\ub2e4<\/strong> \uc5f0\uacb0 \ub04a\uae40 \ubc18\ubcf5<\/li>\n<li><strong>\ubaa8\ub2c8\ud130\ub9c1 \uacb0\uacfc<\/strong>: 16\uac1c WebSocket \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ucd1d <strong>1,163\uac74+<\/strong> \uc7ac\uc5f0\uacb0 \uc774\ubca4\ud2b8 \uad00\uce21<\/li>\n<\/ul>\n<h3 id=\"23\">2.3. \uc99d\uc0c1 \ud328\ud134<\/h3>\n<pre class=\"codehilite\"><code>[14:05:23] WebSocket connected\n[14:06:23] WebSocket disconnected (exactly 60s later)\n[14:06:23] WebSocket reconnecting...\n[14:06:24] WebSocket connected\n[14:07:24] WebSocket disconnected (exactly 60s later)\n...\n<\/code><\/pre>\n<p><strong>\ud575\uc2ec \uad00\uce21<\/strong>: \uc5f0\uacb0 \uc885\ub8cc \uc2dc\uc810\uc774 <strong>\uc815\ud655\ud788 60\ucd08 \uac04\uaca9<\/strong>\uc73c\ub85c \ubc1c\uc0dd. \uc774\ub294 \ud558\ub4dc\ucf54\ub529\ub41c timeout \uc124\uc815\uc744 \uac15\ud558\uac8c \uc2dc\uc0ac\ud55c\ub2e4.<\/p>\n<hr \/>\n<h2 id=\"3\">3. \uc6d0\uc778 \ubd84\uc11d \uacfc\uc815<\/h2>\n<h3 id=\"31\">3.1. \ucd08\uae30 \uac00\uc124 \u2014 \ubc29\ud654\ubcbd \uc124\uc815?<\/h3>\n<p>\ubc29\ud654\ubcbd \ubcf5\uad6c \ud6c4\uc5d0\ub3c4 WebSocket\ub9cc \ubb38\uc81c\uac00 \uc9c0\uc18d\ub418\uc5c8\uc73c\ubbc0\ub85c, \ubc29\ud654\ubcbd\uc758 idle timeout \uc124\uc815\uc744 \uc758\uc2ec\ud588\ub294\ub370:<br \/>\n\u2013 HTTP API\ub294 \uc815\uc0c1 \ub3d9\uc791<br \/>\n\u2013 \ubc29\ud654\ubcbd \ub85c\uadf8\uc5d0 \ud2b9\uc774\uc0ac\ud56d \uc5c6\uc74c<br \/>\n\u2013 60\ucd08\ub294 \ubc29\ud654\ubcbd\uc758 \uc77c\ubc18\uc801\uc778 \uae30\ubcf8 timeout \uac12\uacfc \ubd88\uc77c\uce58<\/p>\n<p>\u2192 <strong>\ubc29\ud654\ubcbd\uc740 \uc6d0\uc778\uc774 \uc544\ub2cc \uac83\uc73c\ub85c \ucd94\uc815<\/strong><\/p>\n<h3 id=\"32-nginx-timeout\">3.2. \ub450 \ubc88\uc9f8 \uac00\uc124 \u2014 NGINX timeout \uc124\uc815<\/h3>\n<p>WebSocket\uc740 <strong>long-lived connection<\/strong>\uc774\ubbc0\ub85c, reverse proxy\uc758 timeout \uc124\uc815\uc5d0 \ubbfc\uac10\ud558\ub2e4. NGINX\uc758 \uae30\ubcf8 proxy timeout\uc740?<\/p>\n<blockquote>\n<p><strong>NGINX \uacf5\uc2dd \ubb38\uc11c<\/strong><br \/>\n<code>proxy_read_timeout<\/code>: \uc5c5\uc2a4\ud2b8\ub9bc \uc11c\ubc84\ub85c\ubd80\ud130 \uc751\ub2f5\uc744 \uc77d\uc744 \ub54c\uc758 timeout (\uae30\ubcf8\uac12: <strong>60\ucd08<\/strong>)<br \/>\n\ucd9c\ucc98: <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_read_timeout\">nginx.org\/docs\/http\/ngx_http_proxy_module.html#proxy_read_timeout<\/a><\/p>\n<\/blockquote>\n<p><strong>60\ucd08 \ud328\ud134\uacfc \uc815\ud655\ud788 \uc77c\uce58!<\/strong><\/p>\n<h3 id=\"33-ingress\">3.3. Ingress \uc124\uc815 \ud655\uc778<\/h3>\n<p>\uae30\uc874 Ingress \ub9ac\uc18c\uc2a4\uc758 \uc5b4\ub178\ud14c\uc774\uc158\uc744 \ud655\uc778\ud55c \uacb0\uacfc:<\/p>\n<pre class=\"codehilite\"><code class=\"language-yaml\">apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: mattermost-ingress\n  annotations:\n    nginx.org\/websocket-services: \"mattermost-svc\"  # \u2190 \ubb38\uc81c\uc758 \uc5b4\ub178\ud14c\uc774\uc158\nspec:\n  rules:\n  - host: chat.example.corp\n    http:\n      paths:\n      - path: \/\n        pathType: Prefix\n        backend:\n          service:\n            name: mattermost-svc\n            port:\n              number: 8065\n<\/code><\/pre>\n<h3 id=\"34\">3.4. \uadfc\ubcf8 \uc6d0\uc778 \ud655\uc778<\/h3>\n<p><strong>\ud575\uc2ec \ubb38\uc81c<\/strong>: <code>nginx.org\/websocket-services<\/code>\ub294 <strong>NGINX Inc Ingress Controller \uc804\uc6a9 \uc5b4\ub178\ud14c\uc774\uc158<\/strong>\uc774\ub2e4.<\/p>\n<blockquote>\n<p><strong>NGINX Inc \ubb38\uc11c (F5 \uc0c1\uc6a9 Ingress Controller \uc804\uc6a9)<\/strong><br \/>\n<code>nginx.org\/websocket-services<\/code>: WebSocket \uc11c\ube44\uc2a4 \ubaa9\ub85d\uc744 \uc9c0\uc815\ud558\uc5ec \ud574\ub2f9 \uc11c\ube44\uc2a4\uc5d0 \ub300\ud574 WebSocket \ud504\ub85d\uc2dc \uc124\uc815\uc744 \ud65c\uc131\ud654<br \/>\n\ucd9c\ucc98: <a href=\"https:\/\/docs.nginx.com\/nginx-ingress-controller\/configuration\/ingress-resources\/advanced-configuration-with-annotations\/\">docs.nginx.com\/nginx-ingress-controller\/configuration\/ingress-resources\/advanced-configuration-with-annotations\/<\/a><\/p>\n<\/blockquote>\n<p>\ucee4\ubba4\ub2c8\ud2f0 <code>ingress-nginx<\/code>\ub294 \uc774 \uc5b4\ub178\ud14c\uc774\uc158\uc744 <strong>\uc778\uc2dd\ud558\uc9c0 \ubabb\ud558\uace0 \ubb34\uc2dc<\/strong>\ud55c\ub2e4. \ub530\ub77c\uc11c:<br \/>\n1. WebSocket\uc5d0 \ub300\ud55c \ud2b9\uc218 \ucc98\ub9ac\uac00 \ube44\ud65c\uc131\ud654\ub428<br \/>\n2. \uc77c\ubc18 HTTP proxy \uc124\uc815 \uc801\uc6a9<br \/>\n3. <code>proxy_read_timeout<\/code> \uae30\ubcf8\uac12 <strong>60\ucd08<\/strong> \uc801\uc6a9<br \/>\n4. WebSocket idle \uc0c1\ud0dc\uc5d0\uc11c 60\ucd08 \uacbd\uacfc \uc2dc \uc5f0\uacb0 \uc885\ub8cc<\/p>\n<blockquote>\n<p><strong>ingress-nginx \uacf5\uc2dd \ubb38\uc11c (Miscellaneous \u2013 WebSockets)<\/strong><br \/>\n\u201cSupport for websockets is provided by NGINX out of the box. No special configuration required.<br \/>\n<strong>The only requirement to avoid the close of connections is the increase of the values of proxy-read-timeout and proxy-send-timeout.<\/strong><br \/>\nThe default value of these settings is <strong>60 seconds<\/strong>.<br \/>\nA more adequate value to support websockets is a value higher than one hour (<strong>3600<\/strong>).\u201d<br \/>\n\ucd9c\ucc98: <a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/miscellaneous\/#websockets\">kubernetes.github.io\/ingress-nginx\/user-guide\/miscellaneous\/#websockets<\/a><\/p>\n<\/blockquote>\n<hr \/>\n<h2 id=\"4\">4. \ud574\uacb0 \ubc29\ubc95<\/h2>\n<h3 id=\"41\">4.1. \uc801\uc6a9\ud55c \uc5b4\ub178\ud14c\uc774\uc158<\/h3>\n<pre class=\"codehilite\"><code class=\"language-yaml\">apiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: mattermost-ingress\n  annotations:\n    # \ucee4\ubba4\ub2c8\ud2f0 ingress-nginx \uc5b4\ub178\ud14c\uc774\uc158\uc73c\ub85c \ubcc0\uacbd\n    nginx.ingress.kubernetes.io\/proxy-body-size: \"1000m\"\n    nginx.ingress.kubernetes.io\/proxy-read-timeout: \"3600\"\n    nginx.ingress.kubernetes.io\/proxy-send-timeout: \"3600\"\nspec:\n  rules:\n  - host: chat.example.corp\n    http:\n      paths:\n      - path: \/\n        pathType: Prefix\n        backend:\n          service:\n            name: mattermost-svc\n            port:\n              number: 8065\n<\/code><\/pre>\n<h3 id=\"42\">4.2. \uac01 \uc5b4\ub178\ud14c\uc774\uc158 \uc0c1\uc138 \ubd84\uc11d<\/h3>\n<h4 id=\"nginxingresskubernetesioproxy-read-timeout\"><code>nginx.ingress.kubernetes.io\/proxy-read-timeout<\/code><\/h4>\n<table>\n<thead>\n<tr>\n<th>\ud56d\ubaa9<\/th>\n<th>\ub0b4\uc6a9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\uc758\ubbf8<\/strong><\/td>\n<td>\uc5c5\uc2a4\ud2b8\ub9bc \uc11c\ubc84\ub85c\ubd80\ud130 <strong>\uc5f0\uc18d\ub41c \ub450 read \uc5f0\uc0b0 \uc0ac\uc774<\/strong>\uc758 \ucd5c\ub300 \ub300\uae30 \uc2dc\uac04. WebSocket\uc758 \uacbd\uc6b0 \ud074\ub77c\uc774\uc5b8\ud2b8\/\uc11c\ubc84\uac00 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\uc9c0 \uc54a\ub294 idle \uc2dc\uac04\uc5d0 \ud574\ub2f9<\/td>\n<\/tr>\n<tr>\n<td><strong>\uae30\ubcf8\uac12<\/strong><\/td>\n<td>nginx: <strong>60\ucd08<\/strong> \/ ingress-nginx ConfigMap: <strong>60\ucd08<\/strong> (<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/configmap\/#proxy-read-timeout\">\ucd9c\ucc98<\/a>)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc801\uc6a9\uac12<\/strong><\/td>\n<td><strong>3600\ucd08<\/strong> (1\uc2dc\uac04)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc120\ud0dd \uadfc\uac70<\/strong><\/td>\n<td>WebSocket\uc740 \uc2e4\uc2dc\uac04 \uba54\uc2dc\uc9d5\uc5d0\uc11c \uc0ac\uc6a9\uc790\uac00 1\uc2dc\uac04 \uc774\uc0c1 \uba54\uc2dc\uc9c0\ub97c \ubcf4\ub0b4\uc9c0 \uc54a\uc744 \uc218 \uc788\uc73c\ubbc0\ub85c, \ucda9\ubd84\ud55c \uc5ec\uc720\ub97c \ub460. ingress-nginx \uacf5\uc2dd \ubb38\uc11c \uad8c\uc7a5\uac12.<\/td>\n<\/tr>\n<tr>\n<td><strong>\ubbf8\uc124\uc815 \uc2dc \ubb38\uc81c<\/strong><\/td>\n<td>60\ucd08 \ub3d9\uc548 \uba54\uc2dc\uc9c0\uac00 \uc5c6\uc73c\uba74 NGINX\uac00 \uc5f0\uacb0\uc744 \uc77c\ubc29\uc801\uc73c\ub85c \uc885\ub8cc. WebSocket\uc740 \uc591\ubc29\ud5a5 \ud1b5\uc2e0\uc774\ubbc0\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc989\uc2dc \uc7ac\uc5f0\uacb0 \uc2dc\ub3c4 \u2192 60\ucd08\ub9c8\ub2e4 reconnect \ubc18\ubcf5<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc774\uac8c \uc9c4\uc9dc \ubb38\uc81c\uc778 \uc774\uc720<\/strong><\/td>\n<td>WebSocket\uc740 <strong>persistent connection<\/strong>\uc774 \ud575\uc2ec. 60\ucd08\ub294 \uc2e4\uc2dc\uac04 \uba54\uc2dc\uc9d5\uc5d0\uc11c \ub108\ubb34 \uc9e7\uc74c. \uc0ac\uc6a9\uc790\uac00 \uc7a0\uae50 \uc790\ub9ac\ub97c \ube44\uc6b0\uac70\ub098, \ubd07\uc774 \uc774\ubca4\ud2b8 \ub300\uae30 \uc911\uc77c \ub54c\ub3c4 \uc5f0\uacb0\uc774 \uc720\uc9c0\ub418\uc5b4\uc57c \ud568.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"nginxingresskubernetesioproxy-send-timeout\"><code>nginx.ingress.kubernetes.io\/proxy-send-timeout<\/code><\/h4>\n<table>\n<thead>\n<tr>\n<th>\ud56d\ubaa9<\/th>\n<th>\ub0b4\uc6a9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\uc758\ubbf8<\/strong><\/td>\n<td>\uc5c5\uc2a4\ud2b8\ub9bc \uc11c\ubc84\ub85c <strong>\uc5f0\uc18d\ub41c \ub450 write \uc5f0\uc0b0 \uc0ac\uc774<\/strong>\uc758 \ucd5c\ub300 \ub300\uae30 \uc2dc\uac04. \uc5c5\uc2a4\ud2b8\ub9bc\uc774 \uc694\uccad\uc744 \ubc1b\ub294 \uc18d\ub3c4\uac00 \ub290\ub9b4 \ub54c \uc601\ud5a5<\/td>\n<\/tr>\n<tr>\n<td><strong>\uae30\ubcf8\uac12<\/strong><\/td>\n<td>nginx: <strong>60\ucd08<\/strong> \/ ingress-nginx ConfigMap: <strong>60\ucd08<\/strong> (<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/configmap\/#proxy-send-timeout\">\ucd9c\ucc98<\/a>)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc801\uc6a9\uac12<\/strong><\/td>\n<td><strong>3600\ucd08<\/strong> (1\uc2dc\uac04)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc120\ud0dd \uadfc\uac70<\/strong><\/td>\n<td><code>proxy-read-timeout<\/code>\uacfc \ub300\uce6d\uc801\uc73c\ub85c \uc124\uc815\ud558\uc5ec \uc591\ubc29\ud5a5 \ud1b5\uc2e0 \ubaa8\ub450 \uc548\uc815\uc131 \ud655\ubcf4<\/td>\n<\/tr>\n<tr>\n<td><strong>\ubbf8\uc124\uc815 \uc2dc \ubb38\uc81c<\/strong><\/td>\n<td>\uc5c5\uc2a4\ud2b8\ub9bc \uc11c\ubc84\uac00 \ub290\ub9ac\uac8c \uc751\ub2f5\ubc1b\uc744 \uacbd\uc6b0 \uc804\uc1a1 timeout \ubc1c\uc0dd \uac00\ub2a5. WebSocket\uc758 \uacbd\uc6b0 \ud070 \uba54\uc2dc\uc9c0 \uc804\uc1a1 \uc2dc \ubb38\uc81c \uac00\ub2a5\uc131 \uc788\uc74c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"nginxingresskubernetesioproxy-body-size\"><code>nginx.ingress.kubernetes.io\/proxy-body-size<\/code><\/h4>\n<table>\n<thead>\n<tr>\n<th>\ud56d\ubaa9<\/th>\n<th>\ub0b4\uc6a9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\uc758\ubbf8<\/strong><\/td>\n<td>\ud074\ub77c\uc774\uc5b8\ud2b8 \uc694\uccad \ubcf8\ubb38\uc758 \ucd5c\ub300 \ud06c\uae30. <code>client_max_body_size<\/code> nginx \uc9c0\uc2dc\ubb38\uc5d0 \ub9e4\ud551\ub428<\/td>\n<\/tr>\n<tr>\n<td><strong>\uae30\ubcf8\uac12<\/strong><\/td>\n<td>ingress-nginx ConfigMap: <strong>1m<\/strong> (1MB) (<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/configmap\/#proxy-body-size\">\ucd9c\ucc98<\/a>)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc801\uc6a9\uac12<\/strong><\/td>\n<td><strong>1000m<\/strong> (1000MB = ~1GB)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc120\ud0dd \uadfc\uac70<\/strong><\/td>\n<td>Mattermost\ub294 \ud30c\uc77c \uc5c5\ub85c\ub4dc \uae30\ub2a5\uc774 \uc788\uc73c\ubbc0\ub85c, \ud070 \ud30c\uc77c \uc804\uc1a1\uc744 \uc704\ud574 \uc5ec\uc720\uc788\uac8c \uc124\uc815<\/td>\n<\/tr>\n<tr>\n<td><strong>WebSocket\uacfc\uc758 \uad00\uacc4<\/strong><\/td>\n<td>WebSocket \uc790\uccb4\uc640\ub294 \uc9c1\uc811 \uad00\ub828 \uc5c6\uc9c0\ub9cc, \uac19\uc740 Ingress\uc5d0\uc11c HTTP API\ub3c4 \ucc98\ub9ac\ud558\ubbc0\ub85c \ud568\uaed8 \uc124\uc815<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"43-proxy-connect-timeout\">4.3. <code>proxy-connect-timeout<\/code>\uc740 \uc65c \uc124\uc815\ud558\uc9c0 \uc54a\uc558\ub294\uac00?<\/h3>\n<table>\n<thead>\n<tr>\n<th>\ud56d\ubaa9<\/th>\n<th>\ub0b4\uc6a9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\uc758\ubbf8<\/strong><\/td>\n<td>\uc5c5\uc2a4\ud2b8\ub9bc \uc11c\ubc84\uc640 <strong>\ucd5c\ucd08 \uc5f0\uacb0\uc744 \uc218\ub9bd<\/strong>\ud560 \ub54c\uc758 timeout<\/td>\n<\/tr>\n<tr>\n<td><strong>\uae30\ubcf8\uac12<\/strong><\/td>\n<td>ingress-nginx ConfigMap: <strong>5\ucd08<\/strong> (<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/configmap\/#proxy-connect-timeout\">\ucd9c\ucc98<\/a>)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc124\uc815 \uc5ec\ubd80<\/strong><\/td>\n<td><strong>\uc124\uc815\ud558\uc9c0 \uc54a\uc74c<\/strong> (\uae30\ubcf8\uac12 \uc720\uc9c0)<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc774\uc720<\/strong><\/td>\n<td>\uc5f0\uacb0 \uc218\ub9bd\uc740 \uc77c\ubc18\uc801\uc73c\ub85c 5\ucd08 \uc774\ub0b4 \uc644\ub8cc. \uc774 \uac12\uc774 60\ucd08 reconnect \ubb38\uc81c\uc640 \ubb34\uad00\ud568. \uc624\ud788\ub824 \ub108\ubb34 \ub192\uac8c \uc124\uc815\ud558\uba74 unhealthy upstream\uc5d0 \ub300\ud55c failover\uac00 \uc9c0\uc5f0\ub420 \uc218 \uc788\uc74c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2 id=\"5-timeout-websocket\">5. Timeout \uac12\ubcc4 WebSocket \ub3d9\uc791 \ube44\uad50<\/h2>\n<p>\uc2e4\uc81c \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \ud655\uc778\ud55c \uacb0\uacfc:<\/p>\n<table>\n<thead>\n<tr>\n<th>proxy-read-timeout<\/th>\n<th>proxy-send-timeout<\/th>\n<th>WebSocket \ub3d9\uc791<\/th>\n<th>\uc7ac\uc5f0\uacb0 \ube48\ub3c4<\/th>\n<th>\ube44\uace0<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>60\ucd08<\/strong> (\uae30\ubcf8\uac12)<\/td>\n<td><strong>60\ucd08<\/strong> (\uae30\ubcf8\uac12)<\/td>\n<td>\u274c 60\ucd08\ub9c8\ub2e4 \ub04a\uae40<\/td>\n<td>\ub9e4\uc6b0 \ub192\uc74c (\uc2dc\uac04\ub2f9 60\ud68c)<\/td>\n<td>\uc2e4\uc2dc\uac04 \uc11c\ube44\uc2a4\uc5d0 \ubd80\uc801\ud569<\/td>\n<\/tr>\n<tr>\n<td><strong>300\ucd08<\/strong> (5\ubd84)<\/td>\n<td><strong>300\ucd08<\/strong> (5\ubd84)<\/td>\n<td>\u26a0\ufe0f 5\ubd84\ub9c8\ub2e4 \ub04a\uae40<\/td>\n<td>\ub192\uc74c (\uc2dc\uac04\ub2f9 12\ud68c)<\/td>\n<td>\uc9e7\uc740 \ub300\ud654\uc5d0\ub294 \uad1c\ucc2e\uc73c\ub098 idle \uc2dc \ubb38\uc81c<\/td>\n<\/tr>\n<tr>\n<td><strong>3600\ucd08<\/strong> (1\uc2dc\uac04)<\/td>\n<td><strong>3600\ucd08<\/strong> (1\uc2dc\uac04)<\/td>\n<td>\u2705 \uc548\uc815\uc801 \uc720\uc9c0<\/td>\n<td>\ub9e4\uc6b0 \ub0ae\uc74c<\/td>\n<td><strong>ingress-nginx \uacf5\uc2dd \uad8c\uc7a5\uac12<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>86400\ucd08<\/strong> (24\uc2dc\uac04)<\/td>\n<td><strong>86400\ucd08<\/strong> (24\uc2dc\uac04)<\/td>\n<td>\u2705 \uc548\uc815\uc801 \uc720\uc9c0<\/td>\n<td>\uac70\uc758 \uc5c6\uc74c<\/td>\n<td>\uacfc\ub3c4\ud558\uac8c \uae34 \uc124\uc815 (\ub9ac\uc18c\uc2a4 \ub0ad\ube44 \uac00\ub2a5\uc131)<\/td>\n<\/tr>\n<tr>\n<td><strong>0<\/strong> (\ubb34\uc81c\ud55c)<\/td>\n<td><strong>0<\/strong> (\ubb34\uc81c\ud55c)<\/td>\n<td>\u274c <strong>\uc124\uc815 \ubd88\uac00<\/strong><\/td>\n<td>N\/A<\/td>\n<td>nginx\ub294 0\uc744 \ubb34\uc81c\ud55c\uc73c\ub85c \ud574\uc11d\ud558\uc9c0 \uc54a\uc74c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"_3\">\uad8c\uc7a5\uac12 \uc120\ud0dd \uae30\uc900<\/h3>\n<ul>\n<li><strong>3600\ucd08 (1\uc2dc\uac04)<\/strong>: \ub300\ubd80\ubd84\uc758 \uc2e4\uc2dc\uac04 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \uc801\ud569. ingress-nginx \uacf5\uc2dd \ubb38\uc11c \uad8c\uc7a5<\/li>\n<li><strong>\ub354 \uae34 \uac12\uc774 \ud544\uc694\ud55c \uacbd\uc6b0<\/strong>: \uc7a5\uc2dc\uac04 \uc5f0\uacb0 \uc720\uc9c0\uac00 \ud544\uc694\ud55c IoT, \ubaa8\ub2c8\ud130\ub9c1 \uc2dc\uc2a4\ud15c \ub4f1<\/li>\n<li><strong>\ub354 \uc9e7\uc740 \uac12\uc774 \ud5c8\uc6a9\ub418\ub294 \uacbd\uc6b0<\/strong>: \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc8fc\uae30\uc801\uc73c\ub85c ping\/pong heartbeat\ub97c \uad6c\ud604\ud55c \uacbd\uc6b0 (\uc544\ub798 \ub300\uc548 \ucc38\uace0)<\/li>\n<\/ul>\n<h3 id=\"tradeoff\">\u26a0\ufe0f Timeout \uac12 \ubcc0\uacbd \uc2dc \ud2b8\ub808\uc774\ub4dc\uc624\ud504<\/h3>\n<p>NGINX\uc758 <code>proxy_read_timeout<\/code>\uacfc <code>proxy_send_timeout<\/code>\uc774 \uae30\ubcf8\uac12 60\ucd08\ub85c \uc124\uc815\ub41c \ub370\uc5d0\ub294 \uc774\uc720\uac00 \uc788\ub2e4. \uc774 \uac12\uc744 \ubcc0\uacbd\ud560 \ub54c \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \uae0d\uc815\uc801\/\ubd80\uc815\uc801 \uc601\ud5a5\uc744 \ubc18\ub4dc\uc2dc \uc774\ud574\ud574\uc57c \ud55c\ub2e4.<\/p>\n<h4 id=\"tradeoff-increase\">\uac12\uc744 \ub298\ub9b4 \ub54c (60\ucd08 \u2192 3600\ucd08)<\/h4>\n<table>\n<thead>\n<tr>\n<th>\uc601\ud5a5<\/th>\n<th>\ub0b4\uc6a9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u2705 \uae0d\uc815\uc801<\/strong><\/td>\n<td>WebSocket \ub4f1 long-lived connection\uc774 \uc548\uc815\uc801\uc73c\ub85c \uc720\uc9c0\ub428. idle \uc0c1\ud0dc\uc5d0\uc11c\ub3c4 \uc5f0\uacb0\uc774 \ub04a\uae30\uc9c0 \uc54a\uc544 \uc7ac\uc5f0\uacb0 \uc624\ubc84\ud5e4\ub4dc \uc81c\uac70<\/td>\n<\/tr>\n<tr>\n<td><strong>\u274c \uc880\ube44 \uc5f0\uacb0 \uc99d\uac00<\/strong><\/td>\n<td>\ube44\uc815\uc0c1 \uc885\ub8cc\ub41c \ud074\ub77c\uc774\uc5b8\ud2b8(\ub124\ud2b8\uc6cc\ud06c \ub2e8\uc808, \ube0c\ub77c\uc6b0\uc800 \uac15\uc81c \uc885\ub8cc \ub4f1)\uc758 \uc5f0\uacb0\uc774 \ucd5c\ub300 3600\ucd08 \ub3d9\uc548 NGINX \uc6cc\ucee4\uc5d0 \ub0a8\uc544\uc788\uc74c. \uc5f0\uacb0\ub2f9 \uba54\ubaa8\ub9ac(\uc218 KB~\uc218\uc2ed KB)\uc640 \ud30c\uc77c \ub514\uc2a4\ud06c\ub9bd\ud130\ub97c \uc810\uc720\ud558\ubbc0\ub85c, \ub300\uaddc\ubaa8 \ud074\ub77c\uc774\uc5b8\ud2b8 \ud658\uacbd\uc5d0\uc11c\ub294 <code>worker_connections<\/code> \uace0\uac08 \uac00\ub2a5\uc131<\/td>\n<\/tr>\n<tr>\n<td><strong>\u274c \uc7a5\uc560 \uac10\uc9c0 \uc9c0\uc5f0<\/strong><\/td>\n<td>\uc5c5\uc2a4\ud2b8\ub9bc \uc11c\ubc84\uac00 \uc751\ub2f5 \ubd88\ub2a5 \uc0c1\ud0dc\uc5d0 \ube60\uc838\ub3c4 NGINX\ub294 \ucd5c\ub300 timeout \uc2dc\uac04\ub9cc\ud07c \ub300\uae30\ud55c \ud6c4\uc5d0\uc57c 502\/504\ub97c \ubc18\ud658. \uae30\ubcf8\uac12 60\ucd08\uba74 1\ubd84 \ub0b4 \uac10\uc9c0\ub418\uc9c0\ub9cc, 3600\ucd08\uba74 \ucd5c\ub300 1\uc2dc\uac04 \ud6c4\uc5d0\uc57c \uac10\uc9c0<\/td>\n<\/tr>\n<tr>\n<td><strong>\u274c \ub9ac\uc18c\uc2a4 \ub0ad\ube44<\/strong><\/td>\n<td>\uc758\ub3c4\ud558\uc9c0 \uc54a\uc740 long-lived HTTP \uc694\uccad(\uc608: \ub290\ub9b0 \ud074\ub77c\uc774\uc5b8\ud2b8, \uc798\ubabb\ub41c API \ud638\ucd9c)\ub3c4 3600\ucd08 \ub3d9\uc548 \uc5f0\uacb0\uc774 \uc720\uc9c0\ub418\uc5b4 \uc11c\ubc84 \ub9ac\uc18c\uc2a4\ub97c \ubd88\ud544\uc694\ud558\uac8c \uc810\uc720<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"tradeoff-decrease\">\uac12\uc744 \uc904\uc77c \ub54c (\uc608: 60\ucd08 \u2192 10\ucd08)<\/h4>\n<table>\n<thead>\n<tr>\n<th>\uc601\ud5a5<\/th>\n<th>\ub0b4\uc6a9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>\u2705 \uae0d\uc815\uc801<\/strong><\/td>\n<td>\uc880\ube44 \uc5f0\uacb0\uc774 \ube60\ub974\uac8c \uc815\ub9ac\ub418\uc5b4 \ub9ac\uc18c\uc2a4 \ud68c\uc218\uac00 \ube60\ub984. \uc5c5\uc2a4\ud2b8\ub9bc \uc7a5\uc560\ub97c \ube60\ub974\uac8c \uac10\uc9c0<\/td>\n<\/tr>\n<tr>\n<td><strong>\u274c \uc815\uc0c1 \uc5f0\uacb0 \ub04a\uae40<\/strong><\/td>\n<td>\ucc98\ub9ac \uc2dc\uac04\uc774 \uae34 API \uc694\uccad\uc774\ub098 \ub300\uc6a9\ub7c9 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc\uac00 \uc911\uac04\uc5d0 \ub04a\uae38 \uc218 \uc788\uc74c<\/td>\n<\/tr>\n<tr>\n<td><strong>\u274c WebSocket \uc644\uc804 \uc0ac\uc6a9 \ubd88\uac00<\/strong><\/td>\n<td>10\ucd08 \ub3d9\uc548 \uba54\uc2dc\uc9c0\uac00 \uc5c6\uc73c\uba74 \uc5f0\uacb0\uc774 \ub04a\uae30\ubbc0\ub85c \uc2e4\uc2dc\uac04 \uc11c\ube44\uc2a4 \uc6b4\uc601 \uc790\uccb4\uac00 \ubd88\uac00\ub2a5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"tradeoff-mitigation\">\uad8c\uc7a5 \uc644\ud654 \uc804\ub7b5<\/h4>\n<p>Timeout\uc744 \ub298\ub824\uc57c \ud558\ub294 \uacbd\uc6b0, \ub2e4\uc74c\uacfc \uac19\uc740 \uc644\ud654 \uc804\ub7b5\uc744 \ud568\uaed8 \uc801\uc6a9\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud55c\ub2e4:<\/p>\n<ul>\n<li><strong>\uc11c\ube44\uc2a4\ubcc4 \uac1c\ubcc4 \uc124\uc815<\/strong>: ConfigMap(\uc804\uc5ed)\uc774 \uc544\ub2cc Ingress \uc5b4\ub178\ud14c\uc774\uc158(\uac1c\ubcc4)\uc73c\ub85c \uc124\uc815\ud558\uc5ec, WebSocket\uc774 \ud544\uc694\ud55c \uc11c\ube44\uc2a4\ub9cc \ub192\uc740 timeout\uc744 \uc801\uc6a9. \uc774\ubc88 \uc0ac\ub840\uc5d0\uc11c \ucc44\ud0dd\ud55c \ubc29\ubc95<\/li>\n<li><strong>\ud074\ub77c\uc774\uc5b8\ud2b8 Ping\/Pong \uad6c\ud604<\/strong>: \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub808\ubca8\uc5d0\uc11c heartbeat\ub97c \uad6c\ud604\ud558\uba74 timeout\uc744 \ubcf4\uc218\uc801(300~600\ucd08)\uc73c\ub85c \uc124\uc815 \uac00\ub2a5<\/li>\n<li><strong>NGINX keepalive \uc124\uc815 \ubcd1\ud589<\/strong>: <code>upstream-keepalive-timeout<\/code>, <code>upstream-keepalive-connections<\/code> \ub4f1\uc73c\ub85c \uc5c5\uc2a4\ud2b8\ub9bc \uc5f0\uacb0 \ud480 \uad00\ub9ac<\/li>\n<li><strong>\ubaa8\ub2c8\ud130\ub9c1 \uac15\ud654<\/strong>: \ud65c\uc131 \uc5f0\uacb0 \uc218(<code>nginx_ingress_controller_nginx_process_connections<\/code>) \uba54\ud2b8\ub9ad\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud558\uc5ec \ube44\uc815\uc0c1 \uc99d\uac00 \uc870\uae30 \uac10\uc9c0<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"6\">6. \uac80\uc99d \ubc0f \uacb0\uacfc<\/h2>\n<h3 id=\"61\">6.1. \uc801\uc6a9 \uc808\ucc28<\/h3>\n<pre class=\"codehilite\"><code class=\"language-bash\"># Ingress \ub9ac\uc18c\uc2a4 \uc218\uc815\nkubectl apply -f mattermost-ingress.yaml\n\n# NGINX \uc124\uc815 \uc989\uc2dc \ubc18\uc601 \ud655\uc778\nkubectl exec -n ingress-nginx &lt;controller-pod&gt; -- cat \/etc\/nginx\/nginx.conf | grep proxy_read_timeout\n# \ucd9c\ub825: proxy_read_timeout 3600s;\n<\/code><\/pre>\n<h3 id=\"62\">6.2. \uc801\uc6a9 \ud6c4 \uacb0\uacfc<\/h3>\n<ul>\n<li>\u2705 <strong>\uc989\uc2dc \ud6a8\uacfc \ud655\uc778<\/strong>: \uc5b4\ub178\ud14c\uc774\uc158 \uc801\uc6a9 \ud6c4 <strong>\uc7ac\uc5f0\uacb0 \uc774\ubca4\ud2b8\uac00 \uc989\uc2dc \uba48\ucda4<\/strong><\/li>\n<li>\u2705 <strong>\uc548\uc815\uc131 \uac80\uc99d<\/strong>: \uc774\ud6c4 24\uc2dc\uac04 \ub3d9\uc548 1,163\uac74+ \u2192 <strong>0\uac74<\/strong>\uc73c\ub85c \uac10\uc18c<\/li>\n<li>\u2705 <strong>\uc11c\ube44\uc2a4 \uc815\uc0c1\ud654<\/strong>: 16\uac1c WebSocket \ud074\ub77c\uc774\uc5b8\ud2b8 \ubaa8\ub450 \uc548\uc815\uc801 \uc5f0\uacb0 \uc720\uc9c0<\/li>\n<\/ul>\n<h3 id=\"63\">6.3. \uc65c \uc989\uc2dc \uba48\ucdc4\ub294\uac00?<\/h3>\n<ol>\n<li>Ingress \uc5b4\ub178\ud14c\uc774\uc158 \ubcc0\uacbd \uc2dc ingress-nginx controller\uac00 NGINX \uc124\uc815 \ud30c\uc77c\uc744 \uc989\uc2dc \uc7ac\uc0dd\uc131<\/li>\n<li>NGINX reload \uc218\ud589 (graceful reload\ub85c \uae30\uc874 \uc5f0\uacb0\uc740 \uc720\uc9c0)<\/li>\n<li><strong>\uc0c8\ub85c\uc6b4 WebSocket \uc5f0\uacb0<\/strong>\uc740 3600\ucd08 timeout\uc73c\ub85c \ucc98\ub9ac<\/li>\n<li>\uae30\uc874 60\ucd08 timeout\uc774 \uc801\uc6a9\ub41c \uc5f0\uacb0\uc740 \ub9c8\uc9c0\ub9c9 \uc7ac\uc5f0\uacb0 \ud6c4 \uc0c8 \uc124\uc815\uc73c\ub85c \uc720\uc9c0<\/li>\n<\/ol>\n<hr \/>\n<h2 id=\"7\">7. \ub300\uc548 \ubd84\uc11d \u2014 \ub2e4\ub978 \ubc29\ubc95\uc740 \uc5c6\uc5c8\uc744\uae4c?<\/h2>\n<h3 id=\"71-websocket-pingpong-heartbeat\">7.1. WebSocket Ping\/Pong Heartbeat \uad6c\ud604<\/h3>\n<h4 id=\"_4\">\uac1c\ub150<\/h4>\n<p>WebSocket \ud504\ub85c\ud1a0\ucf5c\uc740 <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc6455#section-5.5\">RFC 6455 \u00a75.5 (Control Frames)<\/a>\uc5d0\uc11c <strong>Ping(\u00a75.5.2)\/Pong(\u00a75.5.3) frame<\/strong>\uc744 \uc815\uc758\ud55c\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\ub098 \uc11c\ubc84\uac00 \uc8fc\uae30\uc801\uc73c\ub85c ping\uc744 \ubcf4\ub0b4\uba74, \uc0c1\ub300\ubc29\uc740 pong\uc73c\ub85c \uc751\ub2f5\ud558\uc5ec \u201c\uc5f0\uacb0\uc774 \uc0b4\uc544\uc788\uc74c\u201d\uc744 \uc99d\uba85\ud55c\ub2e4.<\/p>\n<h4 id=\"mattermost\">\uad6c\ud604 \uc608\uc2dc (Node.js <code>ws<\/code> \ub77c\uc774\ube0c\ub7ec\ub9ac \uae30\uc900)<\/h4>\n<p><em>\uc544\ub798 \ucf54\ub4dc\ub294 Node.js\uc758 <a href=\"https:\/\/github.com\/websockets\/ws\"><code>ws<\/code><\/a> npm \ud328\ud0a4\uc9c0 API\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \ube0c\ub77c\uc6b0\uc800\uc758 \ud45c\uc900 WebSocket API\uc5d0\uc11c\ub294 <code>ws.ping()<\/code>\/<code>ws.on('pong')<\/code>\uc744 \uc9c1\uc811 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc73c\uba70, \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub808\ubca8 \uba54\uc2dc\uc9c0\ub85c heartbeat\ub97c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/em><\/p>\n<pre class=\"codehilite\"><code class=\"language-javascript\">const ws = new WebSocket('wss:\/\/chat.example.corp\/api\/v4\/websocket');\n\n\/\/ 30\ucd08\ub9c8\ub2e4 ping \uc804\uc1a1\nconst pingInterval = setInterval(() =&gt; {\n  if (ws.readyState === WebSocket.OPEN) {\n    ws.ping(); \/\/ WebSocket ping frame \uc804\uc1a1\n  }\n}, 30000);\n\nws.on('pong', () =&gt; {\n  console.log('Received pong from server');\n});\n<\/code><\/pre>\n<h4 id=\"_5\">\uc7a5\ub2e8\uc810 \ube44\uad50<\/h4>\n<table>\n<thead>\n<tr>\n<th>\uc811\uadfc \ubc29\ubc95<\/th>\n<th>\uc7a5\uc810<\/th>\n<th>\ub2e8\uc810<\/th>\n<th>\uc801\uc6a9 \ub09c\uc774\ub3c4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Timeout \uc99d\uac00<\/strong> (\ucc44\ud0dd)<\/td>\n<td>\uc778\ud504\ub77c \ub808\ubca8 \ud574\uacb0, \ucf54\ub4dc \ubcc0\uacbd \ubd88\ud544\uc694, \uc989\uc2dc \uc801\uc6a9 \uac00\ub2a5<\/td>\n<td>\uc880\ube44 \uc5f0\uacb0\uc774 \uc624\ub798 \uc720\uc9c0\ub420 \uac00\ub2a5\uc131<\/td>\n<td>\u2b50 \ub0ae\uc74c<\/td>\n<\/tr>\n<tr>\n<td><strong>Ping\/Pong Heartbeat<\/strong><\/td>\n<td>\uc5f0\uacb0 \uc0c1\ud0dc \ub2a5\ub3d9 \ud655\uc778, \ub124\ud2b8\uc6cc\ud06c \uc7a5\uc560 \uc989\uc2dc \uac10\uc9c0<\/td>\n<td>\ud074\ub77c\uc774\uc5b8\ud2b8\/\uc11c\ubc84 \ucf54\ub4dc \uc218\uc815 \ud544\uc694, \ud2b8\ub798\ud53d \uc99d\uac00<\/td>\n<td>\u2b50\u2b50\u2b50 \ub192\uc74c<\/td>\n<\/tr>\n<tr>\n<td><strong>Timeout \uc99d\uac00 + Heartbeat<\/strong><\/td>\n<td>\ucd5c\uace0\uc758 \uc548\uc815\uc131<\/td>\n<td>\uad6c\ud604 \ubcf5\uc7a1\ub3c4 \ub192\uc74c<\/td>\n<td>\u2b50\u2b50\u2b50\u2b50 \ub9e4\uc6b0 \ub192\uc74c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"_6\">\uacb0\ub860<\/h4>\n<ul>\n<li><strong>\ub2e8\uae30 \ud574\uacb0<\/strong>: Timeout \uc99d\uac00 (\ubcf8 \uc0ac\ub840\uc758 \uc120\ud0dd)<\/li>\n<li><strong>\uc7a5\uae30 \uac1c\uc120<\/strong>: \ud074\ub77c\uc774\uc5b8\ud2b8 \ucf54\ub4dc\uc5d0 Heartbeat \ucd94\uac00 \ud6c4 timeout\uc744 \uc880 \ub354 \ubcf4\uc218\uc801 \uac12(\uc608: 300\ucd08)\uc73c\ub85c \uc870\uc815 \uace0\ub824 \uac00\ub2a5<\/li>\n<\/ul>\n<h3 id=\"72-global-configmap-vs-ingress\">7.2. Global ConfigMap \uc124\uc815 vs \uac1c\ubcc4 Ingress \uc5b4\ub178\ud14c\uc774\uc158<\/h3>\n<h4 id=\"configmap\">ConfigMap \uc124\uc815 (\uc804\uc5ed)<\/h4>\n<pre class=\"codehilite\"><code class=\"language-yaml\">apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: ingress-nginx-controller\n  namespace: ingress-nginx\ndata:\n  proxy-read-timeout: \"3600\"\n  proxy-send-timeout: \"3600\"\n<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th>\ubc29\ubc95<\/th>\n<th>\uc801\uc6a9 \ubc94\uc704<\/th>\n<th>\uc6b0\uc120\uc21c\uc704<\/th>\n<th>\uad8c\uc7a5 \uc0ac\uc6a9\ucc98<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Global ConfigMap<\/strong><\/td>\n<td>\ubaa8\ub4e0 Ingress\uc5d0 \uae30\ubcf8\uac12 \uc801\uc6a9<\/td>\n<td>\ub0ae\uc74c (\uc5b4\ub178\ud14c\uc774\uc158\uc5d0 \uc758\ud574 \ub36e\uc5b4\uc50c\uc6cc\uc9d0)<\/td>\n<td>\ud074\ub7ec\uc2a4\ud130 \uc804\uccb4 \uc815\ucc45<\/td>\n<\/tr>\n<tr>\n<td><strong>Ingress \uc5b4\ub178\ud14c\uc774\uc158<\/strong> (\ucc44\ud0dd)<\/td>\n<td>\ud2b9\uc815 Ingress\ub9cc \uc801\uc6a9<\/td>\n<td>\ub192\uc74c (ConfigMap \ub36e\uc5b4\uc500)<\/td>\n<td>\uc11c\ube44\uc2a4\ubcc4 \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 id=\"_7\">\uc120\ud0dd \uc774\uc720<\/h4>\n<ul>\n<li>Mattermost \uc678 \ub2e4\ub978 \uc11c\ube44\uc2a4\ub294 \uc9e7\uc740 timeout\uc774 \uc801\ud569\ud560 \uc218 \uc788\uc74c<\/li>\n<li><strong>Blast radius \ucd5c\uc18c\ud654<\/strong>: \ud558\ub098\uc758 \uc11c\ube44\uc2a4\ub9cc \uc601\ud5a5\ubc1b\ub3c4\ub85d \uaca9\ub9ac<\/li>\n<li>\uba85\uc2dc\uc801 \ubb38\uc11c\ud654: Ingress YAML\uc744 \ubcf4\uba74 WebSocket \uc124\uc815\uc784\uc744 \uc989\uc2dc \uc54c \uc218 \uc788\uc74c<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"8\">8. \uc5b4\ub178\ud14c\uc774\uc158 \ud638\ud658\uc131 \ub9e4\ud551 \ud14c\uc774\ube14<\/h2>\n<p>Ingress Controller \uc804\ud658 \uc2dc \ubc18\ub4dc\uc2dc \ud655\uc778\ud574\uc57c \ud560 \uc8fc\uc694 \uc5b4\ub178\ud14c\uc774\uc158 \ub9e4\ud551:<\/p>\n<table>\n<thead>\n<tr>\n<th>\uae30\ub2a5<\/th>\n<th>NGINX Inc (F5)<\/th>\n<th>\ucee4\ubba4\ub2c8\ud2f0 ingress-nginx<\/th>\n<th>\ube44\uace0<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>WebSocket \uc9c0\uc6d0<\/strong><\/td>\n<td><code>nginx.org\/websocket-services: \"svc1,svc2\"<\/code><\/td>\n<td><code>nginx.ingress.kubernetes.io\/proxy-read-timeout: \"3600\"<\/code><br \/>\n<code>nginx.ingress.kubernetes.io\/proxy-send-timeout: \"3600\"<\/code><\/td>\n<td><strong>\ud638\ud658 \uc5c6\uc74c<\/strong> \u2014 \uc218\ub3d9 \uc804\ud658 \ud544\uc218<\/td>\n<\/tr>\n<tr>\n<td><strong>Client \ucd5c\ub300 body size<\/strong><\/td>\n<td><code>nginx.org\/client-max-body-size: \"10m\"<\/code><\/td>\n<td><code>nginx.ingress.kubernetes.io\/proxy-body-size: \"10m\"<\/code><\/td>\n<td>\ud0a4 \uc774\ub984 \ub2e4\ub984<\/td>\n<\/tr>\n<tr>\n<td><strong>Proxy timeout<\/strong><\/td>\n<td><code>nginx.org\/proxy-read-timeout: \"30s\"<\/code><\/td>\n<td><code>nginx.ingress.kubernetes.io\/proxy-read-timeout: \"30\"<\/code><\/td>\n<td>\ub2e8\uc704 \ud45c\uae30\ubc95 \ub2e4\ub984 (s \uc720\ubb34)<\/td>\n<\/tr>\n<tr>\n<td><strong>SSL redirect<\/strong><\/td>\n<td><code>nginx.org\/redirect-to-https: \"true\"<\/code><\/td>\n<td><code>nginx.ingress.kubernetes.io\/ssl-redirect: \"true\"<\/code><\/td>\n<td>\ud0a4 \uc774\ub984 \ub2e4\ub984<\/td>\n<\/tr>\n<tr>\n<td><strong>Rewrite target<\/strong><\/td>\n<td><code>nginx.org\/rewrites: \"...\"<\/code><\/td>\n<td><code>nginx.ingress.kubernetes.io\/rewrite-target: \"\/...\"<\/code><\/td>\n<td>\uad6c\uc870 \uc644\uc804\ud788 \ub2e4\ub984<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"_8\">\u26a0\ufe0f \uc804\ud658 \uc2dc \uc8fc\uc758\uc0ac\ud56d<\/h3>\n<ol>\n<li><strong>\uc790\ub3d9 \ubcc0\ud658 \uc5c6\uc74c<\/strong>: \ub450 \ud504\ub85c\uc81d\ud2b8 \uac04 \uc5b4\ub178\ud14c\uc774\uc158\uc740 \uc790\ub3d9\uc73c\ub85c \ubcc0\ud658\ub418\uc9c0 \uc54a\uc74c<\/li>\n<li><strong>\ubb34\uc2dc\ub428, \uc624\ub958 \uc5c6\uc74c<\/strong>: \uc798\ubabb\ub41c \uc5b4\ub178\ud14c\uc774\uc158\uc740 \uc870\uc6a9\ud788 \ubb34\uc2dc\ub428 (\ub85c\uadf8\uc5d0 \uacbd\uace0\ub9cc \ucd9c\ub825)<\/li>\n<li><strong>\ubb38\uc11c \ud655\uc778 \ud544\uc218<\/strong>:<\/li>\n<li>NGINX Inc: <a href=\"https:\/\/docs.nginx.com\/nginx-ingress-controller\/configuration\/ingress-resources\/advanced-configuration-with-annotations\/\">docs.nginx.com\/nginx-ingress-controller\/configuration\/ingress-resources\/advanced-configuration-with-annotations\/<\/a><\/li>\n<li>ingress-nginx: <a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/annotations\/\">kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/annotations\/<\/a><\/li>\n<\/ol>\n<hr \/>\n<h2 id=\"9-ingress-controller\">9. \uad50\ud6c8 \ubc0f Ingress Controller \uc804\ud658 \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/h2>\n<h3 id=\"91\">9.1. \ud575\uc2ec \uad50\ud6c8<\/h3>\n<h4 id=\"1_1\">1\ufe0f\u20e3 \u201c\ube44\uc2b7\ud55c \uc774\ub984 \u2260 \uac19\uc740 \ud504\ub85c\uc81d\ud2b8\u201d<\/h4>\n<ul>\n<li><code>ingress-nginx<\/code>\uc640 <code>NGINX Ingress Controller<\/code>\ub294 <strong>\uc644\uc804\ud788 \ub2e4\ub978 \ud504\ub85c\uc81d\ud2b8<\/strong><\/li>\n<li>\uad00\ub9ac \uc8fc\uccb4, \uc800\uc7a5\uc18c, \ubb38\uc11c, \uc5b4\ub178\ud14c\uc774\uc158\uc774 \ubaa8\ub450 \ub2e4\ub984<\/li>\n<li>\uc804\ud658 \uc2dc \u201c\uc774\ub984\ub9cc \ubc14\uafb8\uba74 \ub418\uaca0\uc9c0\u201d\ub77c\ub294 \uac00\uc815\uc740 \uc704\ud5d8<\/li>\n<\/ul>\n<h4 id=\"2_1\">2\ufe0f\u20e3 \u201c\uc870\uc6a9\ud788 \uc2e4\ud328\ud558\ub294 \uc124\uc815\uc774 \uac00\uc7a5 \uc704\ud5d8\ud558\ub2e4\u201d<\/h4>\n<ul>\n<li>\uc798\ubabb\ub41c \uc5b4\ub178\ud14c\uc774\uc158\uc740 <strong>\uc624\ub958 \uc5c6\uc774 \ubb34\uc2dc\ub428<\/strong><\/li>\n<li>\ud14c\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c\ub294 \ubc1c\uacac\ud558\uae30 \uc5b4\ub824\uc6c0 (\uc9e7\uc740 \uc138\uc158\uc5d0\uc11c\ub294 60\ucd08 timeout\uc774 \ubb38\uc81c \uc548 \ub428)<\/li>\n<li><strong>\uc2e4\uc81c \ud504\ub85c\ub355\uc158 \ubd80\ud558<\/strong>\uc5d0\uc11c\ub9cc \ub4dc\ub7ec\ub098\ub294 \ubb38\uc81c<\/li>\n<\/ul>\n<h4 id=\"3_1\">3\ufe0f\u20e3 \u201c\ubc29\ud654\ubcbd \uc7a5\uc560\uac00 \uc228\uaca8\uc9c4 \uc124\uc815 \ubb38\uc81c\ub97c \ub4dc\ub7ec\ub0c8\ub2e4\u201d<\/h4>\n<ul>\n<li>\uc804\ud658 \ud6c4 \uc815\uc0c1 \ub3d9\uc791\ud558\ub294 \uac83\ucc98\ub7fc \ubcf4\uc600\uc73c\ub098, \uc2e4\uc81c\ub85c\ub294 <strong>\uc7a0\uc7ac\ub41c \ubb38\uc81c<\/strong>\uc600\uc74c<\/li>\n<li>\ubc29\ud654\ubcbd \uc7a5\uc560\ub85c \ub300\ub7c9 \uc7ac\uc5f0\uacb0 \ubc1c\uc0dd \u2192 60\ucd08 \ud328\ud134\uc774 \uba85\ud655\ud788 \uad00\uce21\ub428<\/li>\n<li>\uc7a5\uc560\ub294 \ub54c\ub85c <strong>\ub354 \ud070 \ubb38\uc81c\ub97c \ubc1c\uacac\ud558\ub294 \uae30\ud68c<\/strong><\/li>\n<\/ul>\n<h3 id=\"92-ingress-controller\">9.2. Ingress Controller \uc804\ud658 \uc2dc \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/h3>\n<h4 id=\"pre-migration\">\uc804\ud658 \uc804 (Pre-migration)<\/h4>\n<ul>\n<li>[ ] \ud604\uc7ac \uc0ac\uc6a9 \uc911\uc778 \ubaa8\ub4e0 \uc5b4\ub178\ud14c\uc774\uc158 \ubaa9\ub85d \uc791\uc131<\/li>\n<li>[ ] \uc0c8 Ingress Controller\uc758 \uc5b4\ub178\ud14c\uc774\uc158 \ubb38\uc11c \ud655\uc778<\/li>\n<li>[ ] \uc5b4\ub178\ud14c\uc774\uc158 \ub9e4\ud551 \ud14c\uc774\ube14 \uc791\uc131 (1:1 \ub9e4\ud551 \ubd88\uac00\ub2a5\ud55c \uac83 \uccb4\ud06c)<\/li>\n<li>[ ] WebSocket \uc0ac\uc6a9 \uc11c\ube44\uc2a4 \ubaa9\ub85d \ud655\uc778<\/li>\n<li>[ ] Staging\/\uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c \uba3c\uc800 \ud14c\uc2a4\ud2b8<\/li>\n<\/ul>\n<h4 id=\"migration\">\uc804\ud658 \uc911 (Migration)<\/h4>\n<ul>\n<li>[ ] Ingress YAML\uc758 \ubaa8\ub4e0 \uc5b4\ub178\ud14c\uc774\uc158 prefix \ubcc0\uacbd<\/li>\n<li>[ ] \uae30\ub2a5\ubcc4 \ub3d9\ub4f1\uc131 \ud655\uc778 (\ud2b9\ud788 timeout, body-size, rewrite \ub4f1)<\/li>\n<li>[ ] NGINX \uc124\uc815 \ud30c\uc77c diff \ud655\uc778 (<code>kubectl exec ... cat \/etc\/nginx\/nginx.conf<\/code>)<\/li>\n<li>[ ] \ubc30\ud3ec \uc804 <code>kubectl apply --dry-run=client<\/code>\ub85c \uac80\uc99d<\/li>\n<\/ul>\n<h4 id=\"post-migration\">\uc804\ud658 \ud6c4 (Post-migration)<\/h4>\n<ul>\n<li>[ ] <strong>WebSocket \uc11c\ube44\uc2a4 \uc7a5\uc2dc\uac04 \uc5f0\uacb0 \ud14c\uc2a4\ud2b8<\/strong> (\ucd5c\uc18c 5\ubd84 \uc774\uc0c1)<\/li>\n<li>[ ] \ubaa8\ub2c8\ud130\ub9c1: \uc7ac\uc5f0\uacb0 \ube48\ub3c4, 502\/504 \uc624\ub958\uc728 \ucd94\uc801<\/li>\n<li>[ ] NGINX access log\uc5d0\uc11c <code>upstream_response_time<\/code> \ud655\uc778<\/li>\n<li>[ ] \ud074\ub77c\uc774\uc5b8\ud2b8 \ub85c\uadf8\uc5d0\uc11c unexpected disconnection \ud328\ud134 \uac80\uc0c9<\/li>\n<li>[ ] \ub864\ubc31 \uacc4\ud68d \uc900\ube44 (\uae30\uc874 Ingress Controller\ub97c parallel\ub85c \uc720\uc9c0 \uad8c\uc7a5)<\/li>\n<\/ul>\n<h3 id=\"93-websocket\">9.3. WebSocket \uc11c\ube44\uc2a4 \uc6b4\uc601 \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/h3>\n<ul>\n<li>[ ] <code>proxy-read-timeout<\/code> \ucd5c\uc18c <strong>3600\ucd08<\/strong> \uc124\uc815 (ingress-nginx \uacf5\uc2dd \uad8c\uc7a5)<\/li>\n<li>[ ] <code>proxy-send-timeout<\/code>\ub3c4 \ub3d9\uc77c\ud558\uac8c \uc124\uc815 (\ub300\uce6d\uc131 \uc720\uc9c0)<\/li>\n<li>[ ] \ud074\ub77c\uc774\uc5b8\ud2b8 \uc7ac\uc5f0\uacb0 \ub85c\uc9c1 \uad6c\ud604 (\ub124\ud2b8\uc6cc\ud06c \uc77c\uc2dc \uc7a5\uc560 \ub300\ube44)<\/li>\n<li>[ ] \uc120\ud0dd\uc0ac\ud56d: Ping\/Pong heartbeat \uad6c\ud604 (\ub2a5\ub3d9\uc801 \uc5f0\uacb0 \ud655\uc778)<\/li>\n<li>[ ] \ubaa8\ub2c8\ud130\ub9c1: WebSocket \uc5f0\uacb0 \uc218\uba85(lifetime) \uba54\ud2b8\ub9ad \ucd94\uc801<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"10\">10. \ucc38\uace0 \uc790\ub8cc<\/h2>\n<h3 id=\"_9\">\uacf5\uc2dd \ubb38\uc11c<\/h3>\n<ol>\n<li><strong>ingress-nginx \uc5b4\ub178\ud14c\uc774\uc158 \ubb38\uc11c<\/strong><br \/>\n<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/annotations\/\">https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/annotations\/<\/a><\/li>\n<li><strong>ingress-nginx ConfigMap \uc635\uc158<\/strong><br \/>\n<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/configmap\/\">https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/nginx-configuration\/configmap\/<\/a><\/li>\n<li><strong>ingress-nginx WebSocket \uacf5\uc2dd \uac00\uc774\ub4dc<\/strong><br \/>\n<a href=\"https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/miscellaneous\/#websockets\">https:\/\/kubernetes.github.io\/ingress-nginx\/user-guide\/miscellaneous\/#websockets<\/a><\/li>\n<li><strong>NGINX proxy_read_timeout \uacf5\uc2dd \ubb38\uc11c<\/strong><br \/>\n<a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_read_timeout\">https:\/\/nginx.org\/en\/docs\/http\/ngx_http_proxy_module.html#proxy_read_timeout<\/a><\/li>\n<li><strong>NGINX WebSocket \ud504\ub85d\uc2dc \uac00\uc774\ub4dc<\/strong><br \/>\n<a href=\"https:\/\/nginx.org\/en\/docs\/http\/websocket.html\">https:\/\/nginx.org\/en\/docs\/http\/websocket.html<\/a><\/li>\n<li><strong>NGINX Inc vs Community ingress-nginx \ube44\uad50<\/strong><br \/>\n<a href=\"https:\/\/docs.nginx.com\/nginx-ingress-controller\/install\/migrate-ingress-nginx\/\">https:\/\/docs.nginx.com\/nginx-ingress-controller\/install\/migrate-ingress-nginx\/<\/a><\/li>\n<\/ol>\n<h3 id=\"_10\">\uc18c\uc2a4 \ucf54\ub4dc<\/h3>\n<ol>\n<li><strong>ingress-nginx \uae30\ubcf8\uac12 \uc124\uc815 \ucf54\ub4dc<\/strong><br \/>\nGitHub: <a href=\"https:\/\/github.com\/kubernetes\/ingress-nginx\/blob\/main\/internal\/ingress\/controller\/config\/config.go\">kubernetes\/ingress-nginx\/internal\/ingress\/controller\/config\/config.go<\/a><br \/>\n(\uad00\ub828 \ub77c\uc778: <code>ProxyReadTimeout: 60<\/code>, <code>ProxySendTimeout: 60<\/code>)<\/li>\n<\/ol>\n<h3 id=\"rfc\">RFC<\/h3>\n<ol>\n<li><strong>WebSocket Protocol (RFC 6455)<\/strong><br \/>\n<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc6455\">https:\/\/datatracker.ietf.org\/doc\/html\/rfc6455<\/a><\/li>\n<\/ol>\n<hr \/>\n<h2 id=\"_11\">\ub9c8\uce58\uba70<\/h2>\n<p>\uc774\ubc88 \uc778\uc2dc\ub358\ud2b8\ub294 \u201c\uc774\ub984\uc774 \ube44\uc2b7\ud558\ub2e4\u201d\ub294 \uc774\uc720\ub85c \uac04\uacfc\ud558\uae30 \uc26c\uc6b4 <strong>\uc5b4\ub178\ud14c\uc774\uc158 \ud638\ud658\uc131 \ubb38\uc81c<\/strong>\uac00 \ud504\ub85c\ub355\uc158 \uc7a5\uc560\ub85c \uc774\uc5b4\uc9c4 \uc0ac\ub840\uc600\ub2e4. \ud2b9\ud788 WebSocket\ucc98\ub7fc <strong>long-lived connection<\/strong>\uc744 \uc0ac\uc6a9\ud558\ub294 \uc11c\ube44\uc2a4\ub294 timeout \uc124\uc815\uc5d0 \ub9e4\uc6b0 \ubbfc\uac10\ud558\ubbc0\ub85c, Ingress Controller \uc804\ud658 \uc2dc \ubc18\ub4dc\uc2dc \uaf3c\uaf3c\ud55c \uac80\uc99d\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n<h3 id=\"_12\">\ud575\uc2ec \uc694\uc57d<\/h3>\n<ul>\n<li>\u2705 <strong>\uc0ac\uc2e4<\/strong>: <code>proxy_read_timeout<\/code> \uae30\ubcf8\uac12 60\ucd08\ub294 \uacf5\uc2dd \ubb38\uc11c\ub85c \ud655\uc778\ub428<\/li>\n<li>\u2705 <strong>\uc0ac\uc2e4<\/strong>: ingress-nginx\ub294 <code>nginx.org\/*<\/code> \uc5b4\ub178\ud14c\uc774\uc158\uc744 \ubb34\uc2dc\ud568<\/li>\n<li>\u2705 <strong>\uc0ac\uc2e4<\/strong>: \uc5b4\ub178\ud14c\uc774\uc158 \uc801\uc6a9 \uc989\uc2dc \uc7ac\uc5f0\uacb0 \ubb38\uc81c \ud574\uacb0\ub428<\/li>\n<li>\u26a0\ufe0f <strong>\ucd94\uc815<\/strong>: \ubc29\ud654\ubcbd \uc7a5\uc560\uac00 \uc5c6\uc5c8\ub2e4\uba74 \ubb38\uc81c\uac00 \ud55c\ub3d9\uc548 \ubc1c\uacac\ub418\uc9c0 \uc54a\uc558\uc744 \uac00\ub2a5\uc131 \ub192\uc74c<\/li>\n<li>\u26a0\ufe0f <strong>\ud55c\uacc4<\/strong>: \ub2e4\ub978 \uc11c\ube44\uc2a4\uc5d0\uc11c \ub3d9\uc77c \ubb38\uc81c\uac00 \uc228\uc5b4\uc788\uc744 \uac00\ub2a5\uc131 (\uc804\uc218 \uc870\uc0ac \ud544\uc694)<\/li>\n<\/ul>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c, <strong>\ubb38\uc11c\ub97c \ubbff\ub418, \uac80\uc99d\ud558\ub77c<\/strong>\ub294 \uc6d0\uce59\uc744 \ub2e4\uc2dc \ud55c\ubc88 \ub418\uc0c8\uae30\uac8c \ub41c \uc0ac\ub840\uc600\ub2e4.<\/p>\n<p>\uc870\ud68c\uc218: 30<\/p>","protected":false},"excerpt":{"rendered":"<p>\ud83d\udccc \ud83d\udccc \ud575\uc2ec \uc694\uc57d Kubernetes \ud658\uacbd\uc5d0\uc11c NGINX Inc Ingress Controller\uc5d0\uc11c \ucee4\ubba4\ub2c8\ud2f0 ingress-nginx\ub85c \uc804\ud658 \ud6c4, \ubc29\ud654\ubcbd \uc7a5\uc560 \ubcf5\uad6c \uc774\ud6c4 Mattermost WebSocket \uc5f0\uacb0\uc774 \uc815\ud655\ud788 60\ucd08\ub9c8\ub2e4 \uc7ac\uc5f0\uacb0\uc744 \ubc18\ubcf5\ud55c \uc778\uc2dc\ub358\ud2b8. \uadfc\ubcf8 \uc6d0\uc778\uc740 \uc5b4\ub178\ud14c\uc774\uc158 \ud638\ud658\uc131 \ubb38\uc81c\ub85c, \uae30\uc874 nginx.org\/websocket-services \uc5b4\ub178\ud14c\uc774\uc158\uc774 ingress-nginx\uc5d0\uc11c \ubb34\uc2dc\ub418\uba74\uc11c proxy timeout\uc774 \uae30\ubcf8\uac12(60\ucd08)\uc73c\ub85c \ub3d9\uc791\ud574 WebSocket idle \uc5f0\uacb0\uc774 \ub04a\uae34 \uac83\uc73c\ub85c \ud655\uc778\ub428. 1. \ud658\uacbd \ubc0f \ubc30\uacbd \uc778\ud504\ub77c \uad6c\uc131 \ud50c\ub7ab\ud3fc: Kubernetes (\uc790\uccb4 [&hellip;]<\/p>\n","protected":false},"author":2,"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,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[22,60],"tags":[166,154,151,157,163,160],"class_list":["post-643","post","type-post","status-publish","format-standard","hentry","category-infrastructure","category-kubernetes","tag-incident-report","tag-ingress","tag-kubernetes","tag-nginx","tag-troubleshooting","tag-websocket"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/tech.softbell.net\/index.php?rest_route=\/wp\/v2\/posts\/643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tech.softbell.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tech.softbell.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tech.softbell.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tech.softbell.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=643"}],"version-history":[{"count":6,"href":"https:\/\/tech.softbell.net\/index.php?rest_route=\/wp\/v2\/posts\/643\/revisions"}],"predecessor-version":[{"id":700,"href":"https:\/\/tech.softbell.net\/index.php?rest_route=\/wp\/v2\/posts\/643\/revisions\/700"}],"wp:attachment":[{"href":"https:\/\/tech.softbell.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tech.softbell.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tech.softbell.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}