创建基于NodeJS的Web服务器以利用Windows平台上的HTTP2

时间:2017-07-09 15:16:42

标签: javascript node.js webserver http2

我正在使用Windows 2012服务器,并希望在基于nodejs的Web服务器上托管一些静态HTML / CSS / JS /图像文件。我不想将IIS用作I want to take advantages of HTTP2 & want to push files from server to client。我查看了Using node.js as a simple web server,其中讨论了如何创建基于节点的Web服务器。另一种选择是使用http-server节点包。

我的问题是:

  1. 这些解决方案已有两年多的历史了。我们现在有更好的选择吗?
  2. 这两个选项中是否有任何一个支持HTTP2?
  3. 我更喜欢使用现有的节点模块,而不是重新发明轮子。

3 个答案:

答案 0 :(得分:1)

您可以尝试NGINX,它可以支持HTTP / 2。 http://nginx.org/en/docs/windows.html

使用默认节点nodemon,pm2运行节点应用程序... 然后使用NGINX作为静态Web服务器,您可以反向代理您的节点应用程序。

答案 1 :(得分:0)

如果您想使用Node,那么本文似乎涵盖了基础知识:https://webapplog.com/http2-server-push-node-express/并且似​​乎node-spdy模块是最佳选择(它包括对HTTP / 2的支持,尽管名称)。有一个node-http2模块,但它似乎维护得不够好doesn't support Express(Node最流行的HTTP框架)。

但是,正如评论中所讨论的,虽然不是您提出的问题,但我建议在NodeJS或任何其他传统后端服务器前运行传统的Web服务器(例如Apache,Nginx或IIS)。虽然NodeJS非常灵活,并且可以添加网络服务器的大多数(如果不是全部)功能,但传统的Web服务器开箱即用,具有很多功能,只需要配置而不是编程和/或拉入多个其他模块可以正确设置。

对于仅提供静态文件节点对我来说似乎是错误的解决方案所以,对于我的其余部分,我将讨论由于上面给出的原因而不是直接使用Node,而是使用前端网络服务器。

我不太了解IIS,但是从快速的谷歌看来,HTTP / 2似乎只在IIS 10中引入,据我所知,甚至IIS 10 doesn't support Push except through API calls所以我同意你的决定暂时使用它。

可以按照建议安装Nginx而不是IIS,虽然它支持HTTP / 2但它还不支持HTTP / 2(尽管Cloudflare have added it并且在Nginx上运行,所以想象它赢了'好久不见了。)

Apache完全支持HTTP / 2,包括服务器推送。 Packaged windows versions of Apache can be downloaded from Apache Lounge所以这可能是支持Windows Server上HTTP / 2推送的最简单方法,也是我对你所提供方案的推荐。

虽然我主要在Linux机器上使用Apache,但我在Windows上有很多服务器并且非常乐意在服务器上运行Apache(所以它会在服务器重启时自动重启)没有问题所以不确定是什么"糟糕的经历"你之前有过,但对我来说真的很稳定。

要在Windows服务器上设置Apache ,请执行以下步骤:

  1. Apache Lounge
  2. 下载最新版本
  3. 解压缩文件并将其保存到C:\(或C:\Program Files\如果您愿意,但更新所有配置以将默认C:\apache24更改为C:\Program Files\
  4. 编辑conf \ httpd.conf文件以检查ServerRoot,DocumentRoot,并将所有目录值设置为您希望的值(默认为C:\Apache24)。
  5. 以管理员身份运行DOS->命令提示符
  6. 在Apache CD位置和bin控制器的管理员CD中。
  7. 运行httpd.exe并处理任何错误消息(注意端口80必须是空闲的,因此请停止在该报告上运行的任何其他内容)。
  8. 检查您是否获得默认值"它有效!" http://localhost/
  9. 上的消息
  10. 通过终止httpd.exe进程并运行httpd.exe -install来安装Apache作为服务。
  11. 启动Apache24服务并再次验证您是否正常运行!" http://localhost/
  12. 上的消息

    要添加HTTP / 2和HTTPS (所有浏览器都需要HTTP / 2),请从httpd.conf取消注释以下行:

     LoadModule http2_module modules/mod_http2.so
     ...
     LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
     ...
     LoadModule ssl_module modules/mod_ssl.so
     ...
     Include conf/extra/httpd-ssl.conf
    

    将证书和密钥安装到conf/server.crtconf/server.key - 注意Apache 2.4要求证书文件包含证书以及X509 Base 64 DER格式的任何中间证书,因此在打开时应该看起来像这样在文本编辑器中:

    -----BEGIN CERTIFICATE-----
    MII...etc.
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MII...etc.
    -----END CERTIFICATE-----
    

    如果第一个证书是服务器证书,第二个证书和后续证书是中间人。

    您应确保自己运行良好的HTTPS配置(Apache中的默认设置非常差),但默认设置现在可以使用。我在here上发布了一篇博文。

    在服务菜单中重新启动Apache,并检查您是否可以访问https://localhost(假设您的证书不包含本地主机,则忽略任何证书错误)。

    将HTTP / 2添加到Apache

    修改conf/extra/httpd-ssl.conf文件,在顶部附近添加以下内容(例如在Listen 443行之后):

    Protocols h2 http/1.1
    

    在服务菜单中重新启动Apache并检查您是否可以访问https://localhost(忽略任何证书错误,假设您的证书不涵盖localhost),您应该在Web浏览器的开发人员工具中看到h2作为协议。< / p>

    要在Apache中使用HTTP / 2推送,请添加以下内容以推送样式表:

    Header add Link "</path/to/css/styles.css>;rel=preload;as=style" env=!cssloaded
    

    你应该看到它在开发者工具中推送到你的页面。如果您想了解更多相关信息,我还是blog post on that

    如果您确实想要为某些(或所有)呼叫使用Node,可以取消注释conf / httpd.conf中的以下行:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    

    然后添加以下配置:

    ProxyPass /nodecontent http://127.0.0.1:8000/
    

    将把任何这些请求发送到在端口8000上运行的节点服务。重新启动以获取此配置。

    如果您的节点服务添加了这样的任何HTTP标头:

    link:</path/to/style/styles.css>;rel=preload;as=style
    

    然后Apache应该拿起它们并推送它们。例如,如果使用Express,您可以使用以下方法设置标题:

    app.get('/test/', function (req, res) {
      res.header('link','</path/to/style.css>;rel=preload;as=style');
      res.send('This is a test page which also uses Apache to push a CSS file!\n');
    });
    

    最后,关于HTTP / 2推送的主题,本文包含了许多有趣的思考:https://jakearchibald.com/2017/h2-push-tougher-than-i-thought/

答案 2 :(得分:0)

我知道这是一个相当古老的问题,但我想我会回答那些来这里寻找信息的人。

Node现在有一个原生的http2模块,网上有一些例子可以准确显示如何实现静态Web服务器。

注意:在此回答时,节点9.6.1是最新的,本机模块仍然是实验性的

示例https://dexecure.com/blog/how-to-create-http2-static-file-server-nodejs-with-examples/

注意:我与该示例的作者没有任何关系