Ubuntu源码安装nginx(整合session_sticky模块)

Wesley13
• 阅读 971

背景

nginx作为七层负载均衡软件,负载的方式有:1.ip hash 2.轮询 3.带权重轮询 4.sticky session(粘滞session)大概这一些。 其中sticky session可以保证同一客户端请求能转发到后端固定的一台服务器上。 tengine目前已经集成了该特性,但我试验没成功。有时间再试一试。

###sticky session原理

客户端第一次请求nginx,nginx会根据轮询算法,选择一台后端服务器,然后nginx在响应头上增加Set-Cookie:route=md5, 客户端下一次请求nginx时,会带上这个route=md5,nginx会根据这个route来选择上一次请求时的后端服务器。这就保证了nginx会将同一个客户端的请求都会转交给同一后端服务器。

(client)                             (nginx)                      (upstream servers)
    >-- GET /URI1 HTTP/1.0 -----------> |
                                        | *** nginx choose one upstream by RR ***
                                        | >----- GET /URI1 HTTP/1.0   ----> |
                                        | <------- HTTP/1.0 200 OK -------< |
    <-- HTTP/1.0 200 OK --------------< |
        Set-Cookie: route=md5(upstream) |
                                        |
    >-- GET /URI2 HTTP/1.0 -----------> |
        Cookies: route                  |
                                        | *** nginx redirect to "route" ***
                                        | >----- internal fetch /URI2 ----> |
                                        | <--- internal response /URI2 ---< |
    <-- HTTP/1.0 200 OK --------------< |
                                      (...)

准备工作,下载所需软件

由于国内网络环境的原因,可以改用网易163的软件镜像源:

如何修改网易163的软件镜像源,可以参照我的这篇文章:http://my.oschina.net/u/1167421/blog/604492

ubuntu14.04默认没有gcc,g++

apt-get install -y gcc g++

一般安装ngxin时,都会安装以下这些模块: gzip模块需要 zlib 库

获取zlib编译安装包,在http://www.zlib.net/上可以获取当前最新的版本。

rewrite模块需要 pcre 库

获取pcre编译安装包,在http://www.pcre.org/上可以获取当前最新的版本

ssl 功能需要openssl库

获取openssl编译安装包,在http://www.openssl.org/source/上可以获取当前最新的版本。

下载sticky sesssion

https://code.google.com/p/nginx-sticky-module/

下载nginx(我用的是1.6.3) http://nginx.org/en/download.html

注:下载下来可以放到/usr/local/src目录下

安装依赖库

安装pcre

     解压缩pcre-xx.tar.gz包。

     进入解压缩目录,执行./configure。

     make & make install

安装openssl

     解压缩openssl-xx.tar.gz包。

     进入解压缩目录,执行./config。

     make & make install

安装zlib

     解压缩zlib-xx.tar.gz包。

     进入解压缩目录,执行./configure。

     make & make install

下载nginx

源码安装nginx

修改nginx-sticky-module-1.1源码:

解压nginx-sticky-module-1.1.tar.gz cd nginx-sticky-module-1.1

新版nginx和nginx-sticky-module-1.1编译会有点问题,应该是nginx新版本没有相应的nginx-sticky-module。 解决办法是把nginx-sticky-module-1.1/ngx_http_sticky_misc.c的281行修改为: digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in), digest->data, len, 1); 注:如果使用nginx-1.4.7那么就不需要改nginx-sticky-module-1.1源码,使用nginx-1.6.3做粘性session,还有一个模块可以使用https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng不过我没试过。

解压nginx-1.6.3.tar.gz

Ubuntu源码安装nginx(整合session_sticky模块)

进入nginx-1.6.3

./configure --prefix=/usr/local/webserver/nginx --with-openssl --with-http_ssl_module  --with-http_realip_module --with-http_gzip_static_module --with-http_sub_module  --add-module=../nginx-sticky-module-1.1

由于没有指定openssl的源码路径,所以报了以下错误:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

可以通过指定open-ssl源码目录来解决--with-openssl=../openssl-xxx

./configure --prefix=/usr/local/webserver/nginx --with-openssl=../openssl-1.0.2e --with-http_ssl_module  --with-http_realip_module --with-http_gzip_static_module --with-http_sub_module  --add-module=../nginx-sticky-module-1.1

接下来就可以:

make -j 4

make install

完成安装

###使用简单说明

最简单的用法:

upstream {
  sticky;
  server 127.0.0.1:9000;
  server 127.0.0.1:9001;
  server 127.0.0.1:9002;
}

sticky命令格式:

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];

sticky命令参数:

Ubuntu源码安装nginx(整合session_sticky模块)

参考资料

https://code.google.com/p/nginx-sticky-module/ http://www.cnblogs.com/skynet/p/4146083.html https://segmentfault.com/a/1190000002797601

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这