Nginx反向代理/负载均衡

1. Nginx 介绍

在这里插入图片描述
  • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,

  • Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
    作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

  • 作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

  • Nginx一般用户七层负载均衡,其吞吐量有一定的限制。为了提高整体的吞吐量,会在DNS和Nginx之间引入LVS(软件负载均衡器)、F5(硬负载均衡器) 可以做四层负载均衡,首先DNS解析到LVS(F5),让后LVS(F5)转发给Nginx,在有Nginx转发给真实的服务器

2. Linux安装Nginx

  1. 安装依赖包
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  1. 下载解压nginx安装包
//创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
//下载tar包
wget http://nginx.org/download/nginx-1.6.3.tar.gz
tar -xvf nginx-1.6.3.tar.gz
  1. 安装nginx
//进入nginx目录
cd /usr/local/nginx
//进入目录
cd nginx-1.6.3
//执行命令
./configure
//执行make命令
make
//执行make install命令
make install
  1. 启动nginx
/usr/local/nginx/sbin/nginx -s reload

如果出现报错:nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed

则运行: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

3. Nginx应用场景

  1. http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
  2. 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
  3. 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
  4. nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

4. Nginx目录结构

执行命令 tree /application/nginx ;如果tree命令找不到就执行 yum install tree -y安装

 yum install tree -y
[root@vm10-0-0-128 local]# tree nginx/
nginx/
├── client_body_temp
├── conf    #这是Nginx所有配置文件的目录,极其重要
│   ├── fastcgi.conf       #fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default    #fastcgi.conf的原始备份
│   ├── fastcgi_params
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf     #这是Nginx默认的主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp        #fastcgi临时数据目录
├── html                #这是编译安装时Nginx的默认站点目录  nginx首页与错误页面
│   ├── 50x.html
│   └── index.html
├── logs                #这是Nginx默认的日志路径,包括错误日志及访问日志
│   ├── access.log      #这是Nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站用户访问情况信息
│   ├── error.log       #这是Nginx的错误日志文件,如果Nginx出现启动故障等问题,一定要看看这个错误日志
│   └── nginx.pid       #Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp          #临时目录
├── sbin                #这是Nginx命令的目录,如Nginx的启动命令nginx
│   └── nginx
├── scgi_temp           #临时目录
└── uwsgi_temp          #临时目录


5. Nginx主配置文件nginx.conf

#user  nobody;                       #定义Nginx运行的用户和用户组
worker_processes  1;                 #nginx进程数,建议设置为等于CPU总核心数。
#error_log  logs/error.log;          #全局错误日志定义类型,
#error_log  logs/error.log  notice;  #进程文件        
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;       #单个进程最大连接数(最大连接数=连接数*进程数)
}

 #HTTP区块开始 核心区域
http {
    include       mime.types;        #Nginx支持的媒体类型库文件
    default_type  application/octet-stream;   #默认媒体类型
    #client_header_buffer_size 32k;               #上传文件大小限制
    large_client_header_buffers 4 64k;             #设定请求缓存值

    sendfile        on;   #开启高效文件传输模式,s
    #tcp_nopush     on;   #防止网络阻塞
    #tcp_nodelay on;              #防止网络阻塞

    #keepalive_timeout  0;
    keepalive_timeout  65;    #连接超时,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    #gzip  on;    #开启gzip压缩输出
 
    #虚拟主机的配置
    server {
        listen       8080;         #监听端口
        server_name  localhost;    #提供服务的域名主机名
        
  # location的作用
  # location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
  # 1. =开头表示精确匹配
  # 2. ^~ 开头表示uri以某个常规字符串开头
  # 3. ~ 开头表示区分大小写的正则匹配;
  # 4. ~* 开头表示不区分大小写的正则匹配
  # 5. / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

        location /{               # 对 /进行反向代理
            root   html;           #站点的根目录
            index  index.html index.htm;       #默认的首页文件
            try_files $uri $uri/ /index.html;
            proxy_set_header X-Real-IP $remote_addr;  #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            #以下是一些反向代理的配置,可选
            proxy_set_header Host $host;
            client_max_body_size 10m;      #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;    #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;        #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;         #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;         #proxy_buffers缓冲区,网页平均在32k以下的设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        }
        location  /i5n/ {
            proxy_pass http://127.0.0.1:8080/i5n/;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        # 错误页面 可以自定义自己都页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

}

6. 基于虚拟主机配置域名

    #当客户端访问www.yanxiaolong.cn,监听端口号为80,直接跳转到data/www目录下文件
    server {
        listen       80;
        server_name  www.yanxiaolong.cn;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }
    #当客户端访问blog.yanxiaolong.cn,监听端口号为80,直接跳转到data/blow目录下文件
     server {
        listen       80;
        server_name  blog.itmayiedu.com;
        location / {
            root   data/blog;
            index  index.html index.htm;
        }
    }

7. 基于虚拟主机配置域名

#当客户端访问www.yanxiaolong.cn,监听端口号为8080,直接跳转到data/www目录下文件
     server {
        listen       8080;
        server_name  www.yanxiaolong.cn;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }
    
    #当客户端访问blog.yanxiaolong.cn,监听端口号为8081,直接跳转到data/blog目录下文件
     server {
        listen       8081;
        server_name  blog.yanxiaolong.cn;
        location / {
            root   data/blog;
            index  index.html index.htm;
        }
    }

8. Nginx配置反向代理

  • 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
  • 反向代理的好处隐藏真实内部ip地址,请求先访问nginx代理服务器(外网可以访问到),在使用nginx服务器转发到真实服务器中。

配置:

#当客户端访问api.yanxiaolong.cn,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
           proxy_pass http://127.0.0.1:8080;  
        }
}
#当客户端访问api2.yanxiaolong.cn,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8081
    server {
        listen       80;
        server_name  api2.yanxiaolong.cn;
        location / {
            proxy_pass http://127.0.0.1:8081;
        }
    }


9. Nginx配置负载均衡

  • Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。
  • 当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。

负载均衡算法

  1. 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

  2. weight(轮询权值)
    weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

  3. ip_hash
    每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。俗称IP绑定。

  4. fair(第三方) 需要使用外部扩展
    比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块。

  5. url_hash(第三方) 需要使用外部扩展
    按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

轮询 :

upstream  backServer{
    server 127.0.0.1:8080;  
    server 127.0.0.1:8081;
    }
    
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
        # 指定上游服务器负载均衡服务器
         proxy_pass http://backServer;
        }
    }

加权轮询 :

upstream  backServer{
    server 127.0.0.1:8080 wight = 1;  
    server 127.0.0.1:8081 wight = 2;
    }
    
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
        # 指定上游服务器负载均衡服务器
         proxy_pass http://backServer;
        }
    }

IP绑定ip_hash

upstream  backServer{
        server 127.0.0.1:8080 ;
        server 192.168.10.225:8081 max_fails=3 fail_timeout=15;
        ip_hash; 
    }
    
    server {
        listen       80;
        server_name  api.yanxiaolong.cn;
        location / {
            # 指定上游服务器负载均衡服务器
            proxy_pass http://backServer;
        }
    }

10. Nginx配置故障转移

  • 当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
upstream  backServer{
    server 127.0.0.1:8080 wight = 1;  
    server 127.0.0.1:8081 wight = 2;
    }

server {
        listen       80;
        server_name  www.itmayiedu.com;
        location / {
            ### 指定上游服务器负载均衡服务器
            proxy_pass http://backServer;
            #nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_connect_timeout 20s;
            #nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_send_timeout 20s;
            ### nginx接受上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 20s;
        }
    }

补充:nginx rewrite

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。

Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。
通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

Rewrite全局变量:

变量 说明
$args 存放了请求url中的请求指令。比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的arg1=value1&arg2=value2
$content_length 存放请求头中的Content-length字段
$content_type 存放了请求头中的Content-type字段
$document_root 存放了针对当前请求的根路径
$document_uri 请求中的uri,不包含请求指令 ,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的/server/source$host $1
$host 存放了请求url中的主机字段,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2中的www.myweb.name。如果请求中的主机部分字段不可用或者为空,则存放nginx配置中该server块中server_name指令的配置值
$http_cookie cookie
$limit_rate nginx配置中limit_rate指令的配置值
$remote_addr 客户端的地址
$remote_port 客户端与服务器端建立连接的端口号
$remote_user 变量中存放了客户端的用户名
$request_body_file 存放了发给后端服务器的本地文件资源的名称
$request_method 存放了客户端的请求方式,如get,post等
$request_filename 存放当前请求的资源文件的路径名
$query_string $args含义相同
$scheme 客户端请求使用的协议,如http,https,ftp等
$server_protocol 客户端请求协议的版本,如”HTTP/1.0”,”HTTP/1.1”
$server_addr 服务器的地址
$server_name 客户端请求到达的服务器的名称

判断IP地址来源


server {
      listen 80;
      server_name www.yanxiaolong,cn;
      location / {
        # 如果不是白名单则 显示403 禁止访问
       if  ($remote_addr = 192.168.5.166) {  
         return 403;  
     }  
      
}

限制浏览器访问

server {
      listen 80;
      server_name www.yanxiaolong,cn;
      location / {
       ## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
      if ($http_user_agent ~ Chrome) {   
         return 500;  
        } 
      
}

Nginx1.9开始支持tcp层的转发,通过stream实现的

### 修改为TCP模块
tcp {
   
   ### 定义多个上游服务器
   upstream  backServer{
      ### 定义TCP模块上游服务器
      server 192.168.5.165:80001;
      server 192.168.5.165:80002;
   }
    server {
        listen       9999;
        server_name  api.yanxiaolong.cn;
        ### 反向代理upstream
        proxy_pass backServer;
    }
}

个人博客地址:http://blog.yanxiaolong.cn/

你可能感兴趣的:(Nginx反向代理/负载均衡)