nginx配置

反向代理:代理服务器代表目标服务器接受客户端请求,并将请求转发给目标服务器,再将响应返回给客户端。

正向代理:代理服务器代表客户端发送请求,获取目标服务器的响应并返回给客户端。当用户发送一个HTTP请求时,Nginx不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在的服务器的磁盘或内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。

!!!反向代理代理的是服务器,正向代理代理的是客户端。

负载均衡的基本配置

upstream

语法:upstream name{......};

upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}
server {
    location / {
            proxy_pass http://backend;
    }
}

server

语法:server name[parameters];

server指定一台上游服务器的名字,该名字可以是域名、ip地址端口、UNIX句柄等,后面可跟参数:

.weight=number:设置向这台上游服务器转发的权重,默认是1。

.max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游服务器不可用。max_fail默认为1,如果设置为0,表示不检查失败次数。

.fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后认为上游服务器暂时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关。默认为10s。

.down:表示所有的上游服务器永久下线,只在使用ip_hash配置项时才有用。

.backup:在使用ip_hash配置项时它是无效的。表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
}

ip_hash

ip_hash是某个用户的请求始终落在固定的一台上游服务器上。它根据用户端的ip计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中,这样确保了同一个客户端的请求只会转发到指定的上游服务器中。

ip_hash与weight(权重)配置不可同时使用。如果upstream中一台服务器不能使用时,不能直接删除,而是使用down标识,来确保转发策略的一惯性。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}

反向代理的基本配置

proxy_pass

语法:proxy_pass URL;

将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址+端口。

location / {
     proxy_pass http://localhost:8000/uri
}

默认情况下反向代理是不会转发请求中的Host头部的,如需转发需加上配置:proxy_set_header Host $host;

proxy_method

表示转发时的协议方法名。

proxy_method POST;

proxy_hide_header

Nginx将上游服务器的响应转发给客户端,但默认不会转发:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP头部字段不能被转发。

proxy_pass_header

与proxy_hide_header功能相反,将原来禁止转发的header设置为允许转发。

proxy_pass_request_body

表示确定是否向上游服务器发送HTTP包体部分。

proxy_pass_request_headers

作用为确定是否转发HTTP头部

proxy_redirect

当上游服务器返回的响应是重定向或刷新(如301或302)请求时,proxy_redirect可以重设http头部的location或refresh字段。

proxy_redirect http://localhost:8000/two/  http://frontendone;

上述代码如果上游服务器返回302,location字段的URL是http://localhost:8000/two/some/uri/ 转发给客户端的location就是:http://frontendonesome/uri/

.replacement:可以省略replacement参数中的主机名部分,此时会用虚拟主机名称来填充。

.off:将使location或refresh字段维持不变。

.default:按照proxy_pass配置项和所属的location配置项重组发往客户端的location头部。

location one {
  proxy_pass http://upstream:port/two/;
  proxy_redirect default;
}
location one {
  proxy_pass http://upstream:port/two/;
  proxy_redirect http://upstream:port/two/one;
}

上述两种配置效果一样。

proxy_next_upstream

表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。

proxy_next_upstream参数则说明在哪些情况下会继续选择下一台上游服务器转发请求:

.error:当向上游服务器发起连接、发送请求、读取响应时出错。

.timeout:发送请求或读取响应时发生超时。

.invalid_header:上游服务器发送的响应是不合法的。

.http_500:上游服务器返回的响应码是500。

.http_502:上游服务器返回的响应码是502。

.http_503:上游服务器返回的响应码是503。

.http_504:上游服务器返回的响应码是504。

·http_404:上游服务器返回的HTTP响应码是404。

.off:关闭proxy_next_upstream功能-出错就选择另一台上游服务器再次转发。

nginx反向代理配置:

  

    upstream backend1 {
        server 10.10.10.1:6000;
    }
    upstream backend2 {
        server 10.10.10.1:8000;
    }
    

 server {
        listen       37955;
 
        location / {
            root   D:/Nginx/test;
            index  index.html index.htm;
        }
  
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        
        # 配置API服务的反向代理
        location /api/ {
            #rewrite ^/api/(.*)$ /$1 break;
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            proxy_pass http://backend1;
        }
        
         # 配置API服务的反向代理
        location /api2/ {
            #rewrite ^/api2/(.*)$ /$1 break;
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            proxy_pass http://backend2;
        }
        

        location /system/login {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            proxy_pass http://127.0.0.1:8080/server/user/login;
                

        }

    }

rewrite

Nginx的rewrite规则主要用于重写URL请求。

"^/api/(.*)$" 是一个正则表达式,匹配所有以"/api/"开头的URL。

"/api/user/login" 会被重写为 "/user/login"。

"/api/user/logout" 会被重写为 "/user/logout"。

"/$1" 是重写后的URL。

"break" 表示重写结束。

server {
    # 对外暴露 80 端口
    listen    80;
    server_name 192.168.10.231;
 
    # 后端API地址暴露为:http://192.168.10.231/apis
    location /apis {
        proxy_pass   http://127.0.0.1:8000/;
        proxy_pass_request_headers      on;
          # 重写URL 去除apis
        rewrite "^/apis/(.*)$" /$1 break;
    }
 
}

这里的rewrite 就是为了去除URL中的/apis,实际的后端api中是没有这个参数的,但是为了做到在Nginx转发请求,前端需要加上这个参数,以便于区别

比如前端的请求地址是 http://192.168.10.231/apis/user

经过Nginx转发后请求的地址是 http://127.0.0.1:8000/user

rewrite “^/api/(.)”/1 break,路径重写:

(1)"^/api/(.)$":匹配路径的正则表达式,用了分组语法就是*(.)**,把/api/以后的所有部分当做1组;
(2)/$1:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始,也就是api),即/api/后面的所有。这样新的路径就是除去/api/以外的所有,就达到了去除/api前缀的目的

break:指令,常用的有2个,分别是:last、break;

(1)last:重写路径结束后,将得到的路径重新进行一次路径匹配;
(2)break:重写路径结束后,不再重新匹配路径。

redirect和permanent区别

location ~ ^/imooc { 
    rewrite ^/imooc http://www.imooc.com/ redirect;
} 

location ~ ^/wali {
    rewrite ^/wali http://www.imooc.com/ permanent;
}

redirect会返回带有302代码的临时重定向,permanent会返回带有301代码的永久重定向。

假设我们在页面上访问url是http://walidream.com/imooc,根据nginx匹配规则会匹配到第一个location,会重写url,返回一个带有302状态代码,重写后的url是http://www.imooc.com,浏览器会重定向到这个网址,
当我们再次访问http://walidream.com/imooc,nginx还是会先匹配再替换然后重定向。

如果在页面上输入http://walidream.com/wali,根据nginx匹配规则会匹配到第二个location,会重写url,返回一个带有301状态码,重写后的url是http://www.imooc.com,浏览器会重新定向到这个网址,
当我们再次访问http://walidream.com/wali,这个时候浏览器根本不会在经过nginx,而是直接有浏览器重定向到这个网址。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值