apache和nodejs共享80怎么设置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache和nodejs共享80怎么设置?相关的知识,希望对你有一定的参考价值。

现在nodejs比较流行,可我以前的服务器端程序用别的语言写的,
我不想改了,想要混着用。

127.0.0.1是apache默认的80端口,是以前的老程序
127.0.0.1/nodejs 是 3000端口,是nodejs的程序

127.0.0.1/old/hello.svr 是调用老程序
127.0.0.1/nodejs/hello.svr 是调用nodejs的3000端口

求怎样设置,谢谢

反向代理 参考技术A 就用apache占80端口,node用其他端口,在apache设置反向代理 参考技术B nginx代理,proxy_pass追问

我想访问http://localhost/direct:80 转给 http://localhost:3000 怎么做?

参考技术C 没有程序能这么做,只能用转发实现

Apache 上 NodeJS Express 的 HTTP2 设置引发错误

【中文标题】Apache 上 NodeJS Express 的 HTTP2 设置引发错误【英文标题】:HTTP2 setup for NodeJS Express on Apache throws Error 【发布时间】:2021-01-29 16:44:13 【问题描述】:

我在为通过 Apache 服务器提供的 NodeJS v12.19.0/Express 应用程序设置 HTTP2 时遇到问题。

我启用了 mod http2 & proxy_http2 并安装了 npm http2

bin/www 如下所示:

var app = require('../app');
var debug = require('debug')('production:server');
var http = require('http2');

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

var server = http.createServer(app);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

function normalizePort(val) 
var port = parseInt(val, 10);
if (isNaN(port)) 
    return val;

if (port >= 0) 
    return port;

return false;


function onError(error) 
if (error.syscall !== 'listen') 
    throw error;


var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;
switch (error.code) 
    case 'EACCES':
    console.error(bind + ' requires elevated privileges');
    process.exit(1);
    break;
    case 'EADDRINUSE':
    console.error(bind + ' is already in use');
    process.exit(1);
    break;
    default:
    throw error;



function onListening() 
var addr = server.address();
var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
debug('Listening on ' + bind);

Apache 站点配置:

<VirtualHost *:443>

    Protocols h2 http/1.1

    ServerName domain.com
    ProxyRequests On
    #ProxyPass / http://localhost:3000/
    #ProxyPassReverse / http://localhost:3000/

    ProxyPass / h2://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

    SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

没有线条

ProxyPass / h2://localhost:3000/
ProxyPassReverse / http://localhost:3000/

我明白了:

代理错误

代理服务器收到来自上游服务器的无效响应。 代理服务器无法处理请求

原因:从远程服务器读取错误

Apache/2.4.41 (Ubuntu) 服务器位于 domain.com 端口 443

如果我包含这些行,我会得到:

内部服务器错误

服务器遇到内部错误或配置错误,并且 无法完成您的请求。

请联系 [no address given] 的服务器管理员以 告知他们此错误发生的时间,以及您采取的措施 在此错误之前执行。

有关此错误的更多信息可能在服务器错误中可用 日志。 domain.com 端口 443 上的 Apache/2.4.41 (Ubuntu) 服务器

感谢您的帮助..

【问题讨论】:

【参考方案1】:

您正在尝试通过 HTTP/2 通过 HTTPS (h2) 从 Apache 连接到 Node,但从您的 Node 代码看来,您正在使用 TLS 证书,所以我猜它只是一个 HTTP /2 通过 HTTP 服务器 (h2c)。

所以替换这些行:

ProxyPass / h2://localhost:3000/
ProxyPassReverse / http://localhost:3000/

有了这个:

ProxyPass / h2c://localhost:3000/
ProxyPassReverse / http://localhost:3000/

它应该通过 HTTP/2 连接。

但是我会质疑它的价值。 Mod_proxy_http2 是 still marked as experimental 和 the value of backend HTTP/2 connections is very much in question。如果您希望使用 HTTP/2 在 Node 中进行试验,那么您不应该直接连接而不是通过 Apache 连接吗?

【讨论】:

仍然遇到 502 和 503 错误。我也开始认为 express 并不真正支持 http2 模块。我发现的大多数示例都是针对已弃用的 spdy。我通过 Apache 连接,因为无论如何我已经为我的 Nextcloud 运行了它。我没有太多的节点部署经验,我认为它有点像烧瓶,如果我可以从完整的 http 服务器功能中受益。

以上是关于apache和nodejs共享80怎么设置?的主要内容,如果未能解决你的问题,请参考以下文章

apache服务器只开80端口怎么设置?求大神指教!!!

只有一个主机和独立ip,iis和php怎样共享80端口。

WIN7 wamp 怎么同时安装 Xampp,不同时启动,不同端口,都无法启动Xampp的apache,80端口未占用

Centos 6 怎么开启apache ipv4的80端口?

windows 下安装nodejs 和npm 要怎么设置,类似环境变量这一类

xampp的apache端口被系统占用了怎么半