1 | # ---------------------------------------------------------------------------------------------- |
1 | # ---------------------------------------------------------------------------------------------- |
1 | #scp /etc/profile.d/{java.sh tomcat.sh } 192.168.10.9:/etc/profile.d/ |
基于mod_proxy实现负载均衡
在httpd.conf的虚拟主机中配置如下内容:
1 | ProxyRequests Off |
如果出错,看日志;;
172.16.100.106/balancer-manager
1 | #vim /usr/local/tomcat/conf/server.xml |
两台Tomcat主机:
1 | # mkdir /web/webapps/WEB-INF |
实验环境:
192.168.122.220 www.123.com
安装jdk:
1 | #chmod +x jdk-6u45-linux-x64-rpm.bin |
在没安装nginx之前,对tomcat进行测试:
这个是默认的,如果想要访问的话,不能通过网站名字进行访问,只能例如http://192.168.122.220:8080进行访问;
自己添加虚拟主机,如下所示:
那么在进行访问tomcat的时候,必须是www.test.com:8080/**.jsp,否则将不会访问得到,这个要注意;;;
关于tomcat调整:
https://blog.linuxeye.com/413.html
mod_proxy:提供代理的功能,而mod_jk是作为一个独立的连接器存在,所以性能上要比较高;
mod_proxy_http:mod_proxy提供http反向代理;
如果使用tomcat做集群,建议使用httpd做反向代理;
环境配置:
tomcat主机:
1 | #vim /usr/local/tomcat/conf/server.xml |
192.168.10.106安装httpd,对后端的Tomcat做反向代理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26安装httpd的配置选项:
#./configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd \
--enable-so \
--enable-rewrite \
--enable-ssl \
--with-zlib \
--with-pcre \
--enable-cgi \
--enable-cgid \
--enable-modules=most \
--enable-deflate \
--enable-mods-shared=most \
--enable-mpms-shared=all \
--with-mpm=event \
--enable-proxy \
--enable-proxy-http \
--enable-proxy-ajp \
--enable-proxy-balancer \
--enable-lbmethod-heartbeat \
--enable-heartbeat \
--enable-slotmem-shm \
--enable-slotmem-plain \
--enable-watchdog \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util
配置apache通过mod_proxy模块与tomcat连接
需要使用mod_proxy与tomcat实例连接,需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现tomcat集群时用到)等模块;
1 | #/usr/local/apache/bin/httpd -D DUMP_MODULES | grep proxy #默认没有,可以在配置文件中查找proxy然后启动这些; |
1 | #vim /etc/httpd/httpd.conf |
注释中心主机,添加
Include /etc/httpd/extra/httpd-proxy.conf
让apache跟tomcat的http连接器进行整合:
1 | #vim /etc/httpd/extra/httpd-proxy.conf |
重启httpd即可实现反向代理。
这个地方我没有添加httpd启动脚本,自己看前面的;;
http://172.16.100.106/index.jsp
需要着重明白这句话,所有的请求都会交给后端的Tomcat处理,httpd并不会处理任何请求,所以网页要放在tomcat指定的目录下;
【方式二】 配置apache跟tomcat的mod_jk连接器进行整合:
1 | #tar xf tomcat-connectors-1.2.37-src.tar.gz |
至此,一个基于mod_jk模块与后端名为Tomcat1的worker通信的配置已经完成,重新httpd服务即可生效;
环境:
tomcat server:192.168.122.115
httpd server:192.168.122.47
tomcat server:
安装jdk和tomcat:
1 | [root@nginx tomcat]# catalina.sh version |
需要注意的几点:
(1) 这个地方必须指定你的默认host,否则会解析到localhost上;;;
(2)在tomcat8上发现docBase不能指定为当前目录,这个不知为何,低版本的我试过,是可以的;
1 | <html><body><center> |
httpd server:
这里省事了,没有重新编译安装httpd
1 | [root@bogon ~]#yum -y install httpd |
重新启动httpd服务器即可;;;
如果tomcat在本地的话,那么在httpd进行反向代理的时候,仍要指定defaultHost=’www.test.com';
1 | #chmod +x jdk-6u45-linux-x64-rpm.bin |
-D
Sun JDK监控和故障处理工具:
API(Application Programming Interface)
ABI(Application Binary Interface)
包含四个独立却又彼此相关的技术
.java ——-> .class (bytecode)
JVM: Hotspot JVM
JRE: java运行时环境
JDK:java 开发环境
JDK=Java+API+JVM,是用于实现java程序开发的最小环境
JRE=JVM+java SE API
JAVA应用领域的不同,JAVA可分为三类:
JAVA SE: Standard Edtion
JAVA EE: Enterprise Edition
JAVA ME:Mobile Edtion
applet:小应用程序是采用Java编程语言编写的程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同。
由于其安全性问题,出现了CGI;
CGI:然后JSP;
JSP:Java Server Page
CMS:Concurrent Mark Sweep
特点:并发收集、低停顿
缺点:无法回收浮动垃圾、由于基于标记-清除算法,所以会产生碎片;
配置实例:
1 | #Global settings |
规划
1 | director: |
实验:
Keepalived + haproxy
Keepalived + nginx
这个地方只是最简单的,可自行参考《构建高可用Linux服务器》
如果做负载均衡,建议使用haproxy;;
由于haproxy是单进程的程序,在处理高并发的时候会做的很好,当然由于单进程,在多CPU的场景中,就要对haproxy进行调整,以便能够有效利用多CPU;
HAProxy的配置处理3类主要参数来源:
一些包含了值的参数表示时间,如超时时长,这些值一般以毫秒为单位,但也可以使用其他的时间单位后缀。
下面的例子配置了一个监听在所有接口的80端口上HTTP proxy服务,它转发所有的请求至后端监听在127.0.0.1:8000上的”server”.
1 | global |
“global”配置中的参数为进程级别的参数,且通常与其运行的OS相关;
*进程管理及安全相关的参数
uid:以指定的UID身份运行haproxy进程
ulimit-n : 设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;
*性能调整相关的参数
代理相关的配置可以如下配置段中。
“defaults”段用于为所有其他配置段提供默认参数,这配置默认参数可由下一个”defaults”所重新设定;
“frontend”段可用于定义一系列监听的套接字,这些套接字可接收客户端请 求并与之建立连接;
“backend”段用于定义一系列”后端”服务器,代理将会将对应客户端的请求转发至这些服务器
“listen”段通过关联”前端”和”后端”定义一个完整的代理,通常只对TCP流量有用;
所有代理的名称只能使用大写字母,小写字母,数字,中线,下划线,点号,冒号,此外,ACL名称会区分字母大小写;
balance
[ ]
balance url_param [check_post[max_wait]]
定义负载均衡算法,可用于”defaults”、”listen”和”backend”。
hash-type
定义用于将hash码映射至后端服务器的方法,其不恩能够用于frontend区段,可用方法有map-based和consistent,在大多数场景下推荐使用默认的map-based方法;
log global
log[ [ ]]
为每个实例启用时间和流量日志,因此可用于用于区段,每个实例最多可以指定两个log参数,不过,如果使用了”log global”且”global”段已经定义了两个log参数时,多余了log参数将被忽略;
maxconn
设定一个前端的最大并发连接数,因此,其不能用于backend区段,对于大型站点来说,可以尽可能调大此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出”global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其他的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间将能维护40000-50000并发连接。
如果为
default_backend
在没有匹配的”use_backend”规则时为实例指定使用的默认后端,因此,其不可应用于backend区段,在”frontend”和”backend”之间进行内容交换时,通常使用”use_backend”定义其匹配规则,而没有被规则匹配到的请求将有此参数指定的后端接收。
使用案例:
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
server
:port
为后端声明一个server,因此,不能够用于defaults和frontend区段
服务器或默认服务器参数:
inter
:设定健康状态检查的时间间隔,单位为毫秒,默认为2000,也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
rise:设定健康状态检查中,某离线的server从离线状态转至正常状态需要成功检查的次数;
fall:确认server从正常状态转换为不可用状态需要检查的次数;
server srv1 172.16.100.6:80 redir http://www.test.com check
检查方法:
option httpchk
option httpchk
opeion httpchk
option httpchk,不能用于frontend段,例如:
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
server apache1 192.168.1.1:443 check port 80
使用案例;
server first 172.16.100.7:1080 cookie first check inter 1000
server second 172.16.100.8:1080 cookie second check inter 1000
capture request header
len
捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于”frontend”和”listen”区段,捕获的首部值使用花括号{}括起来后添加进日志中。如果需要捕获多个首部值,他们将以指定的次序出现在日志文件中,并以竖线”|”作为分隔符。不存在的首部记录为空字符串,最常需要捕获的首部包括在虚拟主机环境中使用的”Host”、上传请求首部中的”Content-length”、快速区别真实用户和网络机器人的”User-agent”,以及代理环境中记录真实请求来源的”X-Forward-For”。
capture response header
len
捕获并记录响应首部,其格式和药店同请求首部。
启用基于程序编译时默认设置的统计报告,不能用于”frontend”区段。只要没有别外的其他设定,他们就会使用如下的配置:
- stats uri : /haproxyadmin?stats
- stats realm : “HAProxy Statistics”
- stats auth : no authentication
- stats scope : no restriction
尽管”stats enable”一条就能够启用统计报告,但还是建议设定其他所有的参数,以免其依赖于默认设定而带来非期后果,下面是一个配置案例:
1 | backend public_www |
stats hide-version
启用统计报告并隐藏HAProxy版本报告,不能用于”frontend”区段,默认情况下,统计页面会显示一些游泳信息,包括HAProxy的版本号,然后,向所有人公开HAProxy的精确版本号是非常有风险的,因为他能帮助恶意用户快速定为版本的缺陷和漏洞,尽管”stats hide-version”一条就能够启用统计报告,但还是建议设定其他所有的参数,以免其依赖于默认设定而带来非期后果,具体请参照”stats enable”一节的说明。
stats realm
启用统计报告并高精认证领域,不能用于”frontend”区段,haproxy在读取realm时会将其视作一个单词,因此,中间的任何空白字符都必须使用反斜线进行转义,此参数仅在于”stats auth”配置使用时有意义。
尽管”stats realm “ 一条就能够启用统计报告,但还是建议设定其他所有的参数,以免其依赖于默认设定而带来非期后果,具体请参照”stats enable”一节的说明。
stats scope {
| “ . “}
启用统计报告并限定报告的区段,不能用于”frontend”区段,当指定此语句时,统计报告将仅显示其列举出区段的报告信息,所有其他区段的信息将被隐藏。如果需要显示多个区段的统计报告,此语句可以定义多次。需要注意的是,区段名称检测仅仅是以字符串比较的方式进行,他不会真检测指定的区段是否真正存在。
尽管”stats scope”一条就能够启用统计报告,但还是建议设定其他所有的参数,以免其依赖于默认设定而带来非其后果。下面是一个配置案例。
1 | backend private_monitoring |
stats auth
:
启用带认证的统计报告功能并授权一个用户账号,其不能用于”frontend”区段。
:授权进行访问的用户名; :此用户的访问密码,明文格式。
此语句将基于默认设定启用统计报告功能,并仅允许其定义的用户访问,其也可以定义多次以授权多个用户找好,尅结合”stats realm”参数在提示用户认证是给出一个领域说明信息,在使用非法用户访问统计功能时,其将会响应一个”401 Forbidden”页面。其认证方式为HTTP Basic认证,密码传输会以明文方式进行,因此,配置文件中也使用明文方式进行,因此,配置文件中也使用明文方式存储以说明其非保密信息故此不能相同于其他关键性账号的密码。
尽管”stats auth”一条就能够启用统计报告,但还是建议设定其他所有的参数,以免其依赖于默认设定而代理非期后果。
stats admin {if | unless}
在指定的条件满足时启用统计报告页面的管理级别功能,它允许通过web接口启用或禁用服务器,不过,基于安全的角度考虑,统计高博爱页面应该尽可能是只读的。此外,如果启用了HAProxy的多进程模式,启用此管理级别将有可能导致异常行为。
目前来说,POST请求方法被限制于金恩能够使用缓冲区域去保留部分之外的空间,因此,服务器列表不能过长,否则,此请求将无法正常工作,因此,建议一次仅调整少数几个服务器,下面是两个案例,第一个限制了仅能在本机打开报告页面时启用管理级别功能,第二个定义了仅允许通过认证的用户使用管理级别功能。
1 | backend stats_localhost |
option httplog [clf]
启用记录HTTP请求,会话状态和计时器的功能。
clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。
默认情况下,日志输入格式非常简陋,因为其仅包含源地址、目标地址和实例名称,而”option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、”frontend”、”backend”及服务器名称,当然也包括源地址和端口号等。
no option logasap
启用或禁用提前将HTTP请求记入日志,不能用于”backend”区段。
默认情况下,HTTP请求是在请求结束时金牛星记录一百年能就爱你勾起整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。”option logasap”参数能够在服务器发送complete首部时及时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获”Content-Length”响应首部来记录传输的字节数是一个较好选择。下面是一个例子.
1 | listen http_proxy 0.0.0.0:80 |
option forwardfor [except
] [header ] [if-none]
允许在发往服务器的请求首部中插入”X-Forwarded-For”首部。
if-none:仅在此首部不存在时才将其添加至请求报文中。
HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,”X-Forwarded-For”首部则可用于解决此问题,HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。
需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部,如果想为每一个请求都附加此首部,请确保同时使用了”option httpclose”、”option forceclose”和”option http-server-close”几个option。
下面是一个例子:
frontend www
mode http
option forwardfor except 127.0.0.1
errorfile
在用户请求不存在的页面时,返回一个页面文件给客户端而非有haproxy生成的错误代码,可用于所有段中;
:指定对HTTP的哪些状态码返回指定的页面,这里可用的状态码有200,400,403,408,500,502,503和504;
例如:
errorfile 400 /etc/haproxy/errorpages/400badreq.http
errorfile 403 /etc/haproxy/errorpages/403forbid.http
errorfile 503 /etc/haproxy/errorpages/503sorry.http
errorloc
errorloc302
请求错误时,返回一个HTTP重定向至某URL的信息,可用于所有配置段中。
:指定对HTTP的哪些状态码返回指定的页面,这里可用的状态码有200、400、403、408、500、502、503和504;
需要留意的是,这两个关键字都会返回302状态码,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET的场景中(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其他方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。
errorloc 303
请求错误时,返回一个HTTP重定向至某URL的信息给客户端:可用于所有配置段中。
:指定对HTTP的那些状态码返回指定的页面,这里可用的状态码有400,403,408,500,502,504;
例如:
1 | backend webserver |
环境介绍:
192.168.122.14 node2.test.com memcached服务器
192.168.122.7 nfs.test.com LNMP环境
1 | [root@node2 ~]# tar xf libevent-2.0.22-stable.tar.gz |
1 | [root@node2 ~]# yum -y install cyrus-sasl-devel |
提供启动脚本和系统配置文件
1 | [root@node2 memcached-1.4.24]# useradd -r memcached |
测试
1 | telnet localhost 11211 |
这个时候已经完成memcached的安装;;
前提:已经完成LNMP平台的搭建
1 | [root@nfs ~]# tar xf memcache-2.2.7.tgz |
测试:
1 | <?php |
1 | service php-fpm restart |
1 | <?php |
1 | [root@nfs html]# vim /etc/php.ini |
新建php页面setsess.php,为客户端设置启用session:
1 | <?php |
新建php页面showsess.php,获取当前用户的会话ID:
1 | <?php |
1 | [root@nfs ~]# tar xf memadmin-1.0.12.tar.gz |
访问:
http://192.168.122.7/memadmin/index.php
添加memcached主机即可进行监控;;
需要说明:在前一节,Nginx配置使用memcached的缓存时,没有配置成功。额,也没看懂;;
1 | # vim /etc/rc.d/init.d/memcached |
1 | #!/bin/sh |
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true