• 技术文章 >运维 >Nginx

    nginx添加第三方模块

    VV2020-10-26 16:23:30转载745

    目的:

    添加第三方编写的插件,以nginx-sticky-module为例,以下简称 sticky

    通过 /usr/local/nginx/sbin/nginx -V 查看nginx已安装的模块

    (推荐教程:nginx教程

    sticky模块与Ip_hash都是与负载均衡算法相关,但又有差别,差别是:

    1、ip hash,根据客户端的IP,将请求分配到不同的服务器上

    2、sticky,根据服务器给客户端的cookie,客户端再次请求时会带上此cookie,nginx会把有此cookie的请求转发到颁发cookie的服务器上

    注意:在一个局域网内有3台电脑,他们有3个内网IP,但是他们发起请求时,却只有一个外网IP,是电信运营商分配在他们连接那个路由器上的,如果使用 ip_hash 方式,则Nginx会将请求分配到不同上游服务器,如果使用 sticky 模块,则会把请求分配到办法cookie的服务器上,实现:内网nat用户的均衡。这是iphash无法做到的

    Sticky工作原理:

    Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route :

    1、客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。

    2、后端服务器处理完请求,将响应数据返回给nginx。

    3、此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值

    4、客户端接收请求,并保存带route的cookie。

    5、当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器。

    Sticky官网地址

    官方地址:

    https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src

    下载地址:

    wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz

    Nginx安装Sticky模块

    #1.下载的文件上传,解压
    tar -xvzf nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar
    
    #2.重命名为nginx-sticky-module
    mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 /usr/local/nginx-sticky-module
    
    #3.进入nginx源码目录进行编译
    ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-sticky-module --with-http_stub_status_module --with-http_ssl_module 
    
    #4.安装
     1.停止nginx后进行安装:make && make install
     2.在线更新安装: make upgrade

    这样就安装完了,通过 ./sbin/nginx -V 查看编译参数,可看到sticky模块已被编译进nginx

    [root@bogon nginx]# ./sbin/nginx -V
    nginx version: nginx/1.16.0
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/usr/local/nginx --add-module=/usr/local/nginx-sticky-module --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module

    修改nginx.conf,启用 sticky 功能

    upstream zyi {
        #使用sticky,不设置expires则浏览器关闭时结束会话
        sticky domain=zy.csxiuneng.com path=/;
        server localhost:9001;
    }
    
    server {
         listen       80;
         server_name  zy.csxiuneng.com;
         access_log  logs/zy.access.log  main;
         location / {
            
             proxy_pass http://zyi;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $host;
             client_max_body_size 10m;
             client_body_buffer_size 256k;
             proxy_connect_timeout 90;
             proxy_send_timeout 90;
             proxy_buffer_size 4k;
             proxy_buffers 4 32k;
         }

    sticky 语法:

    sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] 
           [hash=index|md5|sha1] [no_fallback] [secure] [httponly];
        [name=route]       设置用来记录会话的cookie名称
        [domain=.foo.bar]    设置cookie作用的域名
        [path=/]          设置cookie作用的URL路径,默认根目录
        [expires=1h]        设置cookie的生存期,默认不设置,浏览器关闭即失效
        [hash=index|md5|sha1]   设置cookie中服务器的标识是用明文还是使用md5值,默认使用md5
        [no_fallback]       设置该项,当sticky的后端机器挂了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不转发到其他服务器,不建议设置
        [secure]          设置启用安全的cookie,需要HTTPS支持
        [httponly]         允许cookie不通过JS泄漏,没用过

    重启Nginx:./sbin/nginx -s reload

    访问:zy.csxiuneng.com ,可以看到cookies中有一项为route

    71b0664931fe1576e96980673d97dfa.png

    注意点:

    1.同一客户端,如果启动时同时发起多个请求,有可能落在不同的后端服务器上
    2.由于cookie最初由服务器端下发,如果客户端禁用cookie,则cookie不会生效。
    3.客户端可能不带cookie ,Android客户端发送请求时,一般不会带上所有的cookie,需要明确指定哪些cookie会带上。如果希望用sticky做负载均衡,请对Android开发说加上cookie。
    4.cookie名称不要和业务使用的cookie重名。Sticky默认的cookie名称是route,可以改成任何值
    5.客户端发的第一个请求是不带cookie的。服务器下发的cookie,在客户端下一次请求时才能生效。
    6.Nginx sticky模块不能与ip_hash同时使用

    如果要添加多个第三方模块,使用多个 --add-module 指令:

    ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-sticky-module/ --add-module=/usr/local/nginx-http-concat-1.2.2/

    以上就是nginx添加第三方模块的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:nginx 第三方模块
    上一篇:编译过的nginx如何添加新模块 下一篇:利用nginx实现301跳转到https的根域名
    线上培训班

    相关文章推荐

    • 在Python中使用第三方模块的教程• nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况• python第三方模块有哪些• linux内核的五大模块分别是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网