[轉(zhuǎn)][筆記] 6.Tomcat系列之Apache負(fù)載均衡請(qǐng)求至Tomcat及DeltaManager的使用

轉(zhuǎn)自陳明乾的博客扭倾,可能有一定更新柠偶。

轉(zhuǎn)原文聲明:
原創(chuàng)作品情妖,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 诱担、作者信息和本聲明毡证。否則將追究法律責(zé)任。http://freeloda.blog.51cto.com/2033581/1301888

一蔫仙、前言
二料睛、環(huán)境準(zhǔn)備
三、負(fù)載均衡實(shí)現(xiàn)
四、DeltaManager實(shí)現(xiàn)
五恤煞、Nginx實(shí)現(xiàn)Tomcat負(fù)載均衡

注屎勘,操作系統(tǒng) CnetOS6.8 x86_64

一、前言


本博文中的所有內(nèi)容是基于上一篇寫的居扒,不清楚的博友可以先看一下上一篇博文:http://freeloda.blog.51cto.com/2033581/1301382概漱。在上一篇博文中我們分別用mod_proxy和mod_jk實(shí)現(xiàn)了tomcat服務(wù)器的反向代理,在這一篇博文中我們要實(shí)現(xiàn)tomcat服務(wù)器的負(fù)載均衡和tomcat集群的會(huì)話共享喜喂。好了瓤摧,下面我們就來具體的說一下吧!

二玉吁、環(huán)境準(zhǔn)備


1.實(shí)驗(yàn)拓?fù)?/p>

Apache: 192.168.0.171
Tomcat1: 192.168.0.181
Tomcat2: 192.168.0.182

     Apache
        |
       / \
Tomcat1  Tomcat2

2.同步各節(jié)點(diǎn)時(shí)間

[root@apache ~]# ntpdate 202.120.2.101
[root@tomcat1 ~]# ntpdate 202.120.2.101
[root@tomcat2 ~]# ntpdate 202.120.2.101

3.安裝jdk

[root@tomcat2 src]# rpm -ivh jdk-7u40-linux-x64.rpm

4.配置jdk環(huán)境變量

[root@tomcat2 java]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.7.0_40
export PATH=$PATH:$JAVA_HOME/bin
[root@tomcat2 java]# java -version
java version "1.7.0_40" 
Java(TM) SE Runtime Environment (build 1.7.0_40-b43) 
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

5.安裝tomcat

[root@tomcat2 src]# tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/
[root@tomcat2 src]# cd /usr/local/ 
[root@tomcat2 local]# ln -sv apache-tomcat-7.0.42 tomcat 
"tomcat" -> "apache-tomcat-7.0.42" 
[root@tomcat2 local]# cd tomcat/ 
[root@tomcat2 tomcat]# ls 
bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work

6.配置tomcat環(huán)境變量

[root@tomcat2 tomcat]# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
[root@tomcat2 tomcat]# . /etc/profile.d/tomcat.sh
[root@tomcat2 tomcat]# catalina.sh version 
Using CATALINA_BASE:  /usr/local/tomcat 
Using CATALINA_HOME:  /usr/local/tomcat 
Using CATALINA_TMPDIR: /usr/local/tomcat/temp 
Using JRE_HOME:    /usr/java/jdk1.7.0_40 
Using CLASSPATH:    /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar 
Server version: Apache Tomcat/7.0.42 
Server built:  Jul 2 2013 08:57:41 
Server number: 7.0.42.0 
OS Name:    Linux 
OS Version:   2.6.32-358.el6.x86_64 
Architecture:  amd64 
JVM Version:  1.7.0_40-b43 
JVM Vendor:   Oracle Corporation

7.為tomcat提供init腳本

root@tomcat2 tomcat]# vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux. 
# 
# chkconfig: 2345 96 14 
# description: The Apache Tomcat servlet/JSP container. 
CATALINA_HOME=/usr/local/tomcat 
export CATALINA_HOME 
# export CATALINA_OPTS="-Xms128m -Xmx256m" 
exec $CATALINA_HOME/bin/catalina.sh $*

下面我們來增加執(zhí)行權(quán)限

[root@tomcat ~]# chmod +x /etc/init.d/tomcat

8.測(cè)試一下

[root@tomcat2 tomcat]# service tomcat start
Using CATALINA_BASE:  /usr/local/tomcat 
Using CATALINA_HOME:  /usr/local/tomcat 
Using CATALINA_TMPDIR: /usr/local/tomcat/temp 
Using JRE_HOME:    /usr 
Using CLASSPATH:    /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar 
[root@tomcat2 tomcat]# netstat -ntulp 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address        Foreign Address       State    PID/Program name
tcp    0   0 0.0.0.0:22         0.0.0.0:*          LISTEN   1042/sshd    
tcp    0   0 127.0.0.1:25        0.0.0.0:*          LISTEN   1119/master   
tcp    0   0 127.0.0.1:6010       0.0.0.0:*          LISTEN   1153/sshd    
tcp    0   0 127.0.0.1:6011       0.0.0.0:*          LISTEN   1262/sshd    
tcp    0   0 :::8080           :::*            LISTEN   1541/java    
tcp    0   0 :::22            :::*            LISTEN   1042/sshd    
tcp    0   0 ::1:25           :::*            LISTEN   1119/master   
tcp    0   0 ::1:6010          :::*            LISTEN   1153/sshd    
tcp    0   0 ::1:6011          :::*            LISTEN   1262/sshd    
tcp    0   0 ::ffff:127.0.0.1:8005    :::*            LISTEN   1541/java    
tcp    0   0 :::8009           :::*            LISTEN   1541/java

用瀏覽器訪問 192.168.0.182:

Snip20160801_15.png

好了照弥,大家可以看到訪成功。說明我們的tomcat安裝完成进副,下面我們來配置一下这揣。

9.修改配置文件

[root@tomcat1 ~]# cd /usr/local/tomcat/conf/
[root@tomcat1 conf]# cp server.xml server.xml.bak
[root@tomcat1 conf]# vim server.xml


<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
               
<Engine name="Catalina" defaultHost="www.test.com" jvmRoute="TomcatB">

<Host name="www.test.com"  appBase="/web"
            unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="webapp" reloadable="true"/>

下面來檢查一下配置文件,

[root@tomcat1 conf]# service tomcat configtest
...
INFO: Initializing ProtocolHandler ["http-nio-80"]
Aug 12, 2016 9:24:48 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Aug 12, 2016 9:24:48 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Aug 12, 2016 9:24:48 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Aug 12, 2016 9:24:48 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1322 ms

創(chuàng)建虛擬主機(jī)文檔目錄并創(chuàng)建測(cè)試文件影斑,

[root@tomcat1 conf]# mkdir -pv /web/webapp
mkdir: 已創(chuàng)建目錄 "/web"
mkdir: 已創(chuàng)建目錄 "/web/webapp"
[root@tomcat1 conf]# cd /web/webapp
[root@tomcat1 webapp]# vim index.jsp
<%@ page language="java" %>
<html>
 <head><title>TomcatB</title></head>
 <body>
 <h1><font color="blue">TomcatB </h1>
 <table align="centre" border="1">
  <tr>
  <td>Session ID</td>
 <% session.setAttribute("abc","abc"); %>
  <td><%= session.getId() %></td>
  </tr>
  <tr>
  <td>Created on</td>
  <td><%= session.getCreationTime() %></td>
  </tr>
 </table>
 </body>
</html>

下面我們來啟動(dòng)并測(cè)試一下给赞,

[root@tomcat1 webapp]# service tomcat start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 webapp]# ss -ntl
State       Recv-Q Send-Q              Local Address:Port                Peer Address:Port
LISTEN      0      1                ::ffff:127.0.0.1:8005                          :::*
LISTEN      0      100                            :::8009                          :::*
LISTEN      0      100                            :::80                            :::*
LISTEN      0      128                            :::22                            :::*
LISTEN      0      128                             *:22                             *:*
LISTEN      0      100                           ::1:25                            :::*
LISTEN      0      100                     127.0.0.1:25                             *:*
Snip20160812_74.png

好了,到這里我們準(zhǔn)備工作就全部完成了矫户,下面我們來配置tomcat的負(fù)載均衡塞俱。對(duì)了,還有個(gè)問題得說明一下吏垮。有博友會(huì)問了,你只配置了tomcat2罐旗,拓?fù)鋱D中有三臺(tái)機(jī)器還有兩臺(tái)你怎么不配置呢膳汪,是這樣的由于我們實(shí)驗(yàn)是接著上一篇博客做的,另外兩臺(tái)機(jī)器的配置在上一篇博文中有九秀,不清楚的博友參考一下http://freeloda.blog.51cto.com/2033581/1301382遗嗽,我這里就不重復(fù)說明了。

三鼓蜒、負(fù)載均衡實(shí)現(xiàn)


兩種方式都能實(shí)現(xiàn)負(fù)載均衡:

1.基于mod_proxy模塊實(shí)現(xiàn)負(fù)載均衡
2.基于mod_jk模塊實(shí)現(xiàn)負(fù)載均衡

下面我們就來分別演示一下痹换,

3.1.基于mod_proxy實(shí)現(xiàn)負(fù)載均衡


需要的模塊:

  • mod_proxy
  • HTTP, using mod_proxy_http
  • FTP, using mod_proxy_ftp
  • AJP13, using mod_proxy_ajp

至少有一種調(diào)度算法模塊:

  • mod_lbmethod_byrequests
  • mod_lbmethod_bytraffic
  • mod_lbmethod_bybusyness
  • mod_lbmethod_heartbeat

以及:

  • mod_proxy_balancer

首先這些模塊必須存在,其次在配置中開啟它們:

查看模塊:

[root@vm1 etc]# cd /usr/local/apache/modules/
[root@vm1 modules]# ls | grep mod_proxy
mod_proxy_ajp.so
mod_proxy_balancer.so
mod_proxy_connect.so
mod_proxy_express.so
mod_proxy_fcgi.so
mod_proxy_ftp.so
mod_proxy_hcheck.so
mod_proxy_http.so
mod_proxy_scgi.so
mod_proxy.so
mod_proxy_wstunnel.so

[root@vm1 modules]# ls | grep balancer
mod_proxy_balancer.so
[root@vm1 modules]# ls | grep lbmethod
mod_lbmethod_bybusyness.so
mod_lbmethod_byrequests.so
mod_lbmethod_bytraffic.so
mod_lbmethod_heartbeat.so

在配置中開啟模塊:

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so

LoadModule watchdog_module modules/mod_watchdog.so

首先我們來修改一下httpd.conf配置文件都弹,啟用httpd-proxy.conf配置文

[root@apache ~]# vim /etc/httpd/httpd.conf


Include /etc/httpd/extra/httpd-proxy.conf
#Include /etc/httpd/extra/httpd-jk.conf

下面我們來修改httpd-proxy.conf配置文件娇豫,

[root@vm1 extra]# cat httpd-proxy.conf
ProxyRequests Off
<proxy balancer://lbcluster>
BalancerMember http://192.168.0.181:80 loadfactor=1 route=TomcatA
BalancerMember http://192.168.0.182:80 loadfactor=1 route=TomcatB
#ProxySet lbmethod=byrequests
ProxySet lbmethod=bytraffic
#ProxySet stickysession=JSESSIONID|jsessionid
ProxySet nofailover=On
</proxy>
<VirtualHost *:80>
ServerAdmin admin@test.com
ServerName www.test.com
ProxyPass "/" "balancer://lbcluster/"
ProxyPassReverse "/" "balancer://lbcluster/"
<Proxy *>
Require all granted
</Proxy>
<Location />
Require all granted
</Location>
</VirtualHost>

測(cè)試配置:

[root@vm1 extra]# service httpd configtest
Syntax OK

訪問 192.168.0.171 測(cè)試切換:

Snip20160813_105.png
Snip20160813_106.png

測(cè)試成功!

關(guān)于如上apache指令的說明:

ProxyPreserveHost

{On|Off}:如果啟用此功能畅厢,代理會(huì)將用戶請(qǐng)求報(bào)文中的Host:行發(fā)送給后端的服務(wù)器冯痢,而不再使用ProxyPass指定的服務(wù)器地址。如果想在反向代理中支持虛擬主機(jī),則需要開啟此項(xiàng)浦楣,否則就無需打開此功能袖肥。

ProxyVia

{On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多級(jí)代理中控制代理請(qǐng)求的流向振劳。默認(rèn)為Off椎组,即不啟用此功能;On表示每個(gè)請(qǐng)求和響應(yīng)報(bào)文均添加Via:历恐;Full表示每個(gè)Via:行都會(huì)添加當(dāng)前apache服務(wù)器的版本號(hào)信息寸癌;Block表示每個(gè)代理請(qǐng)求報(bào)文中的Via:都會(huì)被移除。如下圖夹供,

Snip20160812_72.png

ProxyRequests

{On|Off}:是否開啟apache正向代理的功能灵份;啟用此項(xiàng)時(shí)為了代理http協(xié)議必須啟用mod_proxy_http模塊。同時(shí)哮洽,如果為apache設(shè)置了ProxyPass填渠,則必須將ProxyRequests設(shè)置為Off。

ProxyPass [path] !|url [key=value key=value...]]

將后端服務(wù)器某URL與當(dāng)前服務(wù)器的某虛擬路徑關(guān)聯(lián)起來作為提供服務(wù)的路徑鸟辅,path為當(dāng)前服務(wù)器上的某虛擬路徑氛什,url為后端服務(wù)器上某URL路徑。使用此指令時(shí)必須將ProxyRequests的值設(shè)置為Off匪凉。需要注意的是枪眉,如果path以“/”結(jié)尾,則對(duì)應(yīng)的url也必須以“/”結(jié)尾再层,反之亦然贸铜。另外,mod_proxy模塊在httpd 2.1的版本之后支持與后端服務(wù)器的連接池功能聂受,連接按需創(chuàng)建蒿秦,可以保存至連接池中以備進(jìn)一步使用。連接池大小或其它設(shè)定可以通過在ProxyPass中使用key=value的方式定義蛋济。常用的key如下所示:

  • min:連接池的最小容量棍鳖,此值與實(shí)際連接個(gè)數(shù)無關(guān),僅表示連接池最小要初始化的空間大小碗旅。
  • max:連接池的最大容量渡处,每個(gè)MPM都有自己獨(dú)立的容量;值與MPM本身有關(guān)祟辟,如Prefork總是為1医瘫,而其它的則取決于ThreadsPerChild指令的值。
  • loadfactor:用于負(fù)載均衡集群配置中旧困,定義對(duì)應(yīng)后端服務(wù)器的權(quán)重登下,取值范圍為1-100茫孔。
  • retry:當(dāng)apache將請(qǐng)求發(fā)送至后端服務(wù)器得到錯(cuò)誤響應(yīng)時(shí)等待多長(zhǎng)時(shí)間以后再重試。單位是秒鐘被芳。如果Proxy指定是以balancer://開頭缰贝,即用于負(fù)載均衡集群時(shí),其還可以接受一些特殊的參數(shù)畔濒,如下所示:(這些內(nèi)容我們會(huì)在下一篇tomcat負(fù)載均衡集群中詳細(xì)講解)
  • lbmethod:apache實(shí)現(xiàn)負(fù)載均衡的調(diào)度方法剩晴,默認(rèn)是byrequests,即基于權(quán)重將統(tǒng)計(jì)請(qǐng)求個(gè)數(shù)進(jìn)行調(diào)度侵状,bytraffic則執(zhí)行基于權(quán)重的流量計(jì)數(shù)調(diào)度赞弥,bybusyness通過考量每個(gè)后端服務(wù)器的當(dāng)前負(fù)載進(jìn)行調(diào)度。
  • maxattempts:放棄請(qǐng)求之前實(shí)現(xiàn)故障轉(zhuǎn)移的次數(shù)趣兄,默認(rèn)為1绽左,其最大值不應(yīng)該大于總的節(jié)點(diǎn)數(shù)。
  • nofailover:取值為On或Off艇潭,設(shè)置為On時(shí)表示后端服務(wù)器故障時(shí)拼窥,用戶的session將損壞;因此蹋凝,在后端服務(wù)器不支持session復(fù)制時(shí)可將其設(shè)置為On鲁纠。
  • stickysession:調(diào)度器的sticky session的名字,根據(jù)web程序語言的不同鳍寂,其值為JSESSIONID或PHPSESSIONID改含。

上述指令除了可使用ProxySet指令直接進(jìn)行設(shè)置,也能在banlancer://或ProxyPass中設(shè)定之外迄汛,具體參考:

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html

ProxyPassReverse

對(duì) HTTP 響應(yīng)報(bào)文的 URL 進(jìn)行調(diào)整捍壤。

用于讓 apache 調(diào)整HTTP重定向響應(yīng)報(bào)文中的Location、Content-Location及URI首部字段所對(duì)應(yīng)的URL鞍爱,在反向代理環(huán)境中必須使用此指令避免重定向報(bào)文繞過proxy服務(wù)器白群。因?yàn)?HTTP 重定向到了后端服務(wù)器,而后端服務(wù)器應(yīng)該隱藏在反向代理的后面硬霍,應(yīng)該對(duì)用戶不可見×眩可參考:

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse

3.2.基于mod_jk實(shí)現(xiàn)負(fù)載均衡


說明:
為了避免用戶直接訪問后端Tomcat實(shí)例唯卖,影響負(fù)載均衡的效果,建議在Tomcat 7的各實(shí)例上禁用HTTP/1.1連接器躬柬。

為每一個(gè)Tomcat 7實(shí)例的引擎添加jvmRoute參數(shù)拜轨,并通過其為當(dāng)前引擎設(shè)置全局惟一標(biāo)識(shí)符。如下所示允青。需要注意的是橄碾,每一個(gè)實(shí)例的jvmRoute的值均不能相同。

<Engine name="Catalina" defaultHost="www.test.com" jvmRoute="TomcatA">

<Engine name="Catalina" defaultHost="www.test.com" jvmRoute="TomcatB">

同樣的首先來修改httpd.conf配置文件,

[root@apache ~]# vim /etc/httpd/httpd.conf
#啟用httpd-jk.conf

#Include /etc/httpd/extra/httpd-proxy.conf
Include /etc/httpd/extra/httpd-jk.conf

下面我們來修改一下httpd-jk.conf配置文件法牲,

[root@apache ~]# vim /etc/httpd/extra/httpd-jk.conf
LoadModule jk_module modules/mod_jk.so #加載mod_jk模塊
JkWorkersFile /etc/httpd/extra/workers.properties #配置文件位置 
JkLogFile logs/mod_jk.log #日志 
JkLogLevel debug #日志級(jí)別 
JkMount /* lbcluster #負(fù)載均衡器名稱 
JkMount /jkstatus/ stat1 #狀態(tài)信息

接下來史汗,編輯/etc/httpd/extra/workers.properties,添加如下內(nèi)容:

[root@apache ~]# vim /etc/httpd/extra/workers.properties
worker.list = lbcluster,stat1 #列表信息
worker.TomcatA.type = ajp13 #支持ajp協(xié)議 
worker.TomcatA.host = 192.168.0.181 #TomcatA實(shí)例IP
worker.TomcatA.port = 8009 #TomcatA實(shí)例端口號(hào) 
worker.TomcatA.lbfactor = 1 #負(fù)載均衡權(quán)重為1 
worker.TomcatB.type = ajp13 
worker.TomcatB.host = 192.168.0.182 
worker.TomcatB.port = 8009 
worker.TomcatB.lbfactor = 1 
worker.lbcluster.type = lb #負(fù)載均衡work拒垃,lb內(nèi)置的類 
worker.lbcluster.sticky_session = 0 #會(huì)話是否綁定 
worker.lbcluster.balance_workers = TomcatA, TomcatB #TomcatA, TomcatB 集群中的實(shí)列 
worker.stat1.type = status #狀態(tài)信息

測(cè)試一下配置正確性:

[root@vm1 extra]# service httpd configtest
Syntax OK

訪問測(cè)試:

Snip20160813_108.png
Snip20160813_110.png

測(cè)試成功停撞!

再說明一下配置:

workers.properties文件一般由兩類指令組成:一是mod_jk可以連接的各worker名稱列表,二是每一個(gè)worker的屬性配置信息悼瓮。它們分別遵循如下使用語法戈毒。

worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>

其中worker.list指令可以重復(fù)指定多次,而worker name則是Tomcat中engine組件jvmRoute參數(shù)的值横堡。如:worker.TomcatA.host=172.16.100.1

根據(jù)其工作機(jī)制的不同埋市,worker有多種不同的類型,這是需要為每個(gè)worker定義的一項(xiàng)屬性worker.<work name>.type命贴。常見的類型如下:

  • ajp13:此類型表示當(dāng)前worker為一個(gè)運(yùn)行著的Tomcat實(shí)例道宅。
  • lb:lb即load balancing,專用于負(fù)載均衡場(chǎng)景中的woker套么;此worker并不真正負(fù)責(zé)處理用戶請(qǐng)求培己,而是將用戶請(qǐng)求調(diào)度給其它類型為ajp13的worker。
  • status:用戶顯示分布式環(huán)境中各實(shí)際worker工作狀態(tài)的特殊worker胚泌,它不處理任何請(qǐng)求省咨,也不關(guān)聯(lián)到任何實(shí)際工作的worker實(shí)例。具體示例如請(qǐng)參見后文中的配置玷室。
  • worker其它常見的屬性說明:
  • host:Tomcat 7的worker實(shí)例所在的主機(jī)零蓉;
  • port:Tomcat 7實(shí)例上AJP1.3連接器的端口;
  • connection_pool_minsize:最少要保存在連接池中的連接的個(gè)數(shù)穷缤;默認(rèn)為pool_size/2敌蜂;
  • connection_pool_timeout:連接池中連接的超時(shí)時(shí)長(zhǎng);
  • mount:由當(dāng)前worker提供的context路徑津肛,如果有多個(gè)則使用空格格開章喉;此屬性可以由JkMount指令替代;
  • retries:錯(cuò)誤發(fā)生時(shí)的重試次數(shù)身坐;
  • socket_timeout:mod_jk等待worker響應(yīng)的時(shí)長(zhǎng)秸脱,默認(rèn)為0,即無限等待部蛇;
  • socket_keepalive:是否啟用keep alive的功能摊唇,1表示啟用,0表示禁用涯鲁;
  • lbfactor:worker的權(quán)重巷查,可以在負(fù)載均衡的應(yīng)用場(chǎng)景中為worker定義此屬性有序;
  • 另外,在負(fù)載均衡模式中岛请,專用的屬性還有:(這些內(nèi)容我們會(huì)在下一篇tomcat負(fù)載均衡集群中詳細(xì)講解)
  • balance_workers:用于負(fù)載均衡模式中的各worker的名稱列表旭寿,需要注意的是,出現(xiàn)在此處的worker名稱一定不能在任何worker.list屬性列表中定義過髓需,并且worker.list屬性中定義的worker名字必須包含負(fù)載均衡worker许师。具體示例請(qǐng)參見后文中的定義。
  • method:可以設(shè)定為R僚匆、T或B微渠;默認(rèn)為R,即根據(jù)請(qǐng)求的個(gè)數(shù)進(jìn)行調(diào)度咧擂;T表示根據(jù)已經(jīng)發(fā)送給worker的實(shí)際流量大小進(jìn)行調(diào)度逞盆;B表示根據(jù)實(shí)際負(fù)載情況進(jìn)行調(diào)度。
  • sticky_session:在將某請(qǐng)求調(diào)度至某worker后松申,源于此址的所有后續(xù)請(qǐng)求都將直接調(diào)度至此worker云芦,實(shí)現(xiàn)將用戶session與某worker綁定。默認(rèn)為值為1贸桶,即啟用此功能舅逸。如果后端的各worker之間支持session復(fù)制,則可以將此屬性值設(shè)為0皇筛。

3.3.查看兩種狀態(tài)信息


兩種狀態(tài)信息:

  • 基于mod_proxy模塊狀態(tài)信息
  • 基于mod_jk模塊的狀態(tài)信息

(1).基于mod_proxy模塊狀態(tài)信息

首先修改配置文件 /etc/httpd/httpd.conf:

[root@vm1 extra]# vi /etc/httpd/httpd.conf

Include /etc/httpd/extra/httpd-proxy.conf
#Include /etc/httpd/extra/httpd-jk.conf

修改 /etc/httpd/extra/httpd-proxy.conf:

[root@vm1 extra]# vi /etc/httpd/extra/httpd-proxy.conf
ProxyRequests Off
<proxy balancer://lbcluster>
    BalancerMember ajp://192.168.0.181:8009 loadfactor=1 route=TomcatA
    BalancerMember ajp://192.168.0.182:8009 loadfactor=1 route=TomcatB
    ProxySet lbmethod=byrequests
    #ProxySet lbmethod=bytraffic
    #ProxySet stickysession=JSESSIONID|jsessionid
    ProxySet nofailover=On
</proxy>
<VirtualHost *:80>
    ServerAdmin admin@test.com
    ServerName www.test.com
    ProxyPass "/" "balancer://lbcluster/"
    ProxyPassReverse "/" "balancer://lbcluster/"
    <Location /balancer-manager>
        SetHandler balancer-manager
        Proxypass !
        Require all granted
    </Location>
    <Proxy *>
        Require all granted
    </Proxy>
    <Location />
        Require all granted
    </Location>
</VirtualHost>

訪問 http://192.168.0.171/balancer-manager 測(cè)試:

Snip20160813_112.png

好了琉历,基于的mod_proxy模塊狀態(tài)信息已配置完成,下面我們演示一下基于mod_jk模塊的狀態(tài)信息水醋。

(2).基于mod_jk模塊的狀態(tài)信息

首先修改httpd.conf配置文件旗笔,

[root@vm1 extra]# vi /etc/httpd/httpd.conf

#Include /etc/httpd/extra/httpd-proxy.conf
Include /etc/httpd/extra/httpd-jk.conf

重啟 httpd:

[root@vm1 extra]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

訪問測(cè)試:http://192.168.0.171/jkstatus/

Snip20160813_113.png

好了,到這里我們狀態(tài)信息查看就到這里了拄踪,下面我們來配置會(huì)話共享集群蝇恶。

四、DeltaManager實(shí)現(xiàn)


1.會(huì)話管理

種類:

  • 標(biāo)準(zhǔn)會(huì)話管理器
  • 持久會(huì)話管理器

(1).標(biāo)準(zhǔn)會(huì)話管理器(StandardManager):

<Manager className="org.apache.catalina.session.StandardManager" 
     maxInactiveInterval="7200"/>

默認(rèn)保存于 $CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的 SESSIONS.ser 文件中惶桐。

  • maxActiveSessions:最多允許的活動(dòng)會(huì)話數(shù)量撮弧,默認(rèn)為-1,表示不限制姚糊;
  • maxInactiveInterval:非活動(dòng)的會(huì)話超時(shí)時(shí)長(zhǎng)贿衍,默認(rèn)為60s;
  • pathname:會(huì)話文件的保存目錄叛拷;

(2).持久會(huì)話管理器(PersistentManager):

將會(huì)話數(shù)據(jù)保存至持久存儲(chǔ)中,并且能在服務(wù)器意外中止后重新啟動(dòng)時(shí)重新加載這些會(huì)話信息岂却。持久會(huì)話管理器支持將會(huì)話保存至文件存儲(chǔ)(FileStore)或JDBC存儲(chǔ)(JDBCStore)中忿薇。

保存至文件中的示例:

<Manager className="org.apache.catalina.session.PersistentManager" 
 saveOnRestart="true"> 
 <Store className="org.apache.catalina.session.FileStore" 
  directory="/data/tomcat-sessions"/> 
</Manager>

每個(gè)用戶的會(huì)話會(huì)被保存至directory指定的目錄中的文件中裙椭,文件名為<session id>.session,并通過后臺(tái)線程每隔一段時(shí)間(checkInterval參數(shù)定義署浩,默認(rèn)為60秒)檢查一次超時(shí)會(huì)話揉燃。

保存至JDBCStore中的示例:

<Manager className="org.apache.catalina.session.PersistentManager" 
 saveOnRestart="true"> 
 <Store className="org.apache.catalina.session.JDBCStore" 
  driverName="com.mysql.jdbc.Driver" 
  connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/> 
</Manager>

2.Manager組件

Manger對(duì)象用于實(shí)現(xiàn)HTTP會(huì)話管理的功能,Tomcat中有5種Manger的實(shí)現(xiàn):

(1).StandardManager
Tomcat6的默認(rèn)會(huì)話管理器筋栋,用于非集群環(huán)境中對(duì)單個(gè)處于運(yùn)行狀態(tài)的Tomcat實(shí)例會(huì)話進(jìn)行管理炊汤。當(dāng)Tomcat關(guān)閉時(shí),這些會(huì)話相關(guān)的數(shù)據(jù)會(huì)被寫入磁盤上的一個(gè)名叫SESSION.ser的文件弊攘,并在Tomcat下次啟動(dòng)時(shí)讀取此文件抢腐。

(2).PersistentManager
當(dāng)一個(gè)會(huì)話長(zhǎng)時(shí)間處于空閑狀態(tài)時(shí)會(huì)被寫入到swap會(huì)話對(duì)象,這對(duì)于內(nèi)存資源比較吃緊的應(yīng)用環(huán)境來說比較有用襟交。
(3).DeltaManager
用于Tomcat集群的會(huì)話管理器迈倍,它通過將改變的會(huì)話數(shù)據(jù)同步給集群中的其它節(jié)點(diǎn)實(shí)現(xiàn)會(huì)話復(fù)制。這種實(shí)現(xiàn)會(huì)將所有會(huì)話的改變同步給集群中的每一個(gè)節(jié)點(diǎn)捣域,也是在集群環(huán)境中用得最多的一種實(shí)現(xiàn)方式啼染。

(4).BackupManager
用于Tomcat集群的會(huì)話管理器,與DeltaManager不同的是焕梅,某節(jié)點(diǎn)會(huì)話的改變只會(huì)同步給集群中的另一個(gè)而非所有節(jié)點(diǎn)迹鹅。

(5).SimpleTcpReplicationManager
Tomcat4時(shí)用到的版本,過于老舊了贞言。

3.DeltaManager具體實(shí)現(xiàn)過程

(1).修改server.xml配置文件

tomcat1:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.0.181"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

以上內(nèi)容定義在Engine容器中斜棚,則表示對(duì)所有主機(jī)均啟動(dòng)用集群功能。如果定義在某Host中蜗字,則表示僅對(duì)此主機(jī)啟用集群功能打肝。(注,tomcat1與tomcat2都要修改E膊丁)粗梭,我們這里將內(nèi)容定義在 Engine 容器中。

tomcat 2:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.0.182"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

這里使用的是 Tomcat 8.5.4 版本级零,要做 session 復(fù)制断医,必須做以下的事情:

  • All your session attributes must implement java.io.Serializable
  • Uncomment the Cluster element in server.xml
  • If you have defined custom cluster valves, make sure you have the ReplicationValve defined as well under the Cluster element in server.xml
  • If your Tomcat instances are running on the same machine, make sure the Receiver.port attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100
  • Make sure your web.xml has the <distributable/> element
  • If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine <Engine name="Catalina" jvmRoute="node01" > and that the jvmRoute attribute value matches your worker name in workers.properties
  • Make sure that all nodes have the same time and sync with NTP service!
  • Make sure that your loadbalancer is configured for sticky session mode.

主要有幾點(diǎn)要注意:

  • 所有啟用集群功能的web應(yīng)用程序,其web.xml中都須添加<distributable/>才能實(shí)現(xiàn)集群功能奏纪。如果某web應(yīng)用程序沒有自己的web.xml鉴嗤,也可以通過復(fù)制默認(rèn)的web.xml至其WEB-INF目錄中實(shí)現(xiàn)。

  • 負(fù)載均衡必須配置為 sticky session 模式(我們剛才為了掩飾切換序调,在兩種負(fù)載均衡中都禁用了 sticky session醉锅,不過后面的測(cè)試中,發(fā)現(xiàn)不能開啟 sticky 模式发绢,否則不能切換硬耍,這一點(diǎn)不知為何)

  • 如果使用 mod_jk垄琐,配置在 Engine 元素中配置 jvmRoute 屬性,這個(gè)已經(jīng)配置了

  • 集群時(shí)間同步

(2).修改web.xml

tomcat1:

[root@tomcat1 ~]# cd /web/webapp/
[root@tomcat1 webapp]# ls 
index.jsp 
[root@tomcat1 webapp]# mkdir WEB-INF 
[root@tomcat1 webapp]# ls 
index.jsp WEB-INF 
[root@tomcat1 webapp]# cp /usr/local/tomcat/conf/web.xml WEB-INF/
[root@tomcat1 ~]# vim /usr/local/tomcat/conf/web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">

<distributable/>

tomcat2:

同上

測(cè)試配置经柴,重啟 tomcat:

service tomcat configtest
service tomcat start

現(xiàn)在我們使用的還是 mod-jk 負(fù)載均衡狸窘,復(fù)習(xí)一下這個(gè):

sticky_session:在將某請(qǐng)求調(diào)度至某worker后,源于此址的所有后續(xù)請(qǐng)求都將直接調(diào)度至此worker坯认,實(shí)現(xiàn)將用戶session與某worker綁定翻擒。默認(rèn)為值為1,即啟用此功能牛哺。如果后端的各worker之間支持session復(fù)制陋气,則可以將此屬性值設(shè)為0。

我們是設(shè)為的0,所以可以直接測(cè)試:

Snip20160813_114.png
Snip20160813_115.png

大家可以從圖中看到,不管你怎么刷新SessionID都不會(huì)變喊积,說明我們的Tomcat的DeltaManager集群配置完成,實(shí)現(xiàn)了多臺(tái)主機(jī)之間會(huì)話共享晶渠。

再來試試 mod_proxy 負(fù)載均衡,配置如前燃观,

[root@vm1 extra]# vi /etc/httpd/httpd.conf
Include /etc/httpd/extra/httpd-proxy.conf
#Include /etc/httpd/extra/httpd-jk.conf

[root@vm1 extra]# vi /etc/httpd/extra/httpd-proxy.conf
ProxyRequests Off
<proxy balancer://lbcluster>
    BalancerMember ajp://192.168.0.181:8009 loadfactor=1 route=TomcatA
    BalancerMember ajp://192.168.0.182:8009 loadfactor=1 route=TomcatB
    ProxySet lbmethod=byrequests
    #ProxySet lbmethod=bytraffic
    #ProxySet stickysession=JSESSIONID|jsessionid # 不能開啟褒脯,一旦開啟,則不能實(shí)現(xiàn)均衡效果
    ProxySet nofailover=On
</proxy>
<VirtualHost *:80>
    ServerAdmin admin@test.com
    ServerName www.test.com
    ProxyPass "/" "balancer://lbcluster/"
    ProxyPassReverse "/" "balancer://lbcluster/"
    <Location /balancer-manager>
        SetHandler balancer-manager
        Proxypass !
        Require all granted
    </Location>
    <Proxy *>
        Require all granted
    </Proxy>
    <Location />
        Require all granted
    </Location>
</VirtualHost>


[root@vm1 extra]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

測(cè)試訪問:

Snip20160813_114.png
Snip20160813_115.png

實(shí)現(xiàn)了一樣的效果缆毁,sessinoID 不管怎么刷新番川,都不會(huì)改變。最后我們來實(shí)現(xiàn)一下脊框,Nginx負(fù)載均衡Tomcat颁督。

五、Nginx實(shí)現(xiàn)Tomcat負(fù)載均衡


1.實(shí)驗(yàn)拓?fù)?/p>

Nginx: 192.168.0.171
Tomcat1: 192.168.0.181
Tomcat2: 192.168.0.182

      Nginx
        |
       / \
Tomcat1  Tomcat2

2.添加 nginx.repo浇雹,使用 yum 安裝 nginx:

[root@vm1 ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

[root@vm1 ~]# yum install nginx

Installed:
  nginx.x86_64 0:1.10.1-1.el6.ngx

3.停止httpd

[root@vm1 ~]# service httpd stop

4.配置nginx負(fù)載均衡

[root@vm1 ~]# cat /etc/nginx/conf.d/default.conf
upstream tomcat {
    server 192.168.0.181;
    server 192.168.0.182;
}
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
        proxy_pass http://tomcat;
    }

    #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   /usr/share/nginx/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;
    #}
}

5.檢查配置并啟動(dòng) nginx

[root@vm1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@vm1 ~]# service nginx start
Starting nginx:                                            [  OK  ]
[root@vm1 ~]# ss -ntl
State      Recv-Q Send-Q          Local Address:Port            Peer Address:Port
LISTEN     0      128                         *:80                         *:*
LISTEN     0      128                        :::22                        :::*
LISTEN     0      128                         *:22                         *:*
LISTEN     0      100                       ::1:25                        :::*
LISTEN     0      100                 127.0.0.1:25                         *:*

6.進(jìn)行測(cè)試

Snip20160813_114.png
Snip20160813_115.png

好了沉御,到這里Nginx實(shí)現(xiàn)tomcat的負(fù)載均衡與會(huì)話共享配置完成。最后昭灵,希望大家有所收獲吧吠裆,_……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市烂完,隨后出現(xiàn)的幾起案子试疙,更是在濱河造成了極大的恐慌,老刑警劉巖抠蚣,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祝旷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怀跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門奇昙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敌完,你說我怎么就攤上這事⊙虺酰” “怎么了滨溉?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)长赞。 經(jīng)常有香客問我晦攒,道長(zhǎng),這世上最難降的妖魔是什么得哆? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任脯颜,我火速辦了婚禮,結(jié)果婚禮上贩据,老公的妹妹穿的比我還像新娘栋操。我一直安慰自己,他們只是感情好饱亮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布矾芙。 她就那樣靜靜地躺著,像睡著了一般近上。 火紅的嫁衣襯著肌膚如雪剔宪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天壹无,我揣著相機(jī)與錄音葱绒,去河邊找鬼。 笑死斗锭,一個(gè)胖子當(dāng)著我的面吹牛地淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拒迅,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼骚秦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了璧微?” 一聲冷哼從身側(cè)響起作箍,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎前硫,沒想到半個(gè)月后胞得,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屹电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年阶剑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跃巡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牧愁,死狀恐怖素邪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猪半,我是刑警寧澤兔朦,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站磨确,受9級(jí)特大地震影響沽甥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乏奥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一摆舟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邓了,春花似錦恨诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痕鳍,卻和暖如春硫豆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笼呆。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工熊响, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诗赌。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓汗茄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親铭若。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洪碳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容