10,Nginx可以做什么

https://www.jianshu.com/p/1b94ee4de98d
本文只针对Nginx 在不加载第三方模块的情况下能处理那些事情,由于第三方模块太多所以也介绍不完整,

12197462-3eb7880ca49ec44b.jpg
timg.jpg

Nginx能做什么
-------------反向代理
------------负载均衡
-------------HTTP服务器(动静分离)
------------正向代理

以上就是我了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做。
反向代理
反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上的链接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上的连接的客户端,此时代理服务器对外表现为一个反向代理服务器。简单的说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然可能是同一台服务器,端口不同而已。
下面贴一段简单的实现反向代理的代码:

server{
   listen   80;
server_name  localhost; #反向代理
client_max_body_size  102M;
location / {
   proxy_pass  http://localhost:8080/hellohtml; #反向代理
 proxy_set_header  Host $host:$server_port;

}

}

保存完配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问 http://localhost:8080/hellohtml 了。

负载均衡

负载均衡也是nginx常用的一个功能,负载均衡其意思是分摊到多个操作单元上进行执行,例如Web服务器,FTP服务器,企业关键应用服务器和其他关键任务服务器等,从而共同完成工作任务。一句话就是当有2台或以上的服务器时候,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而NGINX目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
1、RR(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

简单配置

12197462-21f6a9361d5898d1.png
7564501-0d67f23a21ae99bd.png

负载均衡的核心代码为

12197462-f352e0bad24e331b.png
2.png
upstream test{ #test很关键,相当于取的别名

server localhost:8080;


server localhost:8081;

}


server{

listen           80;
server_name          localhost; #反向代理
client_max_body_size            1024M;

location / {

          proxy_pass http://test/index; #反向代理  ,调用test的别名
  proxy_set_header  Host $host:$server_port;

}
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值.error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
}

端口为:8081
端口为:8080
。。。

这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。

2,权重
指定轮训几率,weight 和访问比率成正比,用于后端服务器性能不均的情况
例如:

12197462-acb1eee7487c8247.png
3.png

upstream test{

  server  localhost:8080 weight=9
server     localhost:8081 weight=1;

}


server{

listen           80;
server_name          localhost; #反向代理
client_max_body_size            1024M;

location / {

          proxy_pass http://test/index; #反向代理  ,调用test的别名
  proxy_set_header  Host $host:$server_port;

}
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
}


那么10次一般只会有1次会访问到8081,而有9次访问到8080
3,ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能会分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream test{
  ip_hash;
server  localhost:8080;
 server localhost:8081;
}
server{

listen           80;
server_name          localhost; #反向代理
client_max_body_size            1024M;

location / {

          proxy_pass http://test/index; #反向代理  ,调用test的别名
  proxy_set_header  Host $host:$server_port;

}
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
}

4,fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend{
fair;
server localhost:8080;
server localhost:8081;

}


server{

listen           80;
server_name          localhost; #反向代理
client_max_body_size            1024M;

location / {

          proxy_pass http://backend/index; #反向代理  ,调用test的别名
  proxy_set_header  Host $host:$server_port;

}
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
}

5,url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到容一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method使用的hash算法。

upstream backend{
    hash  $ request_uri;
     hash_method   crc32;
     server  localhost:8080;
      server   localhost:8081;

}
server{

listen           80;
server_name          localhost; #反向代理
client_max_body_size            1024M;

location / {

          proxy_pass http://backend/index; #反向代理  ,调用test的别名
  proxy_set_header  Host $host:$server_port;

}
proxy_connect_timeout 1;   #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on;  #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_next_upstream timeout;  #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
}

以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择适用那种策略模式,不过fair和url_hash需要安装第三方模块才能适用,由于本文介绍nginx能做到事,所以Nginx安装第三方模块不会再本文介绍

HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,j就可以通过Nginx来实现,首先看看Nginx做静态资源服务器。


12197462-67028a1d40448045.jpg
1.jpg
server{
    listen   80;
server_name  localhost;
client_max_body_size  1024M;

location  / {
  root  D:\wwwroot;
   index  index.html;
}

}

如果要访问 D:\wwwroot\index.html 时,只需要访问 localhost 就可以了,这里注意和下面的 root 和 alias 进行一个区分, 如果一个网站只是静态页面的话就可以通过这种方式进行部署。

server {

        listen      88;

        server_name  localhost;



        location / {

          alias D:/data/roulette/upload/;

        }

#error_page 404 /404.html;



        error_page  500 502 503 504  /50x.html;

     location = /50x.html {

            root  html;

        }



    }



访问D:/data/roulette/upload/的 1.png 静态图片,直接 访问,http://localhost:88/1.png就可以; 访问D:/data/roulette/upload/的index.html页面时: 直接访问: http://localhost:88/index.html 页面了,

12197462-82c91a45df53a16a.jpg
timg.jpg

动静分离

动静分离是让动态网站里的动态网页根据一定的规则把不变的资源好经常变的资源区分开来,动静资源做好了拆分以后,我们可以根据静态资源的特点将其做缓存操作,这就是网站静态处理的核心思路。

upstream test{
         server   localhost:8080;
        server   localhost:8081;
}
server{
       listen    80;
      server_name   localhost;
    location / {
          root   e:\wwwroot;
          index    index.html;
}
  #所有静态请求都由nginx处理,存放目录为html
 location ~\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
             root  e:\wwwroot;
}
#所有动态请求都转发给tomcat处理
location ~\.(jsp|do)${
       proxy_pass   http://test;
}
error_page   500  502  503 504 /50x.html;
location =/50x.html{
     root  e:\wwwroot;
}

}


这样我们就可以把html以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了。只要搞清楚了最基本的流程,很多配置就简单了,另外location后面其实是一个正则表达式,所以非常灵活。

正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理。

        resolver 114.114.114.11 8.8.8.8;
  server  {
          resolver_timeout 5s;
           listen  81;
          access_log   e:\wwwroot\proxy.access.log;
          error_log    e:\wwwroot\proxy.error.log;
 locaion / {
         proxy_pass   http://$host$request_uri;
}    
}

resolver是配置正向代理的DNS服务器。listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。

猜你喜欢

转载自blog.csdn.net/weixin_33690367/article/details/86958262