ヘッドレス モードで運用している場合、JSSアプリケーションはHTTPリクエストを受信し、それをSitecore XPサーバーへのレイアウト サービス リクエストに書き換えてプロキシされます。Azure上で運用する場合、プロキシからSitecore XP Serverへの各アウトバウンド接続はSNATポートを使用し、接続の再利用が有効にされていない場合、SNATポート枯渇のリスクが高くなります。この場合、アプリケーションに以下のような症状が発生することがあります:
これは、JSS 11.0.0〜14.0.2バージョンに適用されます。
この問題を解決するには、connection keep-aliveを実装する必要があります:
const http = require("http");
const https = require("https");
const keepAliveConfig = {
            maxSockets: 200,
            maxFreeSockets: 20,
            timeout: 240 * 1000,
            freeSocketTimeout: 240 * 1000,
};
const httpAgent = new keepAlive(keepAliveConfig);
const httpsAgent = new keepAlive.HttpsAgent(keepAliveConfig);
module.exports = {
  setUpDefaultAgents: (serverBundle) => {
    http.globalAgent = httpAgent;
                        https.globalAgent = httpsAgent;
                        if (serverBundle.setUpDefaultAgents) {
                                   serverBundle.setUpDefaultAgents(httpAgent, httpsAgent);
                        }
            },
            /**
             * 接続プールを有効にします。「connection:keep-alive」ヘッダーを追加します。
             * @param {string} url api host
            */
  getAgent: (url) => {
                        if (!url) {
                                    throw new Error("[KEEP-ALIVE-CONFIG] SITECORE_API_HOST value is required, but was undefined")
                        }
                        if (!url.indexOf("http://")) return httpAgent;
                        if (!url.indexOf("https://")) return httpsAgent;
                        throw new Error(
                                    "[KEEP-ALIVE-CONFIG] Unexpected SITECORE_API_HOST value, expected http:// or https://, but was " +
                                               url
                        );
  },
};
…
…
const NodeCache = require('node-cache');
const httpAgents = require("./httpAgents");
…
const serverBundle = require(bundlePath);
httpAgents.setUpDefaultAgents(serverBundle);
…
proxyOptions: {
    // 接続プールを有効にします
    agent: httpAgents.getAgent(apiHost),
    // これをfalseに設定すると、SSLSitecoreインスタンスにプロキシするときにSSL証明書の検証が無効になります。
    // これは重大なセキュリティ問題であるため、ローカル開発以外では決してこれをfalseに設定しないでください。CAが発行した実際の証明書を使用してください。
                        secure: true,
                        headers: {
                                    "accept-encoding": "gzip, deflate"
                        },
                        xfwd: true
            },
…
return fetch(
      `${config.apiHost}/sitecore/api/jss/dictionary/${appName}/${language}?sc_apikey=${
        config.apiKey
      }`,
      {
        headers: {
          connection: "keep-alive",
        },
      }
    )
…
import Helmet from 'react-helmet';
import axios from "axios";
import http from "http";
import https from "https";
…
// keep-alive用にHttp/Httpsエージェントを設定します。ヘッドレス プロキシで使用
export const setUpDefaultAgents = (httpAgent, httpsAgent) => {
  axios.defaults.httpAgent = httpAgent;
  axios.defaults.httpsAgent = httpsAgent;
  http.globalAgent = httpAgent;
  https.globalAgent = httpsAgent;
}; 
const link = createPersistedQueryLink().concat(
    new BatchHttpLink({
      uri: endpoint,
      credentials: 'include',
      headers: {
        connection: "keep-alive"
      }
    })
現在、「proxyOptions.onProxyReq」の使用には制限があることに注意してください。「onProxyReq」を「keep-alive」と一緒に使うと、サーバがクラッシュする可能性があります。カスタム ミドルウェアを追加することで、プロキシする前のリクエストを変更して、プロキシしたい値を含むようにすることができます:
server.use((req, res, next) => {
  // ここに動的ヘッダーを設定します
  next();
});
詳細については、以下のリンク先を参照してください: