最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Windows 安装 Nginx

业界 admin 11浏览 0评论

Nginx下载
nginx documentation

Nginx 是一个高性能的网页服务器,能够反向代理HTTP、HTTPS、SMTP、POP3、IMAP的协议链接,也可以作为一个负载均衡器和 HTTP 缓存。是一个免费、开源、高性能的 HTTP 服务器
Nginx在官方测试的结果中,能够支持五万个平行连接,而在实际的运作中可以支持二万至四万个平行链接。

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

Nginx 反向代理
Nginx 负载均衡
Nginx 动静分离
Nginx 高可用集群

1、失效转移:单个失效可以自动转移,再启动是可以管理的;
对于 http GET 请求,当这个请求转发到上游服务器发生断路,或者读取响应超时则会将同样的请求转发到其他上游服务器来处理,如果所有服务器都超时或者断路,则会返回 502 或者 504 错误。
对于 http POST 请求,当这个请求转发到上游服务器发生断路,则会将请求转发到其他上游服务器来处理,但是如果这个请求发生了读取超时,则不会做失效转移,会返回 504 错误,Nginx 之所以这么做应该是为了防止同一个请求发送两次,比如涉及到银行的充值等操作就会发生很严重的 bug。
2、新增:不能发现【新增】的上游服务器,需要修改配置,重启Nginx;
3、健康检查:被动健康检查和主动健康检查
ngx_http_proxy_module模块
ngx_http_upstream_module模块
nginx_upstream_check_module模块
ngx_http_healthcheck_module模块

4、基本语法

location [=|~|~*|^~|@] /uri/ { … }
【=】 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
【~】 表示区分大小写匹配
【~*】 表示不区分大小写匹配
【^~】 表示只匹配字符串,不查询正则表达式。
【@】 指定一个命名的location,一般只用于内部重定向请求。

5、全局变量

$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

#允许客户端请求的最大的单个文件字节数
client_max_body_size 10m; 
#缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 600;
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队等候处理
proxy_read_timeout 600;
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 600;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffer_size 8k;
#同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间
proxy_buffers 4 32k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_busy_buffers_size 64k;
#proxy缓存临时文件的大小
proxy_temp_file_write_size 64k;

1、下载Nginx
下载后解压,解压后如下【最好不要有中文路径】

2、检查80端口是否被占用
Nginx的配置文件是conf目录下的nginx.conf,默认配置的Nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可;
检查80端口是否被占用【netstat -ano | findstr 0.0.0.0:80】或【netstat -ano | findstr "80"】;

3、启动Nginx
1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过;
2)打开cmd命令窗口,切换到nginx解压目录下,输入命令

--方式1
nginx.exe

--方式2
start nginx

4、重启Nginx

nginx.exe -s reopen

5、停止

--快速停止nginx,不保存相关信息
nginx.exe -s stop
或
--完整有序的停止nginx,保存相关信息
nginx.exe -s quit

6、重新加载

nginx.exe -s reload

7、检查Nginx是否启动成功
直接在浏览器地址栏输入网址 http://localhost:80,回车,出现以下页面说明启动成功


8、反向代理
Nginx location配置 
/:表示通用匹配,任何请求都会匹配到
=:表示精确匹配;
^~:表示uri以某个常规字符串开头,理解为匹配url路径即可(非正则);
~: 与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分大小写;
!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分大小写
!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分大小写

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;
    
    server {
        listen 71;
        server_name  localhost;

        location / {
            proxy_pass http://localhost:8066;
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip  
            root   html;
            index  index.html index.htm;
        }

        # 匹配以 /abc 开头
        location /abc {
            proxy_pass http://localhost:8066;
        }

        # 会根据请求路径不同进行分发到不同的服务上
        location ~ /edu/ {
            proxy_pass  http://127.0.0.1:8080
        }

        # 会根据请求路径不同进行分发到不同的服务上
        location ~ /vod/ {
            proxy_pass  http://127.0.0.1:8081
        }

        # 访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件
        location /img/ {
            root /var/www/image;
        }
    }
}

9、反向代理【轮询】

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;
    
    upstream mysvr {
      server 127.0.0.1:8067;
      server 127.0.0.1:8068;
      server 127.0.0.1:8069;
    }
    
    server {
        listen *:72;
        server_name  192.168.3.2;

        location / {
            proxy_pass http://mysvr;
            proxy_set_header Host $host;
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip
            root   html;
            index  index.html index.htm;
        }
    }
}

10、反向代理【权重】

worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;
    
    upstream mysvr {
      server 127.0.0.1:8067 weight=1 max_conns=1000; #权重/最大连接数
      server 127.0.0.1:8068 weight=2;
      server 127.0.0.1:8069 weight=3;
      #server 127.0.0.1:8069 max_fails=3 fail_timeout=20s;
      #server 127.0.0.1:8069 backup;  #热备
      #fair;
    }
    
    server {
        listen *:72;
        server_name  192.168.3.2;

        location / {
            proxy_pass http://mysvr;
            proxy_set_header Host $host;
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip
            root   html;
            index  index.html index.htm;
        }
    }
}

11、负载均衡策略
1、轮询(自带)
每一个客户端请求按时间顺序轮流分配到不同的服务器上,如果后端服务不可以用,会自动过滤掉

upstream my_test_server {
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

2、weight(自带):权重
指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例;

upstream my_test_server {
  server 192.168.0.100:8080 weight=1;
  server 192.168.0.101:8080 weight=2;
  server 192.168.0.102:8080 weight=3;
}

3、ip_hash(自带):依据ip分配方式
将每个客户端请求按照访问ip的hash结果进行分配,这种方式可以保证同一个用户会固定访问一个后端服务器。
优点:可以保证session会话,解决服务器之间session不能共享的问题。

upstream my_test_server {
  ip_hash;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

4、least_conn(自带):依据最少连接方式
将请求转发给连接数较少的后端服务器。每个后端服务器配置可能不同,处理的请求也有可能不同,对于处理的请求有快有慢,least_conn是根据后端服务器的连接情况,动态的选择连接数量较少的一台服务器来处理当前的请求。

upstream my_test_server {
  least_conn;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

5、fair(第三方):响应时间方式
按照服务器端的响应时间来分配请求,响应时间短的服务器优先分配。第三方的负载均衡策略需要安装第三方的插件。

upstream my_test_server {
  fair;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

6、url_hash(第三方):依据url分配方式
是根据url的hash结果进行分配请求,每一个url会固定到同一个服务器上,配合缓存使用,可以减少不必要的下载和资源时间的浪费。每次同一个url请求到达同一个服务器上,第一次加载后放入缓存,后面再次请求,直接取缓存资源。如果不采用url_hash,可能会导致请求到达不同的服务器,资源出现重新加载的情况。第三方的负载均衡策略需要安装第三方的插件。
upstream my_test_server {
  hash $request_uri;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

12、Nginx 缓存
1、缓存文件放在哪儿?
2、如何指定哪些请求被缓存?
3、缓存的有效期是多久?
4、如何指定哪些请求不被缓存?

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    #指定缓存位置、缓存名称、内存中缓存内容元数据信息大小限制、缓存总大小限制。缓存位置是一个目录应该先创建好,nginx并不会帮我们创建这个缓存目录
    proxy_cache_path /data/nginx/cache  keys_zone=one:10m  max_size=10g;
    
    server {
        listen *:72;
        #指定使用前面设置的缓存名称
        proxy_cache  one;

        location / {
            proxy_pass http://mysvr;
            proxy_set_header Host $host;
            proxy_cache_key "$host$request_uri$cookie_user";
            proxy_cache_valid 200 302 10m;
            proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
        }
    }
}

13、nginx + consul + ocelot,创建consul模板文件【nginx.ctmpl】

upstream ocelot {
    #动态去consul读取,注意服务名称,"apigateway", 这个名称是注册到consul时所用的 service name
    {{range service "apigateway"}}
    server {{ .Address }}:{{ .Port }};
    {{ end }}
}
    
server {
    listen *:72;
    location / {
        proxy_pass http://ocelot;
        proxy_set_header Host $host;
        deny 127.0.0.1;  #拒绝的ip
        allow 172.18.5.54; #允许的ip
        root   html;
        index  index.html index.htm;
    }
}

14、负载均衡 LVS 和 Nginx 和 Haproxy 对比
LVS 4层(tcp)负载均衡,转发,DR模式为主要场景
优点:数据包返回可以不经过LB,因此高效,几十万并发
缺点:需要配置RS,所以部署复杂,功能单一。

Nginx 7层,负载均衡(反向代理),1.9以后支持4层
缺点:效率不太高,1-5万并发,数据包来去都要经过负载均衡器
优点:简单,方便,不需要配置RS,支持基于URL,扩展名等的调度功能,可以做web和cache

Haproxy 同时支持4层和7层
缺点:效率不太高,1-5万并发,数据包来去都要经过负载均衡器。不为人熟知
优点:支持4层和7层。

15、Nginx 健康检查
1、被动健康检查
向服务器转发请求失败,或者没有接收到响应,nginx就认为其不可用,会停止一段时间不再向其转发默认规则是,如果失败了一次,就停止转发10秒钟失败次数和停发时间是可以设定的,例如

upstream backend {                
    server backend1.example;
    server backend2.example max_fails=3 fail_timeout=30s;
    server backend3.example max_fails=2;
}

max_fails:允许失败的次数,超出后就认为不可用;
fail_timeout:max_fails次失败后,暂停的时间;

2、主动健康检查
Nignx 定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。
使用 health_check 指令实现,例如

    upstream backend {
        zone backend 64k;
        server backend1.example;
        ......
    }
    server {
        location / {
            proxy_pass http://backend;
            health_check;
        }
    }

注意,使用health_check的同时,也要使用zone指令,这个例子中使用了默认的健康检查规则,nginx每5秒向每台服务器发送请求"/",如果沟通失败、超时、返回状态码非2xx/3xx,就判断其不可用。

3、主动健康检查(第三方模块)
Nignx 定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。
*
*
*
*
*
*

Nginx下载
nginx documentation

Nginx 是一个高性能的网页服务器,能够反向代理HTTP、HTTPS、SMTP、POP3、IMAP的协议链接,也可以作为一个负载均衡器和 HTTP 缓存。是一个免费、开源、高性能的 HTTP 服务器
Nginx在官方测试的结果中,能够支持五万个平行连接,而在实际的运作中可以支持二万至四万个平行链接。

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

Nginx 反向代理
Nginx 负载均衡
Nginx 动静分离
Nginx 高可用集群

1、失效转移:单个失效可以自动转移,再启动是可以管理的;
对于 http GET 请求,当这个请求转发到上游服务器发生断路,或者读取响应超时则会将同样的请求转发到其他上游服务器来处理,如果所有服务器都超时或者断路,则会返回 502 或者 504 错误。
对于 http POST 请求,当这个请求转发到上游服务器发生断路,则会将请求转发到其他上游服务器来处理,但是如果这个请求发生了读取超时,则不会做失效转移,会返回 504 错误,Nginx 之所以这么做应该是为了防止同一个请求发送两次,比如涉及到银行的充值等操作就会发生很严重的 bug。
2、新增:不能发现【新增】的上游服务器,需要修改配置,重启Nginx;
3、健康检查:被动健康检查和主动健康检查
ngx_http_proxy_module模块
ngx_http_upstream_module模块
nginx_upstream_check_module模块
ngx_http_healthcheck_module模块

4、基本语法

location [=|~|~*|^~|@] /uri/ { … }
【=】 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。
【~】 表示区分大小写匹配
【~*】 表示不区分大小写匹配
【^~】 表示只匹配字符串,不查询正则表达式。
【@】 指定一个命名的location,一般只用于内部重定向请求。

5、全局变量

$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

#允许客户端请求的最大的单个文件字节数
client_max_body_size 10m; 
#缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 600;
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队等候处理
proxy_read_timeout 600;
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 600;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffer_size 8k;
#同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间
proxy_buffers 4 32k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_busy_buffers_size 64k;
#proxy缓存临时文件的大小
proxy_temp_file_write_size 64k;

1、下载Nginx
下载后解压,解压后如下【最好不要有中文路径】

2、检查80端口是否被占用
Nginx的配置文件是conf目录下的nginx.conf,默认配置的Nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可;
检查80端口是否被占用【netstat -ano | findstr 0.0.0.0:80】或【netstat -ano | findstr "80"】;

3、启动Nginx
1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过;
2)打开cmd命令窗口,切换到nginx解压目录下,输入命令

--方式1
nginx.exe

--方式2
start nginx

4、重启Nginx

nginx.exe -s reopen

5、停止

--快速停止nginx,不保存相关信息
nginx.exe -s stop
或
--完整有序的停止nginx,保存相关信息
nginx.exe -s quit

6、重新加载

nginx.exe -s reload

7、检查Nginx是否启动成功
直接在浏览器地址栏输入网址 http://localhost:80,回车,出现以下页面说明启动成功


8、反向代理
Nginx location配置 
/:表示通用匹配,任何请求都会匹配到
=:表示精确匹配;
^~:表示uri以某个常规字符串开头,理解为匹配url路径即可(非正则);
~: 与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分大小写;
!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分大小写
!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分大小写

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;
    
    server {
        listen 71;
        server_name  localhost;

        location / {
            proxy_pass http://localhost:8066;
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip  
            root   html;
            index  index.html index.htm;
        }

        # 匹配以 /abc 开头
        location /abc {
            proxy_pass http://localhost:8066;
        }

        # 会根据请求路径不同进行分发到不同的服务上
        location ~ /edu/ {
            proxy_pass  http://127.0.0.1:8080
        }

        # 会根据请求路径不同进行分发到不同的服务上
        location ~ /vod/ {
            proxy_pass  http://127.0.0.1:8081
        }

        # 访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件
        location /img/ {
            root /var/www/image;
        }
    }
}

9、反向代理【轮询】

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;
    
    upstream mysvr {
      server 127.0.0.1:8067;
      server 127.0.0.1:8068;
      server 127.0.0.1:8069;
    }
    
    server {
        listen *:72;
        server_name  192.168.3.2;

        location / {
            proxy_pass http://mysvr;
            proxy_set_header Host $host;
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip
            root   html;
            index  index.html index.htm;
        }
    }
}

10、反向代理【权重】

worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;
    
    upstream mysvr {
      server 127.0.0.1:8067 weight=1 max_conns=1000; #权重/最大连接数
      server 127.0.0.1:8068 weight=2;
      server 127.0.0.1:8069 weight=3;
      #server 127.0.0.1:8069 max_fails=3 fail_timeout=20s;
      #server 127.0.0.1:8069 backup;  #热备
      #fair;
    }
    
    server {
        listen *:72;
        server_name  192.168.3.2;

        location / {
            proxy_pass http://mysvr;
            proxy_set_header Host $host;
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip
            root   html;
            index  index.html index.htm;
        }
    }
}

11、负载均衡策略
1、轮询(自带)
每一个客户端请求按时间顺序轮流分配到不同的服务器上,如果后端服务不可以用,会自动过滤掉

upstream my_test_server {
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

2、weight(自带):权重
指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例;

upstream my_test_server {
  server 192.168.0.100:8080 weight=1;
  server 192.168.0.101:8080 weight=2;
  server 192.168.0.102:8080 weight=3;
}

3、ip_hash(自带):依据ip分配方式
将每个客户端请求按照访问ip的hash结果进行分配,这种方式可以保证同一个用户会固定访问一个后端服务器。
优点:可以保证session会话,解决服务器之间session不能共享的问题。

upstream my_test_server {
  ip_hash;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

4、least_conn(自带):依据最少连接方式
将请求转发给连接数较少的后端服务器。每个后端服务器配置可能不同,处理的请求也有可能不同,对于处理的请求有快有慢,least_conn是根据后端服务器的连接情况,动态的选择连接数量较少的一台服务器来处理当前的请求。

upstream my_test_server {
  least_conn;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

5、fair(第三方):响应时间方式
按照服务器端的响应时间来分配请求,响应时间短的服务器优先分配。第三方的负载均衡策略需要安装第三方的插件。

upstream my_test_server {
  fair;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

6、url_hash(第三方):依据url分配方式
是根据url的hash结果进行分配请求,每一个url会固定到同一个服务器上,配合缓存使用,可以减少不必要的下载和资源时间的浪费。每次同一个url请求到达同一个服务器上,第一次加载后放入缓存,后面再次请求,直接取缓存资源。如果不采用url_hash,可能会导致请求到达不同的服务器,资源出现重新加载的情况。第三方的负载均衡策略需要安装第三方的插件。
upstream my_test_server {
  hash $request_uri;
  server 192.168.0.100:8080;
  server 192.168.0.101:8080;
}

12、Nginx 缓存
1、缓存文件放在哪儿?
2、如何指定哪些请求被缓存?
3、缓存的有效期是多久?
4、如何指定哪些请求不被缓存?

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    #指定缓存位置、缓存名称、内存中缓存内容元数据信息大小限制、缓存总大小限制。缓存位置是一个目录应该先创建好,nginx并不会帮我们创建这个缓存目录
    proxy_cache_path /data/nginx/cache  keys_zone=one:10m  max_size=10g;
    
    server {
        listen *:72;
        #指定使用前面设置的缓存名称
        proxy_cache  one;

        location / {
            proxy_pass http://mysvr;
            proxy_set_header Host $host;
            proxy_cache_key "$host$request_uri$cookie_user";
            proxy_cache_valid 200 302 10m;
            proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
        }
    }
}

13、nginx + consul + ocelot,创建consul模板文件【nginx.ctmpl】

upstream ocelot {
    #动态去consul读取,注意服务名称,"apigateway", 这个名称是注册到consul时所用的 service name
    {{range service "apigateway"}}
    server {{ .Address }}:{{ .Port }};
    {{ end }}
}
    
server {
    listen *:72;
    location / {
        proxy_pass http://ocelot;
        proxy_set_header Host $host;
        deny 127.0.0.1;  #拒绝的ip
        allow 172.18.5.54; #允许的ip
        root   html;
        index  index.html index.htm;
    }
}

14、负载均衡 LVS 和 Nginx 和 Haproxy 对比
LVS 4层(tcp)负载均衡,转发,DR模式为主要场景
优点:数据包返回可以不经过LB,因此高效,几十万并发
缺点:需要配置RS,所以部署复杂,功能单一。

Nginx 7层,负载均衡(反向代理),1.9以后支持4层
缺点:效率不太高,1-5万并发,数据包来去都要经过负载均衡器
优点:简单,方便,不需要配置RS,支持基于URL,扩展名等的调度功能,可以做web和cache

Haproxy 同时支持4层和7层
缺点:效率不太高,1-5万并发,数据包来去都要经过负载均衡器。不为人熟知
优点:支持4层和7层。

15、Nginx 健康检查
1、被动健康检查
向服务器转发请求失败,或者没有接收到响应,nginx就认为其不可用,会停止一段时间不再向其转发默认规则是,如果失败了一次,就停止转发10秒钟失败次数和停发时间是可以设定的,例如

upstream backend {                
    server backend1.example;
    server backend2.example max_fails=3 fail_timeout=30s;
    server backend3.example max_fails=2;
}

max_fails:允许失败的次数,超出后就认为不可用;
fail_timeout:max_fails次失败后,暂停的时间;

2、主动健康检查
Nignx 定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。
使用 health_check 指令实现,例如

    upstream backend {
        zone backend 64k;
        server backend1.example;
        ......
    }
    server {
        location / {
            proxy_pass http://backend;
            health_check;
        }
    }

注意,使用health_check的同时,也要使用zone指令,这个例子中使用了默认的健康检查规则,nginx每5秒向每台服务器发送请求"/",如果沟通失败、超时、返回状态码非2xx/3xx,就判断其不可用。

3、主动健康检查(第三方模块)
Nignx 定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。
*
*
*
*
*
*

发布评论

评论列表 (0)

  1. 暂无评论