static createHttpServer (app, host, port, listenCb) {
    let server;

    if (ArkimeConfig.get('keyFile') && ArkimeConfig.get('certFile')) {
      const keyFileData = fs.readFileSync(ArkimeConfig.get('keyFile'));
      const certFileData = fs.readFileSync(ArkimeConfig.get('certFile'));

      // watch the cert and key files
      fs.watch(ArkimeConfig.get('keyFile'), { persistent: false }, ArkimeUtil.#watchHttpsFile);
      fs.watch(ArkimeConfig.get('certFile'), { persistent: false }, ArkimeUtil.#watchHttpsFile);

      if (ArkimeConfig.debug > 1) {
        console.log('Watching cert and key files. If either is changed, the server will be updated with the new files.');
      }

      server = ArkimeUtil.#httpsServer = https.createServer({
        key: keyFileData,
        cert: certFileData,
        secureOptions: crypto.constants.SSL_OP_NO_TLSv1
      }, app);
    } else {
      server = http.createServer(app);
    }

    server
      .on('error', (e) => {
        console.log("ERROR - couldn't listen on host %s port %d is %s already running?", host, port, path.basename(process.argv[1]));
        process.exit(1);
      })
      .on('listening', (e) => {
        console.log('%s listening on host %s port %d in %s mode', process.argv[1], server.address().address, server.address().port, app.settings.env);
      })
      .listen({ port, host }, listenCb);

    // If root drop priv when dropGroup or dropUser set
    if (process.getuid() === 0) {
      const group = ArkimeConfig.get('dropGroup', null);
      if (group !== null) {
        process.setgid(group);
      }

      const user = ArkimeConfig.get('dropUser', null);
      if (user !== null) {
        process.setuid(user);
      }
    }

    return server;
  }
Create HTTP/HTTPS Server, load cert if HTTPS, listen, drop priv