我正在使用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
节点包。
我的问题是:
我更喜欢使用现有的节点模块,而不是重新发明轮子。
答案 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 ,请执行以下步骤:
C:\
(或C:\Program Files\
如果您愿意,但更新所有配置以将默认C:\apache24
更改为C:\Program Files\
)C:\Apache24
)。httpd.exe
并处理任何错误消息(注意端口80必须是空闲的,因此请停止在该报告上运行的任何其他内容)。httpd.exe -install
来安装Apache作为服务。要添加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.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中的默认设置非常差),但默认设置现在可以使用。我在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/
注意:我与该示例的作者没有任何关系