最近学了node.js,再部署时需要与tomcat共同占用一个端口,在网上搜了一下相关资料,发现可以用反向代理解决。于是就尝试了下Apache和Nginx这两个最常用的web服务器,具体介绍就不说了,这里就说说关于反向代理的配置。


Apache的配置简单,但是却有个小细节需要注意(这地方坑了我1个多小时……)。

最开始,我直接修改最下面<VirtualHost *:80>标签,并且把它copy了一下,分别对应Tomcat和Node.js,结果运行时总是报错,后面copy的配置不起作用。

在网上查了半天,发现需要这样改:把 “NameVirtualHost *:80”的注释去掉,为每个虚拟主机新建一个配置文件,并在下面引入 “Include conf/vhosts/node.conf”,这里需要注意的是路径要从httpd的根路径开始写起,而不是配置文件的相对路径。配置文件就比较简单了:

<VirtualHost *:80>
  ServerAdmin webmaster@fun.akkz.net
  ServerName fun.akkz.net               #访问服务的域名
  ErrorLog logs/fun.akkz.net-error_log
  CustomLog logs/fun.akkz.net-access_log common
  ProxyPass / http://localhost:300/    #反向代理的配置,将“/”路径下的所有请求都转发到“http://localhost:300”这个地址上
  ProxyPassReverse / http://localhost:300/  #可加可不加,加了过后服务器如果发了重定向的请求,那么这个地址会被apache反向解析成代理前的地址
</VirtualHost>

VirtualHost后面的 * 不要修改,貌似这个是用于多个Ip的主机的,改了后访问不了。

需要注意的是转发到的地址一定一定要写上“/”,否则,子路径的请求就变成“http:// localhost:300style” 这样子了,然后就会报502错误。

补充:经过最近几次的配置,我发现有一点遗漏。在apache2.4中,默认的vhost必须为httpd.conf中配置服务的复制版本。这里有一点需要注意,在httpd.conf中必须配置一个能包括所有vhost所在目录的<Directory “……”>,并设置权限,否则访问会报403错误(其实改默认的就行)。这里的路径其实不必与默认的vhost一致,只是放所有网站的根路径,具体每个网站的路径在vhost中配置(因此可以确定,访问默认配置就是访问默认的vhost,而不是Directory中配置的路径)。


Nginx的配置选项则多了许多,不过也很简单。直接copy下default.conf改就可以了,下面是配置命令(有几个server就写几个)。

server {
  listen       80;   #监听端口(有多个server的话设置成一样也没有关系,server_name不同就可以了。但是“default_server”只能配置一个。
  server_name  domain.com; #访问这个server的域名
  location / {
    proxy_pass http://localhost:300;     #反向代理的服务器地址,一样,可以写localhost
    proxy_set_header   Host    $host;    #这里就是重要的地方了(apache可能也有,但是搜了半天没搜到),介绍在下面。
    proxy_set_header   X-Real-IP   $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

这里最后三条配置是设置转发的html的报头。如果后端服务器只运行一个host的话,那么就没有影响,但是如果是类似于tomcat这样,运行了多个host,并且需要域名来区分的话,就必须加上这个参数了,否则后端的tomcat会全部按照localhost处理(要不然就再写几个server……)

ok,总结就到这里,顺便附上我看的几个有价值的链接:

apache:http://www.tuicool.com/articles/ANR3Ib

nginx:http://www.tuicool.com/articles/ANR3Ib