使用nginx反向代理发布多个域名80端口的WEB服务

8 篇文章 0 订阅

在对外提供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的配置内容如下所示:

复制代码
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/;
  }
 }
复制代码

      这段配置的意思是访问www.aaa.com或者aaa.com的请求,会被nginx映射到http://www.aaa.con:8087/proj1/;而访问www.bbb.com或者bbb.com的请求,会被映射到http://www.aaa.con:8087/proj2/。多配置location /proj1/的原因是避免CSS/JS等在html中设置了项目名路径的资源因为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.     }  

原因如下:

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不被重写的失误。
 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值