supervisord實戰(zhàn)及集群管理

1. 什么是supervisor

supervisor是一個Linux/Unix系統(tǒng)上的進程監(jiān)控工具资铡,supervisor是一個Python開發(fā)的通用的進程管理程序,可以管理和監(jiān)控Linux上面的進程爱沟,能將一個普通的命令行進程變?yōu)楹笈_daemon信夫,并監(jiān)控進程狀態(tài),異常退出時能自動重啟准潭。不過同daemontools一樣,它不能監(jiān)控daemon進程

supervisor官網點此域仇。

2. 為什么用supervisor

  • 使用簡單
    supervisor提供了一種統(tǒng)一的方式來start刑然、stop、monitor你的進程暇务, 進程可以單獨控制泼掠,也可以成組的控制。你可以在本地或者遠程命令行或者web接口來配置Supervisor垦细。
    在linux下的很多程序通常都是一直運行著的武鲁,一般來說都需要自己編寫一個能夠實現(xiàn)進程start/stop/restart/reload功能的腳本,然后放到/etc/init.d/下面蝠检。但這樣做也有很多弊端沐鼠,第一我們要為每個程序編寫一個類似腳本,第二,當這個進程掛掉的時候饲梭,linux不會自動重啟它的乘盖,想要自動重啟的話,我們還要自己寫一個監(jiān)控重啟腳本憔涉。
    而supervisor則可以完美的解決這些問題订框。supervisor管理進程,就是通過fork/exec的方式把這些被管理的進程兜叨,當作supervisor的子進程來啟動穿扳。這樣的話,我們只要在supervisor的配置文件中国旷,把要管理的進程的可執(zhí)行文件的路徑寫進去就OK了矛物。第二,被管理進程作為supervisor的子進程跪但,當子進程掛掉的時候履羞,父進程可以準確獲取子進程掛掉的信息的,所以當然也就可以對掛掉的子進程進行自動重啟屡久,當然重啟還是不重啟忆首,也要看你的配置文件里面有木有設置autostart=true了。
    supervisor通過INI格式配置文件進行配置被环,很容易掌握糙及,它為每個進程提供了很多配置選項,可以使你很容易的重啟進程或者自動的輪轉日志筛欢。
  • 集中管理
    supervisor管理的進程丁鹉,進程組信息,全部都寫在一個ini格式的文件里就OK了悴能。而且揣钦,我們管理supervisor的時候的可以在本地進行管理,也可以遠程管理漠酿,而且supervisor提供了一個web界面冯凹,我們可以在web界面上監(jiān)控,管理進程炒嘲。 當然了宇姚,本地,遠程和web管理的時候夫凸,需要調用supervisor的xml_rpc接口浑劳,這個也是后話。
    supervisor可以對進程組統(tǒng)一管理夭拌,也就是說咱們可以把需要管理的進程寫到一個組里面魔熏,然后我們把這個組作為一個對象進行管理衷咽,如啟動,停止蒜绽,重啟等等操作镶骗。而linux系統(tǒng)則是沒有這種功能的,我們想要停止一個進程躲雅,只能一個一個的去停止鼎姊,要么就自己寫個腳本去批量停止。

3. supervisor組件

  • supervisord
    主進程,負責管理進程的server相赁,它會根據(jù)配置文件創(chuàng)建指定數(shù)量的應用程序的子進程相寇,管理子進程的整個生命周期,對crash的進程重啟钮科,對進程變化發(fā)送事件通知等唤衫。同時內置web server和XML-RPC Interface,輕松實現(xiàn)進程管理跺嗽。。該服務的配置文件在/etc/supervisor/supervisord.conf页藻。
  • supervisorctl
    客戶端的命令行工具桨嫁,提供一個類似shell的操作接口,通過它你可以連接到不同的supervisord進程上來管理它們各自的子程序份帐,命令通過UNIX socket或者TCP來和服務通訊璃吧。用戶通過命令行發(fā)送消息給supervisord,可以查看進程狀態(tài)废境,加載配置文件畜挨,啟停進程,查看進程標準輸出和錯誤輸出噩凹,遠程操作等巴元。服務端也可以要求客戶端提供身份驗證之后才能進行操作。
  • Web Server
    supervisor提供了web server功能驮宴,可通過web控制進程(需要設置[inethttpserver]配置項)逮刨。
  • XML-RPC Interface
    XML-RPC接口, 就像HTTP提供WEB UI一樣堵泽,用來控制supervisor和由它運行的程序修己。

4. 安裝、配置迎罗、使用

supervisor是python編寫的睬愤,可以用easy_install、pip都可以安裝纹安,比如在我的centos機器下尤辱,安裝命令如下:

yum install python-setuptools
easy_install pip
pip install superviso

在這里我使用pip安裝之后砂豌,在創(chuàng)建配置文件的時候出錯,所以我又選擇了使用easy_install supervisor的安裝方法

當然也可以下載源碼進行安裝啥刻,比如:

wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz --no-check-certificat

tar -zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
sudo python setup.py install

安裝之后可以直接supervisord運行驗證是否成功奸鸯,如果報錯,再逐一解決可帽,比如可能會報meld3版本問題娄涩,這里給出安裝步驟:

wget http://effbot.org/media/downloads/elementtree-1.2.7-20070827-preview.zip
unzip elementtree-1.2.7-20070827-preview.zip  &&  cd elementtree-1.2.7-20070827-preview
python setup.py install

或者下載此版本:

wget http://www.plope.com/software/meld3/meld3-0.6.5.tar.gz
tar -xf meld3-0.6.5.tar.gz && cd meld3-0.6.5
python setup.py install

如果安裝成功就可以進行下一步了:設置配置文件。

### 生成配置文件映跟,且放在/etc目錄下
echo_supervisord_conf > /etc/supervisord.conf  

###為了不將所有新增配置信息全寫在一個配置文件里蓄拣,這里新建一個文件夾,每個程序設置一個配置文件努隙,相互隔離
mkdir /etc/supervisord.d/  

### 修改配置文件
vim /etc/supervisord.conf

### 加入以下配置信息
[include]
files = /etc/supervisord.d/*.conf

### 在supervisord.conf中設置通過web可以查看管理的進程球恤,加入以下代碼(默認即有,取消注釋即可)    
[inet_http_server] 
port=9001
username=user      
password=123

啟動supervisord

 # supervisord -c /etc/supervisord.conf

查看一下是否監(jiān)聽

 # lsof -i:9001
 COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
 superviso 14685 root    4u  IPv4 20155719      0t0  TCP *:etlservicemgr (LISTEN)

現(xiàn)在通過 http://ip:9001/ 就可以查看supervisor的web界面了(默認用戶名及密碼是user和123)荸镊,當然目前還沒有加入任何監(jiān)控的程序咽斧。

[圖片上傳失敗...(image-2ca030-1524884612543)]

下面寫一個簡單的python腳本,用來驗證supervisor的監(jiān)控效果躬存。

#cat /root/temp/test_http.py   ###以下即是test_http.py腳本中的代碼
#!/usr/bin/env python
# coding=utf-8
import sys  
import BaseHTTPServer  
from SimpleHTTPServer import SimpleHTTPRequestHandler  
HandlerClass = SimpleHTTPRequestHandler  
ServerClass = BaseHTTPServer.HTTPServer  
Protocol = "HTTP/1.0"  

if __name__ == "__main__":
    if sys.argv[1:]:  
        port = int(sys.argv[1])  
    else:  
        port = 10000  

    server_address = ('0.0.0.0', port)  
    HandlerClass.protocol_version = Protocol  
    httpd = ServerClass(server_address, HandlerClass)  

    sa = httpd.socket.getsockname()  
    print "Serving HTTP on", sa[0], "port", sa[1], "..."  
    httpd.serve_forever()

增加一個配置文件张惹,以便supervisor用來監(jiān)控test_http.py程序。

#cat /etc/supervisord.d/supervisor_test_http.conf  ### 以下即為配置文件中的內容
[program:test_http]
command=python /root/temp/test_http.py 9999    ; 被監(jiān)控的進程路徑
directory=/root/temp                ; 執(zhí)行前要不要先cd到目錄去岭洲,一般不用
priority=1                    ;數(shù)字越高宛逗,優(yōu)先級越高
numprocs=1                    ; 啟動幾個進程
autostart=true                ; 隨著supervisord的啟動而啟動
autorestart=true              ; 自動重啟。盾剩。當然要選上了
startretries=10               ; 啟動失敗時的最多重試次數(shù)
exitcodes=0                   ; 正常退出代碼(是說退出代碼是這個時就不再重啟了嗎雷激?待確定)
stopsignal=KILL               ; 用來殺死進程的信號
stopwaitsecs=10               ; 發(fā)送SIGKILL前的等待時間
redirect_stderr=true          ; 重定向stderr到stdout

重新啟動supervisord,或者重新加載配置文件:

supervisorctl reload
### 或者
supervisorctl -c /etc/supervisord.conf

此時再訪問http頁面告私,就會發(fā)現(xiàn)test_http.py程序已經被監(jiān)控了屎暇,且已經自動啟動了。

[圖片上傳失敗...(image-7d6113-1524884612543)]

此時也可以訪問test_http.py程序提供的http服務了驻粟,比如http://ip:9999恭垦。

注意:supervisor只能監(jiān)控前臺程序, 如果你的程序是通過fork方式實現(xiàn)的daemon服務格嗅,則不能用它監(jiān)控番挺,否則supervisor> status 會提示:BACKOFF Exited too quickly (process log may have details)。 因此像apache屯掖、tomcat服務默認啟動都是按daemon方式啟動的玄柏,則不能通過supervisor直接運行啟動腳本(service httpd start),相反要通過一個包裝過的啟停腳本來完成贴铜,比如tomcat在supervisor下的啟停腳本請參考:Controlling tomcat with supervisor或者supervisor-tomcat.conf粪摘。

另外瀑晒,可以將supervisor隨系統(tǒng)啟動而啟動,Linux 在啟動的時候會執(zhí)行 /etc/rc.local 里面的腳本徘意,所以只要在這里添加執(zhí)行命令即可:

# 如果是 Ubuntu 添加以下內容(這里要寫全路徑苔悦,因為此時PATH的環(huán)境變量未必設置)
/usr/local/bin/supervisord -c /etc/supervisord.conf

# 如果是 Centos 添加以下內容
/usr/bin/supervisord -c /etc/supervisord.conf

6. supervisor管理

supervisor的管理可以用命令行工具(supervisorctl)或者web界面管理,如果一步步按上面步驟操作椎咧,那么web管理就可以正常使用了玖详,這里單獨介紹下supervisorctl命令工具:

### 查看supervisorctl支持的命令
# supervisorctl help    
default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

### 查看當前運行的進程列表
# supervisorctl status
test_http                        RUNNING   pid 28087, uptime 0:05:17

其中

  • update 更新新的配置到supervisord(不會重啟原來已運行的程序)
  • reload,載入所有配置文件勤讽,并按新的配置啟動蟋座、管理所有進程(會重啟原來已運行的程序)
  • start xxx: 啟動某個進程
  • restart xxx: 重啟某個進程
  • stop xxx: 停止某一個進程(xxx),xxx為[program:theprogramname]里配置的值
  • stop groupworker: 重啟所有屬于名為groupworker這個分組的進程(start,restart同理)
  • stop all脚牍,停止全部進程向臀,注:start、restart诸狭、stop都不會載入最新的配置文
  • reread券膀,當一個服務由自動啟動修改為手動啟動時執(zhí)行一下就ok

注意:如果原來的程序啟動時需要帶上參數(shù),那通過supervisorctl start時應該先寫一個shell腳本驯遇,然后supervisorctl運行該腳本即可芹彬。

7. supervisor配置參數(shù)介紹

supervisord的配置文件主要由幾個配置段構成,配置項以K/V格式呈現(xiàn)妹懒。

  • unixhttpserver配置塊

在該配置塊的參數(shù)項表示的是一個監(jiān)聽在socket上的HTTP server雀监,如果[unixhttpserver]塊不在配置文件中或被注釋双吆,則不會啟動基于socket的HTTP server眨唬。該塊的參數(shù)介紹如下:

- file:一個unix domain socket的文件路徑,HTTP/XML-RPC會監(jiān)聽在這上面
- chmod:在啟動時修改unix domain socket的mode
- chown:修改socket文件的屬主
- username:HTTP server在認證時的用戶名
- password:認證密碼

  • inethttpserver配置塊

在該配置塊的參數(shù)項表示的是一個監(jiān)聽在TCP上的HTTP server好乐,如果[inethttpserver]塊不在配置文件中或被注釋匾竿,則不會啟動基于TCP的HTTP server。該塊的參數(shù)介紹如下:

- port:TCP監(jiān)聽的地址和端口(ip:port)蔚万,這個地址會被HTTP/XML-RPC監(jiān)聽
- username:HTTP server在認證時的用戶名
- password:認證密碼

比如:

 [inet_http_server]         ; inet (TCP) server disabled by default
 port=0.0.0.0:9001          ; (ip_address:port specifier, *:port for all iface)
 username=user              ; (default is no username (open server))
 password=123               ; (default is no password (open server))

表示監(jiān)聽在9001端口岭妖,需要使用用戶名+密碼的方式訪問,訪問地址是:http//127.0.0.1:9001反璃。

  • supervisord配置塊

該配置塊的參數(shù)項是關于supervisord進程的全局配置項昵慌。該塊的參數(shù)介紹如下:

- logfile:log文件路徑
- logfile_maxbytes:log文件達到多少后自動進行輪轉,單位是KB淮蜈、MB斋攀、GB。如果設置為0則表示不限制日志文件大小
- logfile_backups:輪轉日志備份的數(shù)量梧田,默認是10淳蔼,如果設置為0侧蘸,則不備份
- loglevel:error、warn鹉梨、info讳癌、debug、trace存皂、blather晌坤、critical
- pidfile:pid文件路徑
- umask:umask值,默認022
- nodaemon:如果設置為true艰垂,則supervisord在前臺啟動泡仗,而不是以守護進程啟動
- minfds:supervisord在成功啟動前可用的最小文件描述符數(shù)量,默認1024
- minprocs:supervisord在成功啟動前可用的最小進程描述符數(shù)量猜憎,默認200
- nocleanup:防止supervisord在啟動的時候清除已經存在的子進程日志文件
- childlogdir:自動啟動的子進程的日志目錄
- user:supervisord的運行用戶
- directory:supervisord以守護進程運行的時候切換到這個目錄
- strip_ansi:消除子進程日志文件中的轉義序列
- environment:一個k/v對的list列表

該塊的參數(shù)通常不需要改動就可以使用娩怎,當然也可以按需修改。

  • program配置塊

該塊就是我們要監(jiān)控的程序的配置項胰柑。該配置塊的頭部是有固定格式的截亦,一個關鍵字program,后面跟著一個冒號柬讨,接下來才是程序名崩瓤。例如:[program:foo],foo就是程序名踩官,在使用supervisorctl來操作程序的時候却桶,就是以foo來標明的。該塊的參數(shù)介紹如下:

- command:啟動程序使用的命令蔗牡,可以是絕對路徑或者相對路徑
- process_name:一個python字符串表達式颖系,用來表示supervisor進程啟動的這個的名稱,默認值是%(program_name)s
- numprocs:Supervisor啟動這個程序的多個實例辩越,如果numprocs>1嘁扼,則process_name的表達式必須包含%(process_num)s,默認是1
- numprocs_start:一個int偏移值黔攒,當啟動實例的時候用來計算numprocs的值
- priority:權重趁啸,可以控制程序啟動和關閉時的順序,權重越低:越早啟動督惰,越晚關閉不傅。默認值是999
- autostart:如果設置為true,當supervisord啟動的時候赏胚,進程會自動重啟访娶。
- autorestart:值可以是false、true栅哀、unexpected震肮。false:進程不會自動重啟称龙,unexpected:當程序退出時的退出碼不是exitcodes中定義的時,進程會重啟戳晌,true:進程會無條件重啟當退出的時候鲫尊。
- startsecs:程序啟動后等待多長時間后才認為程序啟動成功
- startretries:supervisord嘗試啟動一個程序時嘗試的次數(shù)。默認是3
- exitcodes:一個預期的退出返回碼沦偎,默認是0,2疫向。
- stopsignal:當收到stop請求的時候,發(fā)送信號給程序豪嚎,默認是TERM信號搔驼,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
- stopwaitsecs:在操作系統(tǒng)給supervisord發(fā)送SIGCHILD信號時等待的時間
- stopasgroup:如果設置為true侈询,則會使supervisor發(fā)送停止信號到整個進程組
- killasgroup:如果設置為true舌涨,則在給程序發(fā)送SIGKILL信號的時候,會發(fā)送到整個進程組扔字,它的子進程也會受到影響囊嘉。
- user:如果supervisord以root運行,則會使用這個設置用戶啟動子程序
- redirect_stderr:如果設置為true革为,進程則會把標準錯誤輸出到supervisord后臺的標準輸出文件描述符扭粱。
- stdout_logfile:把進程的標準輸出寫入文件中,如果stdout_logfile沒有設置或者設置為AUTO震檩,則supervisor會自動選擇一個文件位置琢蛤。
- stdout_logfile_maxbytes:標準輸出log文件達到多少后自動進行輪轉,單位是KB抛虏、MB博其、GB。如果設置為0則表示不限制日志文件大小
- stdout_logfile_backups:標準輸出日志輪轉備份的數(shù)量嘉蕾,默認是10贺奠,如果設置為0霜旧,則不備份
- stdout_capture_maxbytes:當進程處于stderr capture mode模式的時候错忱,寫入FIFO隊列的最大bytes值,單位可以是KB挂据、MB以清、GB
- stdout_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候崎逃,PROCESS_LOG_STDERR事件會被觸發(fā)
- stderr_logfile:把進程的錯誤日志輸出一個文件中掷倔,除非redirect_stderr參數(shù)被設置為true
- stderr_logfile_maxbytes:錯誤log文件達到多少后自動進行輪轉,單位是KB个绍、MB勒葱、GB浪汪。如果設置為0則表示不限制日志文件大小
- stderr_logfile_backups:錯誤日志輪轉備份的數(shù)量,默認是10凛虽,如果設置為0死遭,則不備份
- stderr_capture_maxbytes:當進程處于stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值凯旋,單位可以是KB呀潭、MB、GB
- stderr_events_enabled:如果設置為true至非,當進程在寫它的stderr到文件描述符的時候钠署,PROCESS_LOG_STDERR事件會被觸發(fā)
- environment:一個k/v對的list列表
- directory:supervisord在生成子進程的時候會切換到該目錄
- umask:設置進程的umask
- serverurl:是否允許子進程和內部的HTTP服務通訊,如果設置為AUTO荒椭,supervisor會自動的構造一個url

比如下面這個選項塊就表示監(jiān)控一個名叫test_http的程序:

[program:test_http]
command=python test_http.py 10000  ; 被監(jiān)控的進程啟動命令
directory=/root/                ; 執(zhí)行前要不要先cd到目錄去谐鼎,一般不用
priority=1                    ;數(shù)字越高,優(yōu)先級越高
numprocs=1                    ; 啟動幾個進程
autostart=true                ; 隨著supervisord的啟動而啟動
autorestart=true              ; 自動重啟趣惠。该面。當然要選上了
startretries=10               ; 啟動失敗時的最多重試次數(shù)
exitcodes=0                   ; 正常退出代碼(是說退出代碼是這個時就不再重啟了嗎?待確定)
stopsignal=KILL               ; 用來殺死進程的信號
stopwaitsecs=10               ; 發(fā)送SIGKILL前的等待時間
redirect_stderr=true          ; 重定向stderr到stdout

8. 集群管理

supervisor不支持跨機器的進程監(jiān)控信卡,一個supervisord只能監(jiān)控本機上的程序隔缀,大大限制了supervisor的使用。

不過由于supervisor本身支持xml-rpc傍菇,因此也有一些基于supervisor二次開發(fā)的多機器進程管理工具猾瘸。比如:

以上那么多构挤,我都不會嫁怀,一個個試起來也很麻煩,搞不定陪踩,除了最后一個cesi咐低,還好懂點pyhon揽思,勉強安裝成功了。

cesi具體安裝說明請直接參考原Readme见擦。這里只做一點說明:

git clone https://github.com/Gamegos/cesi
cd cesi && mkdir pack
python setup.py build
python setup.py install
sqlite3 /自己的路徑path/userinfo.db < userinfo.sql
cp cesi.conf /etc/cesi.conf  ### 自行修改cesi.conf內容钉汗,kv對,很簡單
cd cesi && python web.py     ### 即可啟動成功

cesi.conf配置文件的設置:

[node:local]                            ### 設置監(jiān)控的各個機器
username = user
password = 123
host = 192.168.14.8
port = 9001

;[node:<node_name2>]                    ### 如果有多臺機器鲤屡,就依次添加
;username = <username>
;password = <password>
;host = <hostname>
;port = <port>

;[environment:<environment_name>]
;members = <node_name>, <node_name2>

[cesi]
database = /root/temp/cesi/userinfo.db    ### 設置db路徑
activity_log = /root/temp/cesi/cesi.log   ### 設置log路徑
host = 0.0.0.0

一切順利的話损痰,可通過頁面http://ip:5000,用戶名酒来,密碼都是admin卢未,最終的效果如下所示:

image.png

cesi repo上的示例效果:

image.png

記錄下用法學習使用。

轉載自:https://www.cnblogs.com/smail-bao/p/5673434.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辽社,隨后出現(xiàn)的幾起案子伟墙,更是在濱河造成了極大的恐慌,老刑警劉巖滴铅,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件远荠,死亡現(xiàn)場離奇詭異,居然都是意外死亡失息,警方通過查閱死者的電腦和手機譬淳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盹兢,“玉大人邻梆,你說我怎么就攤上這事∫锩耄” “怎么了浦妄?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長见芹。 經常有香客問我剂娄,道長,這世上最難降的妖魔是什么玄呛? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任阅懦,我火速辦了婚禮,結果婚禮上徘铝,老公的妹妹穿的比我還像新娘耳胎。我一直安慰自己,他們只是感情好惕它,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布怕午。 她就那樣靜靜地躺著,像睡著了一般淹魄。 火紅的嫁衣襯著肌膚如雪郁惜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天甲锡,我揣著相機與錄音兆蕉,去河邊找鬼。 笑死搔体,一個胖子當著我的面吹牛恨樟,可吹牛的內容都是我干的半醉。 我是一名探鬼主播疚俱,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缩多!你這毒婦竟也來了呆奕?” 一聲冷哼從身側響起养晋,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梁钾,沒想到半個月后绳泉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡姆泻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年零酪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拇勃。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡四苇,死狀恐怖,靈堂內的尸體忽然破棺而出方咆,到底是詐尸還是另有隱情月腋,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布瓣赂,位于F島的核電站榆骚,受9級特大地震影響,放射性物質發(fā)生泄漏煌集。R本人自食惡果不足惜妓肢,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苫纤。 院中可真熱鬧职恳,春花似錦、人聲如沸方面。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恭金。三九已至操禀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間横腿,已是汗流浹背颓屑。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耿焊,地道東北人揪惦。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像罗侯,于是被迫代替她去往敵國和親器腋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容