在对外提供WEB页面服务时,提供的域名通常需要隐藏端口号和项目名,例如像www.baidu.com。隐藏端口容易处理,将WEB容器的端口号修改为80即可满足。如果要隐藏项目的名称,在tomcat下,可以通过在server.xml中加入以下语句,在不输入项目名的情况下,自动进入www.abc.com/websit对应的web服务。


<Context path="" docBase="/usr/local/tomcat/webapps/website" />


      另外如果想在一台服务器上部署多个WEB服务,也可以采用这种方式,并结合tomcat虚拟主机配置实现。

  虚拟主机在本文中不再赘述,这里要讲是使用nginx来实现该功能。

      这种场景下的解决方案是利用nginx的反向代理功能,通过配置nginx,可以将访问80端口、单域名不同的请求映射到WEB容器上不同的项目上,甚至WEB容器的端口号都可以不设置为80,因为常常nginx和WEB容器部署到同一台服务器上,这是80端口必须分配给nginx才能监听到不到端口域名的访问。nginx的配置内容如下所示:


nginx域名 ip端口映射 nginx映射多个端口_请求头



server {
    listen       80;
        server_name  www.aaa.con aaa.con;
        location / {
         proxy_pass   http://www.aaa.con:8087/proj1/;
        }
     location /proj1/ {
         proxy_pass   http://www.aaa.con:8087/proj1/;
    }
}
server {
  listen 80; 
  server_name www.bbb.con bbb.con; 
  location / { 
    proxy_pass http://www.aaa.con:8087/proj2/;
  }

  location /proj2/ {
    proxy_pass http://www.aaa.con:8087/proj2/;
}
 }



nginx域名 ip端口映射 nginx映射多个端口_请求头



      这样,我们就能够在一台机器上发布针对若干个域名的WEB服务了。

注:有些应用必须设置proxy_set_header属性,否则无法正常使用(比如使用dwr框架的javaee应用),示例:

1. server {  
2.     listen       80;  
3.     server_name  *.a.com;  
4.     location / {  
5.         proxy_pass http://localhost:8080/projectA/;  
6.         proxy_set_header   Host    $host;  
7.         proxy_set_header   X-Real-IP   $remote_addr;  
8.         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
9.     }  
10. }


原因如下:


nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。         Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。         同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头: proxy_set_header Host $http_host; proxy_set_header X-Forward-For $remote_addr; 这里的$http_host和$remote_addr都是nginx的导出变量,可以再配置文件中直接使用。如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。