nginx域名转发

Posted 程序员丁某人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx域名转发相关的知识,希望对你有一定的参考价值。

场景1:因服务器限制,所以只对外开放了一个端口,但是需要请求不同的外网环境,所以在中转服务器上用nginx做了一次转发

实现:

server {
  listen   8051;
  server_name localhost;
  
  location /license/ {
            proxy_pass http://xxx.xxx.xxx.xxx:8058/;
  }
  
  location / {
            proxy_pass http://xxx.xxx.xxx.xxx:8051/; 
}
}

特别注意:

  域名转发的地址,proxy_pass后面必须跟"/",否则会造成转发不正常

  在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;
  如果没有/,表示相对路径,把匹配的路径部分也给代理走。

  假设下面四种情况分别用 http://192.168.1.1/proxy/aerchi.html 进行访问。

  第一种:

    location /proxy/ {
        proxy_pass http://127.0.0.1/;
    } 
    代理到URL:http://127.0.0.1/aerchi.html

  第二种(相对于第一种,最后少一个 / )

    location /proxy/ {
        proxy_pass http://127.0.0.1;
    }
    代理到URL:http://127.0.0.1/proxy/aerchi.html

  第三种:

    location /proxy/ {
        proxy_pass http://127.0.0.1/aaa/;
    }
    代理到URL:http://127.0.0.1/aaa/aerchi.html

  第四种(相对于第三种,最后少一个 / )  

    location /proxy/ {
      proxy_pass http://127.0.0.1/aaa;
    }

    代理到URL:http://127.0.0.1/aaaaerchi.html
原文链接:https://blog.csdn.net/aerchi/java/article/details/84968106

 

场景2:因业务需要,一套前段代码需要映射到两个后台地址上,所以需要在接口上进行区分转发,同时转发时需要把区分标志去掉

实现:

server {
    listen   0.0.0.0:8204;
    server_name  localhost;
    # 静态页面目录
    root      E:xxxxxxx;
    # 默认首页
    index      /index.html;
    proxy_set_header Host  $http_host;             
    proxy_set_header X-Real-IP $remote_addr;             
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #proxy_cookie_path /* /*;
    client_max_body_size    100m;
        
    location ~*/wx/(.*) {//根绝接口是否包含/wx/来区分
          # 动态页面,交给tomcat处理
          if ( !-e $request_filename) {
        proxy_pass       http://127.0.0.1:8091/$1;/转到后台时需要把/wx去掉
          }
    }
  location / {
    # 用户浏览器端的缓存设置
    location ~* .(css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)$ {
      expires -1;
      if (-f $request_filename) {
        break;
      }
    }
    # 动态页面,交给tomcat处理
    if ( !-e $request_filename) {
      proxy_pass       http://127.0.0.1:8092;
    #proxy_cookie_path /* /*;
    }
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

特别注意:

  1、 proxy_set_header Host $http_host;
  不改变请求头 。
  2、proxy_set_header Host host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用 host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,使用host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用host变量它 的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名;
  3、proxy_set_header Host host: host:host:proxy_port;
  服务器名可以和后端服务器的端口一起传送:
  4、如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
  proxy_set_header Accept-Encoding “”;
  5、用户真实的ip地址转发给后端服务器
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Real-IP $remote_addr;
  原文链接:https://blog.csdn.net/Sw_Pro/java/article/details/99679534

 

场景3:前段代码用vue实现,vue没有具体的页面,也是通过/xx/xx来访问资源,这时候需要与后台接口进行区分

实现:

  可以通过特殊字符类似“#”来区分,携带#的请求默认是静态资源

location ~* .(#|css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)$ {
  expires -1;
  if (-f $request_filename) {
    break;
  }
}

 

场景4:因服务器限制,数据库访问需要nginx进行转发

实现:

stream {
    upstream cloudsocket {
       hash $remote_addr consistent;
       server 数据库实际ip:3306 weight=5 max_fails=3 fail_timeout=30s;
    }
 
 server {
       listen 127.0.0.1:8058;//本机代理端口
       proxy_connect_timeout 10s;
       proxy_timeout 300s;#设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。
       proxy_pass cloudsocket;
    }

}

特别注意:

stream与http同级,所以不要放到http里 

以上是关于nginx域名转发的主要内容,如果未能解决你的问题,请参考以下文章

nginx做域名转发和uri转发

nginx 多域名转发

nginx 配置域名转发

Nginx配置以及域名转发

nginx域名转发

基于域名的Nginx TCP转发