Nginx 负载服务

下载安装

1.将nginx放到yum repro库中
[root@localhost ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.查看nginx信息
[root@localhost ~]# yum info nginx

3.使用yum安装ngnix
[root@localhost ~]# yum install nginx

4.启动nginx
[root@localhost ~]# service nginx start

5.查看nginx版本
[root@localhost ~]# nginx -v

6.平滑重启
[root@localhost ~]# service nginx reload

7.停止服务
[root@localhost ~]# service nginx stop

8.重启服务
[root@localhost ~]# service nginx restart

 

常用命令:

启动操作 nginx -c /etc/nginx/conf/nginx.conf
平滑重启(修改文件后) /etc/nginx/sbin/nginx -s reload 
校验配置文件 nginx -t -c /etc/nginx/conf/nginx.conf 

 

基础配置


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log  /var/log/nginx/error.log warn;

pid        /home/www/nginx/logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    client_max_body_size 100m; #允许客户端请求的最大单文件字节数

    client_body_buffer_size 2048k; #缓冲区代理缓冲用户端请求的最大字节数,
    fastcgi_buffer_size 1024k; 
    fastcgi_buffers 6 256k; 
    fastcgi_busy_buffers_size 1024k; 

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream backend  {
        ip_hash;
        server 120.76.223.240:80 fail_timeout=60s ;
        server 120.76.207.13:80 fail_timeout=60s ;
        check interval=3000 rise=2 fall=2 timeout=1000;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;


        location /node {
            check_status;
            access_log   on;
            #allow SOME.IP.ADD.RESS;
            #deny all;
        } 

        location /jobwisdom {
            proxy_pass http://backend ;
            proxy_redirect  off;
            proxy_next_upstream error timeout invalid_header http_404;

            proxy_connect_timeout 2s; #后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_read_timeout 30s;  #后端服务器处理请求的时间
            
            #nginx反向代理配置时,一般会添加下面的配置:

            proxy_set_header Host $host;  
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header REMOTE-HOST $remote_addr;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  

            #weight:轮询权值也是可以用在ip_hash的,默认值为1
            #max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
            #fail_timeout:有两层含义,一是在 30s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,30s时间内不分配请求到这台服务器。
            #backup:备份机器。当其他所有的非backup机器出现故障的时候,才会请求backup机器
            #max_conns: 限制同时连接到某台后端服务器的连接数,默认为0即无限制。因为queue指令是commercial,所以还是保持默认吧。
            #proxy_next_upstream:这个指令属于 http_proxy 模块的,指定后端返回什么样的异常响应时,使用另一个realserver
        }

		location / {
            root   html;
            index  index.html;
        }
 
    }

}

 

Http core 模块

        http 配置的意义

           http就是指配置关于http服务的地方,server等都是http的子模块

        server 配置和匹配规则

           一个http服务可以有多个server,而对server的路径匹配,反向代理都是在这里配置的,在server中最重要的一项配置:server_name的配置。server_name决定了来了一个url,到底是哪个server处理该请求。nginx会依次找和url配置的第一次出现的server。server_name可以使用通配符,也可以使用正则表达式。而且一个server的server_name可以多个,以空格分隔。更详细的关于server_name匹配规则,参看这里

        location 配置和匹配规则

         server_name是定义域名级别的规则,而location则是url中文件部分的规则的。适应例如会对图片等静态资源做单独处理等需求。

  • 负载均衡

    • 使用upstream模块实现nginx负载均衡
      使用nginx_upstream_check_module模块实现后端服务器的健康检查
      使用nginx-sticky-module扩展模块实现Cookie会话黏贴(session-sticky效果)
      使用proxy模块实现静态文件缓存
      使用ngx_cache_purge实现更强大的缓存清除功能
    • 轮询(默认) : 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
      ip_hash : 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。当然如果这个节点不可用了,会发到下个节点,而此时没有session同步的话就注销掉了。
      least_conn : 请求被发送到当前活跃连接最少的realserver上。会考虑weight的值。
      url_hash : 此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装nginx 的hash软件包 nginx_upstream_hash 。
      fair : 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块。
    • 一个ip_hash的配置简单实例
      upstream backend {
          ip_hash;
          server 192.168.1.225:8080 weight 2;
          server 192.168.1.226:8080 weight=1 max_fails=2 fail_timeout=30s ;
          server 192.168.1.227:8080 backup;
      }
      server {
          location / {
              proxy_pass http://backend;
              proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
          }
      }

       

    • upstream 参数用法解析

      weight:轮询权值也是可以用在ip_hash的,默认值为1
      max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
      fail_timeout:有两层含义,一是在 30s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,30s时间内不分配请求到这台服务器。
      backup:备份机器。当其他所有的非backup机器出现故障的时候,才会请求backup机器
      max_conns: 限制同时连接到某台后端服务器的连接数,默认为0即无限制。因为queue指令是commercial,所以还是保持默认吧。
      proxy_next_upstream这个指令属于 http_proxy 模块的,指定后端返回什么样的异常响应时,使用另一个realserver
    • proxy_next_upstream 参数中用法解析

                   其中的timeout参数值的是在读取或者发送数据中的超时时间,下面几种参数都在这个范围;

                  proxy_connect_timeout ##后端服务器连接的超时时间_发起握手等候响应超时时间

                  proxy_read_timeout ##连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

                  proxy_send_timeout ##后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

            也就是说,当上面几种超时时间触发后,会触发 proxy_next_upstream 模块的超时时间,进而进行下一个reflover的回话跳转操作。

负载后,地址及其客户端程序问题

      nginx反向代理配置时,一般会添加下面的配置:  
      proxy_set_header Host $host;  
      proxy_set_header X-Real-IP $remote_addr;  
      proxy_set_header REMOTE-HOST $remote_addr;  
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  

《实战nginx》的书,作者张晏,这本书上有这么一段话“经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:
proxy_set_header            X-real-ip $remote_addr;
其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:
request.getAttribute("X-real-ip")

  • proxy_set_header    X-real-ip $remote_addr;

        这句话之前已经解释过,有了这句就可以在web服务器端获得用户的真实ip

        但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

  • proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

        我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute("X-Forwarded-For")获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

  • proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

        意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip。

  • $proxy_add_x_forwarded_for又是什么?

        $proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

在第一台nginx中,使用 proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用 proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header            X-Forwarded-For $http_x_forwarded_for时会发现,web服务器端使用request.getAttribute("X-Forwarded-For")获得的值是null。如果想要通过request.getAttribute("X-Forwarded-For")获得用户ip,就必须先使用proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;这样就可以获得用户真实ip。

 

更多配置请参照 http://www.ha97.com/5194.html

        

            

转载于:https://my.oschina.net/gaoguofan/blog/893294

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值