1 需求:客户需要对现有的web服务接口 进行负载均衡配置。领导直接安排要求使用nginx做,直接从没听过这个东西,但都说这个东西很简单。那只能话不多说,直接干活咯。后面却搞了整整一天的时间。
2 背景知识:
先了解下web负载均衡相关知识,特指能够分担web请求(http,https等)的负载均衡技术,采用不同的机制建立映射关系,可以形成不同的负载均衡技术,常见的包括:
DNS轮询
CDN
HTTP重定向
IP负载均衡
反向代理负载均衡(Nginx)
这次用的是这个:
反向代理负载均衡(Nginx)
反向代理服务器的核心工作就是转发Http请求,工作在HTTP层,因此也称为七层负载均衡。反向代理服务器是转发请求不是转移,其他的都是转移。在这种调度模式下,任何对实际服务器的请求都必须经过调度器,调度器必须等待实际服务器的响应并反馈给用户。调度器可以按权重分配任务给后端服务器,因为后端服务器的能力可能不一样。按权重分配的配置在Nginx中使用weight参数定义,很多反向代理服务器还支持权重分配的RR调度策略。反向代理服务器本身的并发处理能力很重要,当反向代理服务器的吞吐率达到上限时,添加再多的后端服务器也无济于事。反向代理服务器转发操作本身具有一定的开销如创建线程、与后端服务器建立TCP连接、接收后端服务器返回的结果、分析HTTP头信息、用户态和内核态的切换等。大多反向代理服务器自身可以监测到后端服务器的健康状况如系统负载、响应时间、是否可用、TCP连接数、流量等。在实际应用中,我们可以备用一定数量的后端服务器,一旦某些后端服务器出现故障可以使用备用服务器进行替换提供服务。使用RR调度策略时即使是同一用户对同一内容的多次请求有可能是被转发到不同的后端服务器上,这样就会产生后端服务器本地Session不同步及缓存利用率下降的问题。解决Session一致的问题可以使用在一定Session周期内使同一个用户的请求始终转发到同一台后端服务器,要设计持续性调度算法,比如对用户的IP进行hash计算或使用Cookie持久性算法。当然,在后端服务器本地上保存Session和缓存并不是一个明智的选择,这样会导致为了保证Session一致等情况无法做到让后端服务器承担不同的权重。应该使用分布式的Session(多台Session服务器)和分布式缓存。
反向代理服务器由于本身开销大等原因存在扩展性差,性能受到极限等限制
NginX
1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是许多朋友喜欢它的原因之一;
2. Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
3. Nginx安装和配置比较简单,测试起来比较方便;
4. 也可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5. Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测;
6. Nginx仅能支持http和Email,这样就在适用范围上面小很多,这个它的弱势;
7. Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP(Linux+Nginx+Mysql/MariaDB+Perl/PHP/Python)现在也是非常流行的web架构,大有和以前最流行的LAMP(Linux+Apache+Mysql/MariaDB+Perl/PHP/Python)架构分庭抗争之势,在高流量的环境中也有很好的效果。
8. Nginx现在作为Web反向加速缓存越来越成熟了,很多朋友都已在生产环境下投入生产了,而且反映效果不错,速度比传统的Squid服务器更快,有兴趣的朋友可以考虑用其作为反向代理加速器。
具体步骤:
官网下载nginx 1.8
现在很多资料上说:Nginx依赖一些其他PCRE、openssl(依赖libssl-dev)等,这些可以先不考虑,先安装 因为每个资料说的都不一样,而且自己实际的情况也不确定,可以先安装 看他的提示 缺什么 再补装即可
安装包路径:
配置文件路径:
一开始安装编译提示的pcre不存在,后来从网上下载补装的pcre 装完后 检查下 是否在:
执行make命令 安装编译nginx
Nginx配置成功后我们对window下nginx.conf少做修改:
user tomcat;#修改 linux用户
worker_processes 2;#通常两倍于cpu核数
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 2048;#<span style="color:black;">允许最大连接数</span>
}
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 ;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 180; <span style="color:#333333;">#</span><span style="color:#333333;">连接超时时间</span>
gzip on;
upstream 10.243.30.118 {#负载均衡调用ip
#ip_hash
#ip_hash;
server 10.243.30.117:9997 weight=5; #被分配的节点1 ,为其中一个tomcat 的ip 端口
server 10.243.30.118:9997 weight=5; #被分配的节点2,为其中另一个tomcat 的ip 端口
}
server {
listen 80; #负载均衡机器端口
server_name 10.243.30.118; #负载均衡机器IP
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html; #默认根目录
index index.html index.htm;
proxy_pass http://10.243.30.118;
}
#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;
# }
#}
}
启动
确保系统的 80 端口没被其他程序占用,
/usr/local/nginx/sbin/nginx
检查是否启动成功:
打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。