如何让apache和nodejs部署在同一个服务器上?

发布于 2021-02-03  118 次阅读


最近用node写了一些服务,并且这些服务只能部署在80或者443端口。但是我的服务器已经安装了LAMP服务,因此80(HTTP)和443(HTTPS)都被占用了(并且CDN也不支持自定义端口)。

因此只能用Vhost+反向代理来解决(其实我觉得理论上不需要Vhost的二级域名,直接在一级域名反向代理就可以,但是尝试后没有成功,具体原因未知)。听说nginx前端分发比apache方便,没有尝试,因此不太清楚。

虚拟主机Vhost设置

首先在主配置文件httpd.conf中注释掉,即引入虚拟主机配置。

Include conf/extra/httpd-vhosts.conf

不同的根据安装情况不同,apache配置文件的路径不同,但是统一的入口是apache/conf/extra 下的 httpd-vhosts.conf文件。

并在虚拟主机配置文件中加入:

<VirtualHost *:80>
  DocumentRoot "" #网站根目录的位置
  ServerName API.test.com    #你想要的自定义域名,在我们当前情境下应该是你要开放給nodejs服务API的二级域名
  DirectoryIndex index.php
  <Directory />

</Directory>
</VirtualHost>

至此我们虚拟主机的配置就已经完成了。

反向代理的设置

首先在httpd配置文件中加入下面的module。

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

再在对应虚拟主机(API二级域名所在的虚拟主机)位置的配置文件中加入如下内容:

   <Proxy *>
    Require all granted  
   </Proxy>
   <Location />#此处则表示所有指向该二级域名的请求都会转发给目的端口
    ProxyPass  http://127.0.0.1:3000/ #为nodejs的默认端口,要根据实际情况设置
    ProxyPassReverse  http://127.0.0.1:3000/
  </Location> 

注意在location标签处的URL参数“/example”和“/example2/”是不一样的。apache的官方文档中有相关解释。

In the example below, where no trailing slash is used, requests to /private1, /private1/ and /private1/file.txt will have the enclosed directives applied, but /private1other would not.

<Location "/private1">
    #  ...
</Location>

In the example below, where a trailing slash is used, requests to /private2/ and /private2/file.txt will have the enclosed directives applied, but /private2 and /private2other would not.

<Location "/private2/">
    # ...
</Location>

也就是说不用“/”号闭合的,选择更大些,在不指定路径下某一文件访问时,可以不用再来个“/”进行闭合。

当路径仅有一个“/”则是一种把配置部署在整个虚拟主机的很便捷的方式。

这时候,再重启apache,就可以看到反向代理已经完成,80端口收到消息后会将其分发给目标端口。


你好哇!欢迎来到雷公马碎碎念的地方:)