Keepalived + Nginx 實現高可用 Web 負載均衡

之前的文章中提到了 Nginx 作為反向代理服務器是把多個來自不同客戶端的請求轉發(fā)到私有網絡下的各個對應的服務下,這么看來朱浴, Nginx 就是一個中轉器吊圾,所有的請求都要從 Nginx 中通過。那么 Nginx 的穩(wěn)定性和可用性就必然有很高的要求翰蠢。

此文將介紹使用 Keepalived 對 Nginx 進行主備的高可用配置项乒。

一、Keepalived 簡要介紹


Keepalived 是一種高性能的服務器高可用或熱備解決方案梁沧, Keepalived 可以用來防止服務器單點故障的發(fā)生檀何,通過配合 Nginx 可以實現 web 前端服務的高可用。

Keepalived 以 VRRP 協(xié)議為實現基礎趁尼,用 VRRP 協(xié)議來實現高可用性(HA)埃碱。 VRRP(Virtual Router Redundancy Protocol) 協(xié)議是用于實現路由器冗余的協(xié)議, VRRP 協(xié)議將兩臺或多臺路由器設備虛擬成一個設備酥泞,對外提供虛擬路由器 IP(一個或多個)砚殿,而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER芝囤,或者是通過算法選舉產生似炎, MASTER 實現針對虛擬路由器 IP 的各種網絡功能,如 ARP 請求悯姊, ICMP羡藐,以及數據的轉發(fā)等;其他設備不擁有該虛擬 IP悯许,狀態(tài)是 BACKUP仆嗦,除了接收 MASTER 的 VRRP 狀態(tài)通告信息外,不執(zhí)行對外的網絡功能先壕。

當主機失效時瘩扼, BACKUP 將接管原先 MASTER 的網絡功能。VRRP 協(xié)議使用多播數據來傳輸 VRRP 數據垃僚, VRRP 數據使用特殊的虛擬源 MAC 地址發(fā)送數據而不是自身網卡的 MAC 地址集绰, VRRP 運行時只有 MASTER 路由器定時發(fā)送 VRRP 通告信息,表示 MASTER 工作正常以及虛擬路由器 IP (組)谆棺, BACKUP 只接收 VRRP 數據栽燕,不發(fā)送數據,如果一定時間內沒有接收到 MASTER 的通告信息改淑,各 BACKUP 將宣告自己成為 MASTER碍岔,發(fā)送通告信息,重新進行 MASTER 選舉狀態(tài)溅固。

二付秕、方案規(guī)劃


VIP IP HOSTANME Nginx 端口 默認主從
192.168.174.110 192.168.174.200 hadoop1 80 MASTER
192.168.174.110 192.168.174.201 hadoop2 80 BACKUP

CentOS 6.9 x64
keepalived-1.2.24
nginx-1.13.0

三、Nginx 安裝


請參考 CentOS 6.x 編譯安裝 nginx

四侍郭、Keepalived 安裝


需在 hadoop1/hadoop2 兩個節(jié)點均進行如下安裝

1 下載 Keepalived

官方下載地址

http://www.keepalived.org/download.html

下載 1.2.24 版本程序到服務器

[root@hadoop1 keepalived]# pwd
/data/software/keepalived
[root@hadoop1 keepalived]# wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz

2 解壓程序

[root@hadoop1 keepalived]# pwd
/data/software/keepalived
[root@hadoop1 keepalived]# ll
total 812
-rw-r--r--. 1 root root 829602 May 27 03:21 keepalived-1.2.24.tar.gz
[root@hadoop1 keepalived]# tar zxvf keepalived-2.0.0.tar.gz

3 編譯安裝

[root@hadoop1 keepalived]# cd keepalived-1.2.24
[root@hadoop1 keepalived-1.2.24]# pwd
/data/software/keepalived/keepalived-1.2.24
[root@hadoop1 keepalived-1.2.24]# ./configure --prefix=/usr/local/keepalived
[root@hadoop1 keepalived-1.2.24]# make && make install

4 將 keepalived 安裝成 Linux 系統(tǒng)服務

因為沒有使用 keepalived 的默認路徑安裝(默認是/usr/local) ,安裝完成之后询吴,需要做一些工作復制默認配置文件到默認路徑

[root@hadoop1 keepalived-1.2.24]# mkdir /etc/keepalived
[root@hadoop1 keepalived-1.2.24]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

復制 keepalived 服務腳本到默認的地址

[root@hadoop1 keepalived-1.2.24]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@hadoop1 keepalived-1.2.24]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@hadoop1 keepalived-1.2.24]# ln -s /usr/local/sbin/keepalived /usr/sbin/ 
[root@hadoop1 keepalived-1.2.24]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

賦予權限

[root@hadoop1 init.d]# chmod 755 /etc/init.d/keepalived

設置 keepalived 服務開機啟動

chkconfig keepalived on

五掠河、Keepalived 配置


1 MASTER 節(jié)點配置 - (hadoop1/192.168.174.200):

備份默認配置文件:

[root@hadoop1 keepalived]# pwd
/etc/keepalived
[root@hadoop1 keepalived]# cp keepalived.conf keepalived.conf.bak

清除默認配置并編輯 keepalived 配置文件:

[root@hadoop1 keepalived]#>keepalived.conf
[root@hadoop1 keepalived]# vi keepalived.conf

配置如下內容并保存退出:

! Configuration File for keepalived
global_defs {
   router_id hadoop1 # hostname
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" # 檢測 nginx 的腳本
    interval 2  # 每 2 秒檢測一次
    weight -20  # 如果某一個 nginx 宕機 則權重減 20
}

vrrp_instance VI_1 {
    state MASTER        # 狀態(tài) MASTER BACKUP
    interface eth0      # 綁定的網卡
    virtual_router_id 51        # 虛擬路由的 ID 號,兩個節(jié)點設置必須一樣
    mcast_src_ip 192.168.174.200        # 本機的 IP
    priority 100        # 節(jié)點優(yōu)先級,值范圍 0-254猛计,MASTER 要比 BACKUP 高唠摹,按優(yōu)先級值大小優(yōu)先訪問優(yōu)先級高的
    nopreempt           # 優(yōu)先級高的設置 nopreempt 解決異常恢復后再次搶占的問題
    advert_int 1        # 組播信息發(fā)送間隔奉瘤,兩個節(jié)點設置必須一樣勾拉,默認 1s
    # 設置驗證信息,兩個節(jié)點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 虛擬 IP盗温,兩個節(jié)點設置必須一樣藕赞。
    virtual_ipaddress {
        192.168.174.110
    }

    # nginx 存活狀態(tài)檢測腳本
    track_script {
       chk_nginx
    }
}

2 BACKUP 節(jié)點配置 - (hadoop2/192.168.174.201):

備份默認配置文件:

[root@hadoop2 keepalived]# pwd
/etc/keepalived
[root@hadoop2 keepalived]# cp keepalived.conf keepalived.conf.bak

清除默認配置并編輯 keepalived 配置文件:

[root@hadoop2 keepalived]#>keepalived.conf
[root@hadoop2 keepalived]# vi keepalived.conf

配置如下內容并保存退出:

! Configuration File for keepalived
global_defs {
   router_id hadoop2 # hostname
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh" # 檢測 nginx 的腳本
    interval 2  # 每 2 秒檢測一次
    weight -20  # 如果某一個 nginx 宕機 則權重減 20
}

vrrp_instance VI_1 {
    state BACKUP        # 狀態(tài) MASTER BACKUP
    interface eth0      # 綁定的網卡
    virtual_router_id 51        # 虛擬路由的 ID 號,兩個節(jié)點設置必須一樣
    mcast_src_ip 192.168.174.201        # 本機的 IP
    priority 90         # 節(jié)點優(yōu)先級,值范圍 0-254卖局,MASTER 要比 BACKUP 高斧蜕,按優(yōu)先級值大小優(yōu)先訪問優(yōu)先級高的
    advert_int 1        # 組播信息發(fā)送間隔,兩個節(jié)點設置必須一樣砚偶,默認 1s

    # 設置驗證信息批销,兩個節(jié)點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    # 虛擬 IP,兩個節(jié)點設置必須一樣染坯。
    virtual_ipaddress {
        192.168.174.110
    }

    # nginx 存活狀態(tài)檢測腳本
    track_script {
       chk_nginx
    }
}

注:上方的配置文件中有幾處必須要改動的內容

(1) router_id hadoop1 將 hadoop1 改為配置的 MASTER 節(jié)點的主機名均芽。
(2) mcast_src_ip 192.168.174.200 將 192.168.174.200 改為 配置的 MASTER 節(jié)點的 IP。
(3) virtual_ipaddress {192.168.174.110} 將 192.168.174.110 改為配置 keepalived 集群的兩臺服務器同網段且可用的 IP 作為虛擬 IP单鹿,此 IP 作為負載均衡的訪問 IP掀宋,且可以配置多個。

六仲锄、編寫 Nginx 狀態(tài)檢測腳本


編寫 Nginx 狀態(tài)檢測腳本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)腳本要求:如果 nginx 停止運行布朦,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程昼窗, keepalied將虛擬 ip 綁定到 BACKUP 機器上。

新建并編譯 nginx_check.sh 文件

[root@hadoop1 keepalived]# vim /etc/keepalived/nginx_check.sh

添加如下內容:

#!/bin/bash
# 設置當前服務器的 nginx 的監(jiān)聽端口涛舍,用于下方腳本通過端口號來準確校驗 nginx 的運行狀態(tài)
NGINX_PORT=80
# 校驗指定端口的 nginx 服務的運行情況
function check_nginx() {
  PROCESS_COUNT=`netstat -anp | grep "\<${NGINX_PORT}\>" | grep nginx | wc -l`
  return ${PROCESS_COUNT}
}

check_nginx

if [ $? -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    check_nginx
    if [ $? -eq 0 ];then
        killall keepalived
    fi
fi

注:如果你的 nginx 服務的監(jiān)聽端口設置的不是 80 (/usr/local/nginx/conf/nginx.conf 中默認配置為 80)澄惊,將 NGINX_PORT 改為對應的監(jiān)聽端口。

賦予執(zhí)行權限

[root@hadoop1 keepalived]# chmod 755 /etc/keepalived/nginx_check.sh

七富雅、服務啟停


分別在兩臺服務器執(zhí)行如下命令啟動 keepalived

[root@hadoop1 keepalived]# service keepalived start
Starting keepalived:                                       [  OK  ]
[root@hadoop2 keepalived]# service keepalived start
Starting keepalived:                                       [  OK  ]

注:

由于在 nginx_check.sh 腳本中已經加入了 nginx 檢測及啟動掸驱。因此,此處可以不用啟動 nginx没佑,由 keepalived 來校驗及啟動毕贼。

常用命令

service keepalived start   #啟動服務
service keepalived stop    #停止服務
service keepalived restart #重啟服務

八、驗證


8.1 校驗 nginx/keepalived 進程

hadoop1:

[root@hadoop1 keepalived]# netstat -anp | grep nginx | grep "\<80\>"
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      48008/nginx
[root@hadoop1 keepalived]# ps -ef | grep keepalived | grep -v grep
root      53267      1  0 02:35 ?        00:00:00 keepalived -D
root      53268  53267  0 02:35 ?        00:00:00 keepalived -D
root      53269  53267  0 02:35 ?        00:00:00 keepalived -D

hadoop2:

[root@hadoop2 keepalived]# netstat -anp|grep nginx | grep "\<80\>"
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      25778/nginx
[root@hadoop2 keepalived]# ps -ef | grep keepalived | grep -v grep
root      29559      1  0 02:18 ?        00:00:00 keepalived -D
root      29560  29559  0 02:18 ?        00:00:00 keepalived -D
root      29561  29559  0 02:18 ?        00:00:00 keepalived -D

8.2 校驗虛擬 IP 綁定情況

hadoop1:

[root@hadoop1 keepalived]# ip addr
hadoop1 的虛擬 IP

hadoop2:

[root@hadoop2 keepalived]# ip addr
hadoop2 的虛擬 IP

8.3 校驗訪問

修改兩臺服務器的 nginx 的 index.html 文件

hadoop1:

[root@hadoop1 keepalived]# cd /usr/local/nginx/html
[root@hadoop1 html]# vim index.html

<h1>Welcome to nginx</h1>
改為
<h1>Welcome to nginx -> hadoop1!</h1>
image.png

保存退出

hadoop2:

[root@hadoop2 keepalived]# cd /usr/local/nginx/html
[root@hadoop2 html]# vim index.html

<h1>Welcome to nginx</h1>
改為
<h1>Welcome to nginx -> hadoop2!</h1>

保存退出

修改 hadoop1 的 nginx index.html

HTTP 訪問

在瀏覽器中輸入 http://192.168.174.110:80 訪問蛤奢,如下顯示鬼癣,則表示訪問 keepalived 負載均衡正常陶贼,因為默認優(yōu)先訪問 master 節(jié)點,因此在 master 節(jié)點(hadoop1/192.168.174.130)nginx 服務正常情況下待秃,將一直訪問到的是 master 節(jié)點的服務

修改 hadoop2 的 nginx index.html

測試

停止 master 節(jié)點的 keepalived 服務

[root@hadoop1 html]# service keepalived stop
Stopping keepalived:                                       [  OK  ]
[root@hadoop1 html]# ps -ef | grep keepalived
root      58172 115469  0 02:51 pts/1    00:00:00 grep keepalived

再訪問 http://192.168.174.110/

停止 master 節(jié)點的 keppalived 服務

啟動 master 節(jié)點的 keepalived 服務

[root@hadoop1 html]# service keepalived start
Starting keepalived:                                       [  OK  ]
[root@hadoop1 html]# ps -ef|grep keepalived | grep -v grep
root      58421      1  0 02:53 ?        00:00:00 keepalived -D
root      58423  58421  0 02:53 ?        00:00:00 keepalived -D
root      58424  58421  0 02:53 ?        00:00:00 keepalived -D

再次訪問 http://192.168.174.110/

啟動 master 節(jié)點的 keepalived 服務

可以看到拜秧,訪問到的又是 master 節(jié)點的 nginx 服務了。

至此章郁,Keepalived + Nginx 實現高可用 Web 負載均衡便安裝與配置完成了枉氮。

附錄:keepalived 配置文件說明


引用自:http://blog.csdn.net/xyang81/article/details/52554398

keepalived 服務安裝完成之后,后面的主要工作就是在 keepalived.conf 文件中配置 HA 和負載均衡暖庄。

一個功能比較完整的常用的 keepalived 配置文件聊替,主要包含三塊:

  • 全局定義塊、VRRP實例定義塊和虛擬服務器定義塊培廓。
  • 全局定義塊是必須的惹悄,如果keepalived只用來做ha,
  • 虛擬服務器是可選的医舆。下面是一個功能比較完整的配置文件模板:
#全局定義塊
global_defs {
    # 郵件通知配置
    notification_email {
        email1
        email2
    }
    notification_email_from email
    smtp_server host
    smtp_connect_timeout num
    lvs_id string
    router_id string    ## 標識本節(jié)點的字條串,通常為hostname
}
#VRRP 實例定義塊
vrrp_sync_group string {
    group {
        string
        string
    }
}
vrrp_instance string {
    state MASTER|BACKUP
    virtual_router_id num
    interface string
    mcast_src_ip @IP
    priority num
    advert_int num
    nopreempt
    smtp_alert
    lvs_sync_daemon_interface string
    authentication {
        auth_type PASS|AH
        auth_pass string
    }
    virtual_ipaddress {  # Block limited to 20 IP addresses @IP
        @IP
        @IP
    }
}
#虛擬服務器定義塊
virtual_server (@IP PORT)|(fwmark num) {
    delay_loop num
    lb_algo rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind NAT|DR|TUN
    persistence_timeout num
    protocol TCP|UDP
    real_server @IP PORT {
        weight num
        notify_down /path/script.sh
        TCP_CHECK {
            connect_port num
            connect_timeout num
        }
    }
    real_server @IP PORT {
        weight num
        MISC_CHECK {
            misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)
        }
    }
    real_server @IP PORT {
        weight num
        HTTP_GET|SSL_GET {
            url {
                # You can add multiple url block path alphanum
                digest alphanum
            }
            connect_port num
            connect_timeout num
            nb_get_retry num
            delay_before_retry num
        }
    }
}

配置說明

一俘侠、全局定義塊
1、email通知(notification_email蔬将、smtp_server爷速、smtp_connect_timeout):
用于服務有故障時發(fā)送郵件報警,可選項霞怀,不建議用惫东。需要系統(tǒng)開啟sendmail服務,
建議用第三獨立監(jiān)控服務毙石,如用nagios全面監(jiān)控代替廉沮。
2、lvs_id:lvs負載均衡器標識徐矩,在一個網絡內滞时,它的值應該是唯一的。
3滤灯、router_id:用戶標識本節(jié)點的名稱坪稽,通常為hostname
4、花括號{}:用來分隔定義塊鳞骤,必須成對出現窒百。如果寫漏了,
keepalived運行時不會得到預期的結果豫尽。由于定義塊存在嵌套關系篙梢,
因此很容易遺漏結尾處的花括號,這點需要特別注意美旧。

二渤滞、VRRP實例定義塊
    vrrp_sync_group:同步vrrp級贬墩,用于確定失敗切換(FailOver)包含的路由實例個數。
即在有2個負載均衡器的場景蔼水,一旦某個負載均衡器失效震糖,需要自動切換到另外一個負載均衡器的實例是哪
    group:至少要包含一個vrrp實例,vrrp實例名稱必須和vrrp_instance定義的一致
    vrrp_instance:vrrp實例名
    1> state:實例狀態(tài)趴腋,只有MASTER 和 BACKUP兩種狀態(tài)吊说,并且需要全部大寫。
搶占模式下优炬,其中MASTER為工作狀態(tài)颁井,BACKUP為備用狀態(tài)。當MASTER所在的服務器失效時蠢护,
BACKUP所在的服務會自動把它的狀態(tài)由BACKUP切換到MASTER狀態(tài)雅宾。
當失效的MASTER所在的服務恢復時,BACKUP從MASTER恢復到BACKUP狀態(tài)葵硕。
    2> interface:對外提供服務的網卡接口眉抬,即VIP綁定的網卡接口。
如:eth0懈凹,eth1蜀变。當前主流的服務器都有2個或2個以上的接口(分別對應外網和內網),在選擇網卡接口時介评,一定要核實清楚库北。
    3> mcast_src_ip:本機IP地址
    4> virtual_router_id:虛擬路由的ID號,每個節(jié)點設置必須一樣们陆,
可選擇IP最后一段使用寒瓦,相同的 VRID 為一個組,他將決定多播的 MAC 地址坪仇。
    5> priority:節(jié)點優(yōu)先級杂腰,取值范圍0~254,MASTER要比BACKUP高
    6> advert_int:MASTER與BACKUP節(jié)點間同步檢查的時間間隔椅文,單位為秒
    7> lvs_sync_daemon_inteface:負載均衡器之間的監(jiān)控接口,
類似于 HA HeartBeat 的心跳線颈墅。但它的機制優(yōu)于 Heartbeat,因為它沒有“裂腦”這個問題,
它是以優(yōu)先級這個機制來規(guī)避這個麻煩的雾袱。在 DR 模式中,
lvs_sync_daemon_inteface與服務接口interface使用同一個網絡接口
    8> authentication:驗證類型和驗證密碼官还。類型主要有 PASS芹橡、AH 兩種,通常使用PASS類型望伦,
據說AH使用時有問題林说。驗證密碼為明文煎殷,同一vrrp 實例MASTER與BACKUP使用相同的密碼才能正常通信。
    9> smtp_alert:有故障時是否激活郵件通知
    10> nopreempt:禁止搶占服務腿箩。默認情況豪直,當MASTER服務掛掉之后,
BACKUP自動升級為MASTER并接替它的任務珠移,當MASTER服務恢復后弓乙,
升級為MASTER的BACKUP服務又自動降為BACKUP,
把工作權交給原MASTER钧惧。當配置了nopreempt暇韧,
MASTER從掛掉到恢復,不再將服務搶占過來浓瞪。
    11> virtual_ipaddress:虛擬IP地址池懈玻,可以有多個IP,每個IP占一行乾颁,不需要指定子網掩碼涂乌。注意:這個IP必須與我們的設定的vip保持一致。

三英岭、虛擬服務器virtual_server定義塊
    virtual_server:定義一個虛擬服務器湾盒,這個ip是virtual_ipaddress中定義的其中一個,后面一個空格巴席,然后加上虛擬服務的端口號历涝。
    1> delay_loop:健康檢查時間間隔推盛,單位:秒
    2> lb_algo:負載均衡調度算法烛缔,互聯(lián)網應用常用方式為wlc或rr
    3> lb_kind:負載均衡轉發(fā)規(guī)則。包括DR驾中、NAT赵刑、TUN 3種分衫,一般使用路由(DR)轉發(fā)規(guī)則。
    4> persistence_timeout:http服務會話保持時間般此,單位:秒
    5> protocol:轉發(fā)協(xié)議蚪战,分為TCP和UDP兩種
    real_server:真實服務器IP和端口,可以定義多個
    1> weight:負載權重铐懊,值越大邀桑,轉發(fā)的優(yōu)先級越高
    2> notify_down:服務停止后執(zhí)行的腳本
    3> TCP_CHECK:服務有效性檢測
    * connect_port:服務連接端口
    * connect_timeout:服務連接超時時長,單位:秒
    * nb_get_retry:服務連接失敗重試次數
    * delay_before_retry:重試連接間隔科乎,單位:秒
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末壁畸,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌捏萍,老刑警劉巖太抓,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異令杈,居然都是意外死亡走敌,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門逗噩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掉丽,“玉大人,你說我怎么就攤上這事给赞』颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵片迅,是天一觀的道長残邀。 經常有香客問我,道長柑蛇,這世上最難降的妖魔是什么芥挣? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮耻台,結果婚禮上空免,老公的妹妹穿的比我還像新娘。我一直安慰自己盆耽,他們只是感情好蹋砚,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摄杂,像睡著了一般坝咐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上析恢,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天墨坚,我揣著相機與錄音,去河邊找鬼映挂。 笑死泽篮,一個胖子當著我的面吹牛,可吹牛的內容都是我干的柑船。 我是一名探鬼主播帽撑,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鞍时!你這毒婦竟也來了油狂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎专筷,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體蒸苇,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡磷蛹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了溪烤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片味咳。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖檬嘀,靈堂內的尸體忽然破棺而出槽驶,到底是詐尸還是另有隱情,我是刑警寧澤鸳兽,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布掂铐,位于F島的核電站,受9級特大地震影響揍异,放射性物質發(fā)生泄漏全陨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一衷掷、第九天 我趴在偏房一處隱蔽的房頂上張望辱姨。 院中可真熱鬧,春花似錦戚嗅、人聲如沸雨涛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽替久。三九已至,卻和暖如春医瘫,著一層夾襖步出監(jiān)牢的瞬間侣肄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工醇份, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稼锅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓僚纷,卻偏偏與公主長得像矩距,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子怖竭,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容