如果不知道在Linux下如何安装nginx请参考前一篇文章。
nginx负载均衡的配置较apache要简单许多,这里用nginx做负载均衡将不再描述tomcat集群的配置,如果对tomcat集群配置有不懂的地方,请参考Apache反向代理结合Tomcat集群来实现负载均衡(三)、tomcat集群文章进行配置。下边进入正题,开始配置nginx负载均衡。
先来看下nginx的完全配置:
#user nobody; worker_processes 1; #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 { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream tom_server { server 172.18.117.113:8090 weight=2; server 172.18.117.116:8080 weight=3; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tom_server; #root html; #index index.html index.htm; } #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; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
首先需要加入需要代理的服务器地址
upstream tom_server { server 172.18.117.113:8090 weight=2; server 172.18.117.116:8080 weight=3; }
名字可以随意起,只要前后保持一致即可,这里需要注意的是upstream节点一定要加在http节点中,否则启动会报错。
其次加入代理配置
server { listen 80;#要监听的端口 server_name localhost;#要监听的主机 #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tom_server;#代理的upstream名 } }到这里重启下nginx就已经生效了,其实nginx的反向代理就这么简单。
下边我们说下一些高级配置,首先是被代理的服务器的
upstream设备上的状态设置
down 表示单前的server暂时不参与负载
weight 默认为1.weight越大,负载的权重就越大。
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout:max_fails 次失败后,暂停的时间。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
另外大家到这里会考虑一个问题,session如何共享,nginx有以下两种方法(先不考虑tomcat集群中的session复制):
(1)ip_hash
(2 ) nginx-upstream-jvm-route (Nginx +tomcat )
nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:
upstream backend { ip_hash; server 127.0.0.1:8001; server 127.0.0.1:8002; }
ip_hash
ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,
因此ip_hash是有缺陷的,不能在一些情况下使用:
1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址
2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求不能定位到同一台session应用服务器上
nginx-upstream-jvm-route 基于nginx+tomcat的解决方案
patch -p0 <../nginx-upstream-jvm-route-read-only/jvm_route.patch
使用./configure对nginx进行makefile描述时需要加上
--add-module=<path:nginx-upstream-jvm-route path>
tomcat的配置文件修改Server.xml
Tomcat01:
<Enginename="Catalina" defaultHost="localhost"jvmRoute="a">
Tomcat02:
<Enginename="Catalina" defaultHost="localhost"jvmRoute="b">
nginx的配置文件修改
upstreambackend {
server 192.168.2.88:8080 srun_id=a;
server 192.168.2.89:8080 srun_id=b;
jvm_route $cookie_JSESSIONID|sessionidreverse;
}
location/ aa/
{
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header X-Forwarded-For; $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
}
最后再补充下nginx的一些额外设置:
server { listen 80; server_name 192.168.1.104; location / { <strong> proxy_pass http://mysvr;</strong> } #以下是一些反向代理的配置可删除. proxy_redirect off; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 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服务器传 }