nginx做反向代理nginx负载均衡配置 Java怎么获取后端服务器获取用户IP

Nginx通过反向代理实现负载均衡配置实例
17:04:37&&&来源:&&&评论: 点击:
Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apache的所有功能,下面就
& &Nginx作为一个HTTP服务器,在功能实现方面和性能方面都表现得非常卓越,完全可以与Apache相媲美,几乎可以实现Apache的所有功能,下面就介绍一些Nginx配置实例,通过反向代理功能配置一个Nginx负载均衡服务器。后端有三个服务节点,用于提供Web服务,通过Nginx的调度实现三个节点的负载均衡。
myserver {
192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;
192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;
192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;
server_name
www.domain.com 192.168.12.189;
index index.htm index.html;
/ixdba/web/wwwroot;
location / {
proxy_pass http://
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
/opt/nginx/conf/proxy.conf;
在上面这个配置实例中,首先定义了一个负载均衡组myserver,然后在location部分通过&proxy_pass&&实现负载调度功能,其中proxy_pass指令用来指定代理的后端服务器地址和端口,地址可以是主机名或者IP地址,也可以是通过upstream指令设定的负载均衡组名称。
proxy_next_upstream用来定义故障转移策略,当后端服务节点返回500、502、503、504和执行超时等错误时,自动将请求转发到upstream负载均衡组中的另一台服务器,实现故障转移。最后通过include指令包含进来一个 proxy.conf文件。
其中/opt/nginx/conf/proxy.conf的内容为:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
Nginx的代理功能是通过http proxy模块来实现的。默认在安装Nginx时已经安装了http proxy模块因此可直接使用http proxy模块。下面详细解释proxy.conf文件中每个选项代表的含义。
? proxy_set_header:设置由后端的服务器获取用户的主机名或者真实IP地址,以及代理者的真实IP地址。
? client_body_buffer_size:用于指定客户端请求主体缓冲区大小,可以理解为先保存到本地再传给用户。
? proxy_connect_timeout:表示与后端服务器连接的超时时间,即发起握手等候响应的超时时间。
? proxy_send_timeout:表示后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则,Nginx将断开这个连接。
? proxy_read_timeout:设置Nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx等待后端服务器的响应时间,其实是Nginx已经进入后端的排队之中等候处理的时间。
? proxy_buffer_size:设置缓冲区大小, 默认,该缓冲区大小等于指令proxy_buffers设置的大小。&
? proxy_buffers:设置缓冲区的数量和大小。nginx从代理的后端服务器获取的响应信息,会放置到缓冲区。
? proxy_busy_buffers_size:用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_buffers*2。
? proxy_temp_file_write_size:指定proxy缓存临时文件的大小。
原文标题:Nginx通过反向代理实现负载均衡配置实例
原文地址:
版权归网络时代所有,转载请注明出处
相关热词搜索:
延伸阅读:
频道总排行
频道本月排行& Nginx反向代理Websocket
Nginx反向代理Websocket
,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
张丹(Conan), 程序员Java,R,PHP,Javascript
weibo:@Conan_Z
转载请注明出处:
用Nginx给网站做反向代理和负载均衡,是广泛使用的一种Web技术,不仅能够保证后端服务器的隐蔽性,还可以提高网站情况,部署灵活,而且以来源软件实现负载均衡性价比非常高。
不过今天要讲一下,如何用Nginx给Websocket服务器实现反向代理和负载均衡。我也是第一次做这样的尝试,所以仅把功能实现,优化以后再说。
反向代理和负载均衡
创建基于Node的websocket服务器端
创建websocket客户端
用Nginx实现反向代理
用Nginx实现多websocket服务器的负载均衡
1. 反向代理和负载均衡
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
负载均衡 (Load Balancing) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
2. 创建基于Node的websocket服务器端
系统环境:
win7 64bit
npm 1.2.19
node v0.10.5
bower 1.1.2
nginx 1.5.11
redis 2.4.6
创建基于Node的websocket服务器端
D:\workspace\javascript&mkdir nginx-websocket && cd nginx-websocket
D:\workspace\javascript\nginx-websocket&npm install socket.io
socket.io@0.9.16 node_modules\socket.io
├── base64id@0.1.0
├── policyfile@0.0.4
├── redis@0.7.3
└── socket.io-client@0.9.16 (xmlhttprequest@1.4.2, uglify-js@1.2.5, active-x-obfuscator@0.0.1, ws@0.4.31)
服务器端启动文件app1.js
~ vi app1.js
var port = 3100;
var io = require('socket.io').listen(port);
io.sockets.on('connection', function (socket) {
socket.emit('server', {
server: 'Server1',
port: port
node app1.js
3. 创建websocket客户端
通过bower安装socket.io-client库和jquery库
#下载socket.io-client
D:\workspace\javascript\nginx-websocket&bower install socket.io-client
bower socket.io-client#*
cached git:///LearnBoost/socket.io-client.git#0.9.16
bower socket.io-client#*
validate 0.9.16 against git:///LearnBoost/socket.io-client.git#*
bower socket.io-client#~0.9.16 install socket.io-client#0.9.16
socket.io-client#0.9.16 bower_components\socket.io-client
#下载jquery
D:\workspace\javascript\nginx-websocket&bower install jquery
bower jquery#*
cached git:///jquery/jquery.git#2.1.0
bower jquery#*
validate 2.1.0 against git:///jquery/jquery.git#*
bower jquery#*
new version for git:///jquery/jquery.git#*
bower jquery#*
resolve git:///jquery/jquery.git#*
bower jquery#*
download /jquery/jquery/archive/2.1.0.tar.gz
bower jquery#*
progress received 0.3MB of 0.7MB downloaded, 46%
bower jquery#*
progress received 0.3MB of 0.7MB downloaded, 50%
bower jquery#*
progress received 0.4MB of 0.7MB downloaded, 56%
bower jquery#*
progress received 0.4MB of 0.7MB downloaded, 61%
bower jquery#*
progress received 0.5MB of 0.7MB downloaded, 67%
bower jquery#*
progress received 0.5MB of 0.7MB downloaded, 72%
bower jquery#*
progress received 0.5MB of 0.7MB downloaded, 77%
bower jquery#*
progress received 0.6MB of 0.7MB downloaded, 81%
bower jquery#*
progress received 0.6MB of 0.7MB downloaded, 86%
bower jquery#*
progress received 0.6MB of 0.7MB downloaded, 91%
bower jquery#*
progress received 0.6MB of 0.7MB downloaded, 94%
bower jquery#*
progress received 0.7MB of 0.7MB downloaded, 99%
bower jquery#*
extract archive.tar.gz
bower jquery#*
resolved git:///jquery/jquery.git#2.1.0
bower jquery#~2.1.0
install jquery#2.1.0
jquery#2.1.0 bower_components\jquery
创建静态的html文件,作为websocket客户端:client.html
~ vi client.html
&!DOCTYPE html&
&title&Websocket Client&/title&
&script src="bower_components/socket.io-client/dist/socket.io.min.js"&&/script&
&script src="bower_components/jquery/dist/jquery.min.js"&&/script&
&h1&Socket.IO Client&/h1&
&div id="content"&connecting....&/div&
var socket = io.connect('http://localhost:3100');
socket.on('server', function (data) {
console.log(data);
$('#content').html(JSON.stringify(data));
用浏览器打开client.html,查看websocket通讯情况。
服务器端和客户端通讯成功。
接下来,我们用Nginx实现Websocket服务器的反向代理。
4. 用Nginx实现反向代理
看文官说明Nginx在1.3以后的版本支持websocket反向代理,但我在Nginx1.4版本测试时失败,nginx1.5.11版本测试成功。
操作步骤:
1). 下载安装Nginx
2). 修改Nginx配置文件,配置反向代理
3). 启动Nginx服务器
4). 修改app1.js,增加超时的设置
5). 修改client.html,修改nginx访问端口
6). 启动Node的Websocket服务器
7). 浏览器访问测试
1). 下载安装Nginx
下载地址:
2). 修改Nginx配置文件,配置反向代理
修改nginx配置文件:nginx.conf
// ...省略
map $http_upgrade $connection_upgrade {
location / {
proxy_pass http://localhost:3100; #代理3100
proxy_set_header X-Real-IP $remote_
proxy_set_header Host $
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_
proxy_http_version 1.1;
proxy_set_header Upgrade $http_
proxy_set_header Connection "upgrade";
// ...省略
设置nginx的访问端口:3102
设置nginx的代理端口:3100
3). 启动Nginx服务器
D:\toolkit\nginx-1.5.11>nginx.exe
4). 修改app1.js,增加超时的设置
修改启动文件:app1.js
var port = 3100;
var io = require('socket.io').listen(port);
io.enable('browser client minification');
// send minified client
io.enable('browser client etag');
// apply etag caching logic based on version number
io.enable('browser client gzip');
// gzip the file
//io.set('log level', 1);
// reduce logging
io.set('transports', [ 'websocket','flashsocket','htmlfile','xhr-polling','jsonp-polling']);
io.sockets.on('connection', function (socket) {
socket.emit('server', {
server: 'Server1',
port: port
5). 修改client.html,修改nginx访问端口
&!DOCTYPE html&
&title&Websocket Client&/title&
&script src="bower_components/socket.io-client/dist/socket.io.min.js"&&/script&
&script src="bower_components/jquery/dist/jquery.min.js"&&/script&
&h1&Socket.IO Client&/h1&
&div id="content"&connecting....&/div&
var socket = io.connect('http://localhost:3102',{ // 访问3102端口
'connect timeout': 500,
'reconnect': true,
'reconnection delay': 500,
'reopen delay': 500,
'max reconnection attempts': 10
});//设置连接超时
socket.on('server', function (data) {
console.log(data);
$('#content').html(JSON.stringify(data));
6). 启动Node的Websocket服务器
D:\workspace\javascript\nginx-websocket>node app1.js
7). 浏览器访问测试
打开网页:
这样就打通了nginx反向代理Websocket。不过遇到一个问题,就是tcp建立连接时特别慢,目前还没有好的解决办法。
5. 用Nginx实现多websocket服务器的负载均衡
接下来,我们在Nginx配置负载均衡。
由于基于Socket.io实现的Websocket服务器是单线程的,而访问实例被保存在MemoryStore中。如果我们想实现多个Websocket服务器或多进程调用,那么我们需要把访问实例单独存储,Socket.io集成了通过Redis的NoSQL数据库存储。
socket.io配置说明,可以参考:
操作步骤:
1). 下载安装Redis服务器并启动
2). 修改app1.js,增加Redis配置
3). 新建app2.js,增加Redis配置
4). 修改Nginx配置文件,配置app1,app2的负载均衡
5). 启动Nginx服务器,启动app1.js, app2.js
6). 浏览器访问测试
1). 下载安装Redis服务器并启动
Redis的window版本的下载地址:
D:\toolkit\Redis>redis-server.exe
2). 修改app1.js,增加Redis配置
修改一个app1.js,绑定Redis存储实例
var port = 3100;
var io = require('socket.io').listen(port);
var RedisStore = require('socket.io/lib/stores/redis')
= require('socket.io/node_modules/redis')
= redis.createClient()
= redis.createClient()
, client = redis.createClient();
io.set('store', new RedisStore({
redisPub : pub
, redisSub : sub
, redisClient : client
io.enable('browser client minification');
// send minified client
io.enable('browser client etag');
// apply etag caching logic based on version number
io.enable('browser client gzip');
// gzip the file
//io.set('log level', 1);
// reduce logging
io.set('transports', [ 'websocket','flashsocket','htmlfile','xhr-polling','jsonp-polling']);
io.sockets.on('connection', function (socket) {
socket.emit('server', {
server: 'Server1',
port: port
3). 新建app2.js,增加Redis配置
增加一个app2.js,做为第二个websocket服务器
var port = 3101;
var io = require('socket.io').listen(port);
var RedisStore = require('socket.io/lib/stores/redis')
= require('socket.io/node_modules/redis')
= redis.createClient()
= redis.createClient()
, client = redis.createClient();
io.set('store', new RedisStore({
redisPub : pub
, redisSub : sub
, redisClient : client
io.enable('browser client minification');
// send minified client
io.enable('browser client etag');
// apply etag caching logic based on version number
io.enable('browser client gzip');
// gzip the file
//io.set('log level', 1);
// reduce logging
io.set('transports', [ 'websocket','flashsocket','htmlfile','xhr-polling','jsonp-polling']);
io.sockets.on('connection', function (socket) {
socket.emit('server', {
server: 'Server2',
port: port
4). 修改Nginx配置文件,配置端口的负载均衡
修改Nginx配置文件:nginx.conf
map $http_upgrade $connection_upgrade {
upstream websocket {
server localhost:3100;
server localhost:3101;
location / {
proxy_pass http://
#proxy_pass http://localhost:3100/;
proxy_set_header X-Real-IP $remote_
proxy_set_header Host $
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_
proxy_http_version 1.1;
proxy_set_header Upgrade $http_
proxy_set_header Connection "upgrade";
5). 启动Nginx服务器,启动app1.js, app2.js
D:\toolkit\nginx-1.5.11>nginx.exe
D:\workspace\javascript\nginx-websocket>node app1.js
D:\workspace\javascript\nginx-websocket>node app2.js
6). 浏览器访问测试
打开2个浏览器页面:
这样就实现2个Websocket服务器轮训的负载均衡!!不过,建立连接非常慢的问题依然存在,我还没有什么好的办法。希望了解内情的同学,帮助解答!
转载请注明出处:
This entry was posted in ,
Designed byNginx反向代理的配置 -- 简明现代魔法Nginx服务器做负载均衡反向代理的超级攻略 | Nginx,服务器,负载,均衡,反向,代理,超级,攻略_服务器常识_滕州生活网
|||||||||||||||||||
Nginx服务器做负载均衡反向代理的超级攻略
来源:转载整理 发布时间:
摘要:nginx 做反向代理时,后端主机有多台,可以使用 upstream 定义一个后端主机池,在反向代理时直接使用主机池的名字。在 upstream 中可以定义负载均衡调度算法,权重,健康状态检测等参数。 例如: 默认请求下,使用 round-robin 调度算法,并有健康状态检查
Nginx服务器做负载均衡反向代理的超级攻略
nginx 做反向代理时,后端主机有多台,可以使用 upstream 定义一个后端主机池,在反向代理时直接使用主机池的名字。在 upstream 中可以定义负载均衡调度算法,权重,健康状态检测等参数。 滕州生活网
默认请求下,使用 round-robin 调度算法,并有健康状态检查和恢复主机的能力。 滕州生活网
ningx 还可以使用这些算法: 滕州生活网()
ip_hash:基于源地址哈希,主要目的是会话保持
least_conn:基于最少活动连接进行调度
sticky:基于 cookie 进行会话绑定,nginx 会在客户端第一次访问时插入路由信息到 cookie 中,或者选择 cookie 中的某个字段的值作为键,以后每次请求将基于此信息进行调度
基于 cookie 的会话绑定共有 cookie,route 和 learn 三种。
例如,基于 cookie name 的调度: 滕州生活网
使用此主机组进行反向代理:
proxy_pass URL 指定代理的后端主机,可以指定 "http" 或 "https" 协议,域名可以是 ip 地址,也可以是 upstream 池名字
如果代理指定的是一个 URI 地址,如 http://127.0.0.1/remote,那么将直接被代理至指定 URI,无论请求的 URI 是什么
如果代理指定的一个主机而没有 URI,如 http://127.0.0.1,客户端请求的URI将被传递至指定域名
如果 location 中使用模式匹配 url,那么 url 也会被传递至代理 URL 的末端
如果 location 中使用了 URI 重写,那么 proxy_pass 会使用重写后的结果进行处理
proxy_set_header HEADER VALUE 对转发的报文首部进行修改一些
反向代理时的缓存相关设定
proxy_cache_path PATH [levels=levels] keys_zone=NAME:SIZE
定义磁盘缓存路径,nignx 的缓存是以键值方式存放的,keys_zone 用于指定键存放的内存空间名字和大小,对应的值则存放在 PATH 指定的路径中。levels 可以指定缓存存放路径的级数和名称字符数。此设置只能在 http 段中定义。
如: 滕州生活网
proxy_cache_valid [code ...] time 指定不同响应码的内容的缓存时间
proxy_cache_method METHOD 定义哪些方法的请求结果可以被缓存,如:
proxy_cache NAME 指定使用预先定义的缓存空间用于缓存
滕州生活网()
一些问题的解决方法 滕州生活网
下面来看看采用Nginx负载均衡之后碰到的问题:
通常解决服务器负载问题,都会通过多服务器分载来解决。常见的解决方案有: 滕州生活网()
那我们看看Nginx是如何实现负载均衡的,Nginx的upstream目前支持以下几种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 滕州生活网
Upstream配置如何实现负载
滕州生活网()
当有请求到/ 时请求会被分发到对应的upstream设置的服务器列表上。test2的每一次请求分发的服务器都是随机的,就是第一种情况列举的。而test1刚是根据来访问ip的hashid来分发到指定的服务器,也就是说该IP的请求都是转到这个指定的服务器上。
根据服务器的本身的性能差别及职能,可以设置不同的参数控制。
down 表示负载过重或者不参与负载 滕州生活网
weight 权重过大代表承担的负载就越大
backup 其它服务器时或down时才会请求backup服务器
max_fails 失败超过指定次数会暂停或请求转往其它服务器
fail_timeout 失败超过指定次数后暂停时间
以上就Nginx的负载均衡的简单配置。那继续我们的本节讨论内容:
一、Session问题
当我们确定一系列负载的服务器后,那我们的WEB站点会分布到这些服务器上。这个时候如果采用Test2 每一次请求随机访问任何一台服务器上,这样导致你访问A服务器后,下一次请求又突然转到B服务器上。这个时候与A服务器建立的Session,传到B站点服务器肯定是无法正常响应的。我们看一下常用的解决方案:
Session或凭据缓存到独立的服务器
Session或凭据保存数据库中
nginx ip_hash 保持同一IP的请求都是指定到固定的一台服务器
第一种缓存的方式比较理想,缓存的效率也比较高。但是每一台请求服务器都去访问Session会话服务器,那不是加载重了这台Session服务器的负担吗?
第二种保存到数据库中,除了要控制Session的有效期,同时加重了数据库的负担,所以最终的转变为SQL Server 负载均衡,涉及读,写,过期,同步。
第三种通过nginx ip_hash负载保持对同一服务器的会话,这种看起来最方便,最轻量。
正常情况下架构简单的话, ip_hash可以解决Session问题,但是我们来看看下面这种情况
这个时候ip_hash 收到的请求都是来自固定IP代理的请求,如果代理IP的负载过高就会导致ip_hash对应的服务器负载压力过大,这样ip_hash就失去了负载均衡的作用了。 滕州生活网
如果缓存可以实现同步共享的话,我们可以通过多session服务器来解决单一负载过重的问题。那Memcached是否可以做Session缓存服务器呢?MemcachedProvider提供了Session的功能,即将Session保存到数据库中。那为什么不直接保存到数据库中,而要通过Memcached保存到数据库中呢?很简单,如果直接保存到数据库中,每一次请求Session有效性都要回数据库验证一下。其次,即使我们为数据库建立一层缓存,那这个缓存也无法实现分布式共享,还是针对同一台缓存服务器负载过重。网上也看到有用Memcached实现Session缓存的成功案例,当然数据库方式实现的还是比较常用的,比如开源Disuz.net论坛。缓存实现的小范围分布式也是比较常用的,比如单点登录也是一种特殊情况。
二、文件上传下载
相关阅读:
声明:凡注明为"网络整理"或者其他媒体来源的信息,均为转载自其他各大门户媒体,虽经严格筛选难免疏漏,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。您若对该稿件内容有任何疑问或者侵犯到您的权益,请发邮件至邮,我们将在24小时内予以删除。
下一篇:没有了
Nginx服务器做负载均衡反向代理的超级攻略
Nginx服务器做负载均衡反向代理的超级攻略利用Nginx做反向代理的负载均衡配置_服务器应用_Linux公社-Linux系统门户网站
你好,游客
利用Nginx做反向代理的负载均衡配置
来源:Linux社区&
作者:Linux
1.nginx负载均衡
  网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,nginx自身就可以做到,只需要做个简单的配置就行。
  nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 4 种方式的分配&
1)、轮询(默认)&
  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。&
2)、weight&
  指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。&
2)、ip_hash&
  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 &
3)、fair(第三方)&
  按后端服务器的响应时间来分配请求,响应时间短的优先分配。 &
4)、url_hash(第三方)
2.nginx负载均衡配置
在http段做如下配置,即可实现两个域名
upstream &www.linuxidc.com &{& & server & 10.0.1.50:8080;& & server & 10.0.1.51:8080;}upstream &blog.linuxidc.com &&{& & server & 10.0.1.50:8080;& & server & 10.0.1.51:8080;}server{& & listen &80;& & server_name &www.linuxidc.com;& & location / {& & & & proxy_pass & & & &http://;& & & & proxy_set_header & Host & & & & & & $& & & & proxy_set_header & X-Real-IP & & & &$remote_& & & & proxy_set_header & X-Forwarded-For &$proxy_add_x_forwarded_& & }}server{& & listen &80;& & server_name &blog.linuxidc.com wode.linuxidc.com;& & location / {& & & & proxy_pass & & & &http://;& & & & proxy_set_header & Host & & & & & & $& & & & proxy_set_header & X-Real-IP & & & &$remote_& & & & proxy_set_header & X-Forwarded-For &$proxy_add_x_forwarded_& & }}
3.注意的几个小问题
3.1 多台机器间session的共享问题
配置负载均衡比较简单,但是最关键的一个问题是怎么实现多台服务器之间session的共享
下面有几种方法(以下内容来源于网络,第四种方法没有实践.)
1). 不使用session,换作cookie
  能把session改成cookie,就能避开session的一些弊端,在从前看的一本J2EE的书上,也指明在集群系统中不能用session,否则惹出祸端来就不好办。如果系统不复杂,就优先考虑能否将session去掉,改动起来非常麻烦的话,再用下面的办法。
2). 应用服务器自行实现共享
  php可以用数据库或memcached来保存session,从而在php本身建立了一个session集群,用这样的方式可以令 session保证稳定,即使某个节点有故障,session也不会丢失,适用于较为严格但请求量不高的场合。但是它的效率是不会很高的,不适用于对效率要求高的场合。
以上两个办法都跟nginx没什么关系,下面来说说用nginx该如何处理:
3). &ip_hash
  nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:
upstream backend {& & server 127.0.0.1:8080 ;& & server 127.0.0.1:9090 ;& & ip_hash;}
  ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一???情况下使用:
  nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
  nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
4). upstream_hash
  为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享。假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端:可见这篇文档:/nginx/nginx_url_hash.html
在文档中是使用$request_uri做因子,稍微改一下:
hash & $http_x_forwarded_for;
这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:
hash & $cookie_jsessionid;
  假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie,可参见userid模块的英文文档:http://wiki.nginx.org/NginxHttpUserIdModule
  另可用姚伟斌编写的模块upstream_jvm_route:/p/nginx-upstream-jvm-route/
3.2 后端服务器自动加上端口的问题
  一个典型的 Nginx + Apache 应用方案可以是Nginx 占用 80 端口,过滤静态请求,然后动态请求即 Proxy 到 Apache 的 8080 端口。Proxy 反向代理的好处是访问的时候,始终就是 80端口,来访者不会觉察到有任何的区别。但有的应用确非常“聪明”,识别到 Apache 所位于的端口是 8080 ,就会把相关的超链接都一并加上 :8080 的后续。这么就死定了,还能有正常访问麽?!有个方法可以解决这事,就是把 apache 也运行在80端口上。同一台服务器,有Nginx 也有 Apache,2个httpd服务,都是80,不会冲突麽?
nginx.conf 的配置中
server {& & listen 80;& & server_name www.linuxidc.com;& & ....}
server {& & listen 123.123.123.123:80; #指定Nginx只占用某个公网IP的80端口。& & #listen 123.123.123.124:80; #如果你服务器中有多个IP,还可以指定多个。& & server_ ....}
把 apache 的配置文件 httpd.conf 中的Listen 80
Listen 127.0.0.1:80
跟Nginx一样,指定apache所占用的IP及端口。
保存退出,重启apache即可生效。
相关资讯 & & &
& (10/08/:17)
& (08/25/:05)
& (11/09/:48)
& (09/23/:56)
& (08/15/:22)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 nginx tcp 负载均衡 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信