Javascript 在windows平台上创建基于NodeJS的web服务器以利用HTTP2

Javascript 在windows平台上创建基于NodeJS的web服务器以利用HTTP2,javascript,node.js,webserver,http2,Javascript,Node.js,Webserver,Http2,我正在使用windows 2012 server,希望在基于nodejs的web服务器上托管一些静态HTML/CSS/JS/image文件。我不想将IIS用作我想利用HTTP2&想将文件从服务器推送到客户端。我看了关于如何创建基于节点的Web服务器的讨论。另一个选项是使用httpservernode包 我的问题是: 这些解决方案已经有两年多的历史了。我们现在有更好的选择吗 这两个选项中是否有一个支持HTTP2 我更喜欢使用现有的节点模块,而不是重新设计轮子 你可以试试NGINX,它可以支持HTT

我正在使用windows 2012 server,希望在基于nodejs的web服务器上托管一些静态HTML/CSS/JS/image文件。我不想将IIS用作
我想利用HTTP2&想将文件从服务器推送到客户端
。我看了关于如何创建基于节点的Web服务器的讨论。另一个选项是使用
httpserver
node包

我的问题是:

  • 这些解决方案已经有两年多的历史了。我们现在有更好的选择吗
  • 这两个选项中是否有一个支持HTTP2

  • 我更喜欢使用现有的节点模块,而不是重新设计轮子

    你可以试试NGINX,它可以支持HTTP/2

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

    如果您想使用node,那么本文似乎涵盖了基础知识:而且模块似乎是最佳选择(尽管名称不同,但它包括对HTTP/2的支持)。有一个模块,但它似乎维护得不太好,而且是最流行的HTTP节点框架

    但是,正如在评论中所讨论的,虽然不是您所问的问题,但我建议在NodeJ或任何其他传统后端服务器之前运行传统web服务器(如Apache、Nginx或IIS)。虽然NodeJS非常灵活,web服务器的大部分(如果不是全部的话)功能都可以添加到NodeJS中,但传统的web服务器具有很多功能,只需要配置,而不是编程和/或引入多个其他模块来正确设置

    对于我来说,仅仅提供静态文件节点似乎是错误的解决方案,因此,对于我的回答的其余部分,我将讨论不直接使用节点,而是使用前端Web服务器

    我不太了解IIS,但从谷歌上看,HTTP/2似乎只是在IIS10中引入的,据我所知,即使如此,我还是同意你现在不使用它的决定

    正如建议的那样,可以安装Nginx而不是IIS,虽然它支持HTTP/2,但它还不支持HTTP/2(尽管它在Nginx上运行,所以想象一下它不会很长时间)

    Apache完全支持HTTP/2,包括服务器推送。因此,这可能是在Windows Server上支持HTTP/2推送的最简单方法,也是我对您给出的场景的建议

    虽然我主要在Linux机器上使用Apache,但我在Windows上有许多服务器,并且非常高兴地将Apache作为一项服务运行(因此它会在服务器重新启动时自动重新启动),没有任何问题,所以不确定您以前有过什么“糟糕的体验”,但它对我来说确实非常稳定

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

  • 从下载最新版本
  • 解压文件并将其保存到
    C:\
    (或者
    C:\Program files\
    ,如果您愿意,只需更新所有配置即可将默认的
    C:\apache24
    更改为
    C:\Program files\
  • 编辑conf\httpd.conf文件以检查ServerRoot、DocumentRoot和任何目录值是否设置为所需的位置(
    C:\Apache24
    默认设置)
  • 以管理员身份运行DOS->命令提示符
  • 在Administrator CD中,指向Apache位置和bin控制器
  • 运行
    httpd.exe
    并处理任何错误消息(注意端口80必须是空闲的,因此停止该报告上运行的任何其他内容)
  • 检查是否在屏幕上显示默认的“It works!”消息
  • 通过终止httpd.exe进程并运行
    httpd.exe-Install
    ,将Apache作为服务安装
  • 启动Apache24服务,并再次验证您是否在上收到“It works!”消息
  • 要添加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
    
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    
    将证书和密钥安装到
    conf/server.crt
    conf/server.key
    -注意,Apache 2.4希望证书文件包括证书以及X509 Base 64 DER格式的任何中间证书,因此在文本编辑器中打开时应该是这样的:

    -----BEGIN CERTIFICATE-----
    MII...etc.
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MII...etc.
    -----END CERTIFICATE-----
    
    其中,第一个证书是服务器证书,第二个证书和后续证书是中间人

    您应该确保您运行的是良好的HTTPS配置(Apache中的默认设置非常差),但是默认设置现在就可以了。我有一篇关于这个的博客文章

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

    向Apache添加HTTP/2

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

    在服务菜单中重新启动Apache,并检查是否可以访问
    https://localhost
    (假设您的证书不包括本地主机,则忽略任何证书错误),您应该在web浏览器的开发人员工具中将h2视为协议

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

    Header add Link "</path/to/css/styles.css>;rel=preload;as=style" env=!cssloaded
    
    然后添加以下配置:

    ProxyPass /nodecontent http://127.0.0.1:8000/
    
    它将向端口8000上运行的节点服务发送这些请求中的任何一个。重新启动以获取此配置

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

    link:</path/to/style/styles.css>;rel=preload;as=style
    
    链接:;rel=预载;as=风格
    
    然后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');
    });
    
    app.get('/test/',函数(req,res){
    res.header('link',';rel=preload;as=style');
    res.send('这是一个测试页面,它还使用Apache推送CSS文件!\n');
    });
    

    最后,关于HTTP/2推送的主题,这篇文章包含了许多有趣的思考内容:

    我知道这是一个相当古老的问题,但我想我会回答这个问题
    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');
    });