Javascript 在windows平台上创建基于NodeJS的web服务器以利用HTTP2
我正在使用windows 2012 server,希望在基于nodejs的web服务器上托管一些静态HTML/CSS/JS/image文件。我不想将IIS用作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
我想利用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');
});