Nginx可以干许多事情,在这里我们主要使用Nginx的反向代理与负载均衡功能。
1、Nginx的下载安装
在安装Nginx前需要安装如下软件:
GCC Nginx是C写的,需要用GCC编译
PCRE(Perl Compatible Regular Expression) Nginx的Rewrite和HTTP模块会用到
zlib Gzip会用到
OpenSSL ssl用到
如下命令:
yum install gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel
创建目录(nginx-src),从官方地址(http://nginx.org/)下载,解压,配置,编译,安装:
mkdir nginx-src && cd nginx-src wget http://nginx.org/download/nginx-1.7.3.tar.gz tar xzf nginx-1.7.3.tar.gz cd nginx-1.7.3 ./configure make make install whereis nginx nginx: /usr/local/nginx
默认的安装路径为:/usr/local/nginx;跳转到/usr/local/nginx/sbin目录下:
启动:./nginx 停止:./nginx -s stop
启动后查看是否启动成功,可以在浏览器中输入http://loalhost后有Nginx提示首页或者输入如下命令查看:
ps -ef|grep nginx
类似如下的结果表示成功启动:
查看nginx的版本:
/usr/local/nginx/sbin/nginx -v
2、配置Nginx服务器组
创建两个nginx-sample-01与nginx-sample-02的Spring Boot服务,然后修改服务端口分别为:8081与8082,并且添加一个简单的服务类,代码如下:
8081端口的nginx-sample-01项目:
@RestController public class TestCtrl { @RequestMapping(value="/") public void nginx( ) throws Exception { System.out.println("nginx01---------------"); } }
8082端口的nginx-sample-02项目:
@RestController public class TestCtrl { @RequestMapping(value="/") public void nginx( ) throws Exception { System.out.println("nginx02---------------"); } }
然后打包为jar后,放到CentOS服务器上。使用如下类似的命令启动Web服务。
java -jar xxx.jar
现在有两个Spring Boot对外提供服务,Nginx来做负载均衡。编辑/usr/local/nginx/conf下的nginx.conf文件,添加upstream配置,这是配置一组被代理的服务器地址。
upstream mysvr { server 192.168.2.129:8081; server 192.168.2.129:8082; } server { listen 80; server_name localhost; location / { proxy_pass http://mysvr; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
重启nginx服务器后,在浏览器中访问http://localhost,这时候如果有如下输入,则说明配置生效。
nginx01--------------------- nginx02--------------------- nginx01--------------------- nginx02--------------------- ...
nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....
将nginx添加到系统服务,这样我们就可以方便的进行常用操作了。
# vi /etc/init.d/nginx
打开nginx后,添加如下现行代码:
# chkconfig: 2345 85 15 # Startup script for the nginx Web Server
# chmod +x /etc/init.d/nginx # chkconfig --add nginx # chkconfig --list nginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
成功以后就可以使用如下命令来操作nginx了。
service nginx start/stop/reload..
3、nginx其它负载均衡
(1)ip_hash nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session。但是可能获取不到正确的ip地址,如nginx之前还有代理,或者nginx后端还有分流的情况,都要考虑。
(2)upstream_hash nginx新版本中可支持读取cookie值,所以也可以改成 hash $cookie_jsessionid;假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie。
(3)使用nginx sticky实现基于cookie的负载均衡 http://www.ttlsa.com/nginx/nginx-modules-nginx-sticky-module/
(4)一致性hash算法 可以使用第三方moduler的一致性hash算法来分配请求。
参考如下博文了解这个算法:http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html
github下载:https://github.com/replay/ngx_http_consistent_hash unzip ngx_http_consistent_hash-master.zip ./configure --add-module=/home/mazhi/Downloads/ngx_http_consistent_hash-master make make install
修改mysvr服务器组,如下:
upstream mysvr { consistent_hash $request_uri; server 10.10.20.20:8081; server 10.10.20.20:8082; }