Nginx高并發(fā)下的優(yōu)化

寫在前面


最近在進(jìn)行服務(wù)器的優(yōu)化疼约,正好在看nginx相關(guān)的知識(shí),所以把一些知識(shí)整理一下蝙泼。參考資料為《Nginx高性能web服務(wù)器詳解》程剥,建議大家都去讀讀這本書(shū)。

內(nèi)核參數(shù)優(yōu)化


把如下的參數(shù)追加到Linux系統(tǒng)的/etc/sysctl.conf文件中汤踏,然后使用如下命令使修改生效:/sbin/sysctl -p

net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1

net.core.netdev_max_backlog參數(shù)

參數(shù)net.core.netdev_max_backlog,表示當(dāng)每個(gè)網(wǎng)絡(luò)接口接受數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí)织鲸,允許發(fā)送隊(duì)列的數(shù)據(jù)包的最大數(shù)目,我們調(diào)整為262144.

net.core.somaxconn

該參數(shù)用于調(diào)節(jié)系統(tǒng)同時(shí)發(fā)起的TCP連接數(shù)溪胶,一般默認(rèn)值為128搂擦,在客戶端高并發(fā)的請(qǐng)求的情況下,該默認(rèn)值較小哗脖,可能導(dǎo)致連接超時(shí)或者重傳問(wèn)題瀑踢,我們可以根據(jù)實(shí)際情況結(jié)合并發(fā)數(shù)來(lái)調(diào)節(jié)此值。

net.ipv4.tcp_max_orphans

該參數(shù)用于設(shè)定系統(tǒng)中最多允許存在多少TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上才避,如果超過(guò)這個(gè)數(shù)字橱夭,沒(méi)有與用戶文件句柄關(guān)聯(lián)到TCP套接字將立即被復(fù)位,同時(shí)發(fā)出警告信息桑逝,這個(gè)限制只是為了簡(jiǎn)單防治Dos攻擊棘劣,一般系統(tǒng)內(nèi)存充足的情況下,可以增大這個(gè)參數(shù)肢娘。

net.ipv4.tcp_max_syn_backlog

該參數(shù)用于記錄尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值呈础,對(duì)于擁有128內(nèi)存的系統(tǒng)而言舆驶,此參數(shù)的默認(rèn)值為1024,對(duì)小內(nèi)存的系統(tǒng)則是128而钞,一般在系統(tǒng)內(nèi)存比較充足的情況下沙廉,可以增大這個(gè)參數(shù)的賦值。

net.ipv4.tcp_timestamps

該參數(shù)用于設(shè)置時(shí)間戳臼节,這個(gè)可以避免序列號(hào)的卷繞撬陵,在一個(gè)1Gb/s的鏈路上,遇到以前用過(guò)的序列號(hào)概率很大网缝,當(dāng)此值賦值為0時(shí)巨税,警用對(duì)于TCP時(shí)間戳的支持,默認(rèn)情況下粉臊,TCP協(xié)議會(huì)讓內(nèi)核接受這種異常的數(shù)據(jù)包草添,針對(duì)Nginx服務(wù)器來(lái)說(shuō),建議將其關(guān)閉扼仲。

net.ipv4.tcp_synack_retries

該參數(shù)用于設(shè)置內(nèi)核放棄TCP連接之前向客戶端發(fā)送SYN+ACK包的數(shù)量远寸,為了建立對(duì)端的連接服務(wù),服務(wù)器和客戶端需要進(jìn)行三次握手屠凶,第二次握手期間驰后,內(nèi)核需要發(fā)送SYN并附帶一個(gè)回應(yīng)前一個(gè)SYN的ACK,這個(gè)參數(shù)主要影響這個(gè)過(guò)程矗愧,一般賦予值為1灶芝,即內(nèi)核放棄連接之前發(fā)送一次SYN+ACK包。

net.ipv4.tcp_syn_retries

該參數(shù)的作用與上一個(gè)參數(shù)類似唉韭,設(shè)置內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量夜涕,賦值為1。

nginx優(yōu)化


nginx的配置文件如下:

user www-data;
pid /run/nginx.pid;

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;

events {
        use epoll;
        worker_connections 65535;
        accept_mutex off;
        multi_accept off;

}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 60 50;
        send_timeout 10s;
        types_hash_max_size 2048;
        client_header_buffer_size 4k;
        client_max_body_size 8m;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";
        gzip_min_length 1024;
        gzip_vary on;
        gzip_comp_level 2;
        gzip_buffers 32 4k;
        gunzip_static on;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

worker_processes

worker_processes用來(lái)設(shè)置Nginx服務(wù)的進(jìn)程數(shù)属愤。推薦是CPU內(nèi)核數(shù)或者內(nèi)核數(shù)的倍數(shù)钠乏,推薦使用CPU內(nèi)核數(shù),因?yàn)槲业腃PU為4核的春塌,所以設(shè)置為4晓避。

worker_cpu_affinity

默認(rèn)情況下,Nginx的多個(gè)進(jìn)程有可能跑在某一個(gè)CPU或CPU的某一核上只壳,導(dǎo)致Nginx進(jìn)程使用硬件的資源不均俏拱,因此綁定Nginx進(jìn)程到不同的CPU上是為了充分利用硬件的多CPU多核資源的目的。

worker_cpu_affinity用來(lái)為每個(gè)進(jìn)程分配CPU的工作內(nèi)核吼句,參數(shù)有多個(gè)二進(jìn)制值表示锅必,每一組代表一個(gè)進(jìn)程,每組中的每一位代表該進(jìn)程使用CPU的情況,1代表使用搞隐,0代表不使用驹愚。所以我們使用worker_cpu_affinity 0001 0010 0100 1000;來(lái)讓進(jìn)程分別綁定不同的核上。

worker_connections

設(shè)置一個(gè)進(jìn)程理論允許的最大連接數(shù)劣纲,理論上越大越好逢捺,但不可以超過(guò)worker_rlimit_nofile的值。還有個(gè)問(wèn)題癞季,linux系統(tǒng)中有個(gè)指令open file resource limit劫瞳,它設(shè)置了進(jìn)程可以打開(kāi)的文件句柄數(shù)量,可以用下面的指令查看你的linux系統(tǒng)中open file resource limit指令的值绷柒,cat /proc/sys/fs/file-max
可以將該指令設(shè)置為23900251

echo "2390251" > /proc/sys/fs/file-max; sysctl -p

worker_rlimit_nofile

設(shè)置毎個(gè)進(jìn)程的最大文件打開(kāi)數(shù)志于。如果不設(shè)的話上限就是系統(tǒng)的ulimit –n的數(shù)字,一般為65535废睦。

use epoll

設(shè)置事件驅(qū)動(dòng)模型使用epoll伺绽。事件驅(qū)動(dòng)模型有select、poll嗜湃、poll等憔恳。

  • select先創(chuàng)建事件的描述符集合,對(duì)于一個(gè)描述符净蚤,可以關(guān)注其上面的Read事件、Write事件以及Exception事件输硝,所以要?jiǎng)?chuàng)建三類事件描述符集合今瀑,分別用來(lái)處理Read事件的描述符、Write事件的描述符点把、Exception事件的描述符橘荠,然后調(diào)用底層的select()函數(shù),等待事件發(fā)生郎逃,輪詢所有事件描述符集合的每一個(gè)事件描述符哥童,檢查是否有事件發(fā)生,有的話就處理褒翰。select效率低贮懈,主要是輪詢效率低,而且還要分別輪詢?nèi)齻€(gè)事件描述符的集合优训。

  • poll方法與select類似朵你,都是先創(chuàng)建一個(gè)關(guān)注事件的描述符集合,再去等待這些事件發(fā)生揣非,然后再輪詢描述符集合抡医,檢查有無(wú)事件發(fā)生,如果有早敬,就去處理忌傻。不同點(diǎn)是poll為Read事件大脉、Write事件以及Exception事件只創(chuàng)建一個(gè)集合,在每個(gè)描述符對(duì)應(yīng)的結(jié)構(gòu)上分別設(shè)置Read事件水孩、Write事件以及Exception事件镰矿。最后輪詢的時(shí)候,可以同時(shí)檢察權(quán)這三個(gè)事件是否發(fā)生荷愕『饣常可以說(shuō),poll庫(kù)是select庫(kù)的優(yōu)化實(shí)現(xiàn)安疗。

  • epoll是Nginx支持的高性能事件驅(qū)動(dòng)庫(kù)之一抛杨。是公認(rèn)的非常優(yōu)秀的事件驅(qū)動(dòng)模型。和poll庫(kù)跟select庫(kù)有很大的不同荐类,最大區(qū)別在于效率怖现。我們知道poll庫(kù)跟select庫(kù)都是創(chuàng)建一個(gè)待處理的事件列表,然后把這個(gè)列表發(fā)給內(nèi)核玉罐,返回的時(shí)候屈嗤,再去輪詢檢查這個(gè)列表,以判斷事件是否發(fā)生吊输。這樣在描述符多的應(yīng)用中饶号,效率就顯得比較低下了。一種比較好的方式是把列表的管理交由內(nèi)核負(fù)責(zé)季蚂,一旦某種事件發(fā)生茫船,內(nèi)核就把發(fā)生事件的描述符列表通知給進(jìn)程,這樣就避免了輪詢整個(gè)描述符列表扭屁。首先算谈,epoll庫(kù)通過(guò)相關(guān)調(diào)用同志內(nèi)核創(chuàng)建一個(gè)有N個(gè)描述符的事件列表,然后給這些描述符設(shè)置所關(guān)注的事件料滥,并把它添加到內(nèi)核的事件列表中去然眼。完成設(shè)置以后,epoll庫(kù)就開(kāi)始等待內(nèi)核通知事件發(fā)生了葵腹,某一事件發(fā)生后高每,內(nèi)核講發(fā)生事件的描述符列表上報(bào)給epoll庫(kù),得到事件列表的epoll庫(kù)践宴,就可以進(jìn)行事件處理了觉义。epoll庫(kù)在linux平臺(tái)是高效的,它支持一個(gè)進(jìn)程打開(kāi)大數(shù)目的事件描述符浴井,上限是系統(tǒng)可以打開(kāi)文件的最大數(shù)目晒骇;同時(shí),epoll庫(kù)的IO效率不隨描述符數(shù)量的增加而線性下降,因?yàn)樗粫?huì)對(duì)內(nèi)核上報(bào)的活躍的描述符進(jìn)行操作洪囤。

accept_mutex

這個(gè)牽扯到《UNIX網(wǎng)絡(luò)編程》第一卷中提到的“驚群”問(wèn)題(Thundering herd problem)徒坡,大致意思是當(dāng)某一時(shí)刻只有一個(gè)網(wǎng)絡(luò)連接到來(lái)時(shí),多個(gè)睡眠進(jìn)程會(huì)被同時(shí)叫醒瘤缩,但只有一個(gè)進(jìn)程可獲得連接喇完,如果每次喚醒的進(jìn)程數(shù)目太多,會(huì)影響一部分系統(tǒng)性能剥啤。在Nginx服務(wù)器的多進(jìn)程下锦溪,就可能出現(xiàn)這個(gè)問(wèn)題,為了解決這個(gè)問(wèn)題府怯,Nginx配置了包含這樣一條指令accept_mutex刻诊,當(dāng)其設(shè)置為開(kāi)啟的時(shí)候,將會(huì)對(duì)多個(gè)Nginx進(jìn)程接受連接進(jìn)行序列化牺丙,防止多個(gè)進(jìn)程對(duì)連接的爭(zhēng)搶则涯。當(dāng)服務(wù)器連接數(shù)不多時(shí),開(kāi)啟這個(gè)參數(shù)會(huì)讓負(fù)載有一定程度的降低冲簿。但是當(dāng)服務(wù)器的吞吐量很大時(shí)粟判,為了效率,請(qǐng)關(guān)閉這個(gè)參數(shù)峦剔;并且關(guān)閉這個(gè)參數(shù)的時(shí)候也可以讓請(qǐng)求在多個(gè)worker間的分配更均衡档礁。所以我們?cè)O(shè)置accept_mutex off;

multi_accept

sendfile


使用開(kāi)啟或關(guān)閉是否使用sendfile()傳輸文件,普通應(yīng)用應(yīng)該設(shè)為on吝沫,下載等IO重負(fù)荷的應(yīng)用應(yīng)該設(shè)為off呻澜,因?yàn)榇笪募贿m合放到buffer中。
傳統(tǒng)文件傳輸中(read/write方式)在實(shí)現(xiàn)上3其實(shí)是比較復(fù)雜的野舶,需要經(jīng)過(guò)多次上下文切換,當(dāng)需要對(duì)一個(gè)文件傳輸時(shí)宰衙,傳統(tǒng)方式是:

  • 調(diào)用read函數(shù)平道,文件數(shù)據(jù)被copy到內(nèi)核緩沖區(qū)
  • read函數(shù)返回,數(shù)據(jù)從內(nèi)核緩沖區(qū)copy到用戶緩沖區(qū)
  • write函數(shù)調(diào)用供炼,將文件數(shù)據(jù)從用戶緩沖區(qū)copy到內(nèi)核與socket相關(guān)的緩沖區(qū)
  • 數(shù)據(jù)從socket緩沖區(qū)copy到相關(guān)協(xié)議引擎

從上面可以看出來(lái)一屋,傳統(tǒng)readwrite進(jìn)行網(wǎng)絡(luò)文件傳輸?shù)姆绞剑谶^(guò)程中經(jīng)歷了四次copy操作袋哼。
硬盤->內(nèi)核buffer->用戶buffer->socket相關(guān)緩沖區(qū)->協(xié)議引擎
而sendfile系統(tǒng)調(diào)用則提供了一種減少多次copy冀墨,提高文件傳輸性能的方法。流程如下:

  • sendfile系統(tǒng)效用涛贯,文件數(shù)據(jù)被copy至內(nèi)核緩沖區(qū)
  • 記錄數(shù)據(jù)文職和長(zhǎng)度相關(guān)的數(shù)據(jù)保存到socket相關(guān)緩存區(qū)
  • 實(shí)際數(shù)據(jù)由DMA模塊直接發(fā)送到協(xié)議引擎
tcp_nopush

sendfile為on時(shí)這里也應(yīng)該設(shè)為on诽嘉,數(shù)據(jù)包會(huì)累積一下再一起傳輸,可以提高一些傳輸效率。

tcp_nodelay

小的數(shù)據(jù)包不等待直接傳輸虫腋。默認(rèn)為on骄酗。
看上去是和tcp_nopush相反的功能,但是兩邊都為on時(shí)nginx也可以平衡這兩個(gè)功能的使用悦冀。

keepalive_timeout

HTTP連接的持續(xù)時(shí)間趋翻。設(shè)的太長(zhǎng)會(huì)使無(wú)用的線程變的太多。這個(gè)根據(jù)自己服務(wù)器訪問(wèn)數(shù)量盒蟆、處理速度以及網(wǎng)絡(luò)狀況方面考慮踏烙。

send_timeout

設(shè)置Nginx服務(wù)器響應(yīng)客戶端的超時(shí)時(shí)間,這個(gè)超時(shí)時(shí)間只針對(duì)兩個(gè)客戶端和服務(wù)器建立連接后历等,某次活動(dòng)之間的時(shí)間讨惩,如果這個(gè)時(shí)間后,客戶端沒(méi)有任何活動(dòng)募闲,Nginx服務(wù)器將關(guān)閉連接步脓,將其設(shè)置為10s,Nginx與客戶端建立連接后浩螺,某次會(huì)話中服務(wù)器等待客戶端響應(yīng)超過(guò)10s靴患,就會(huì)自動(dòng)關(guān)閉。

types_hash_max_size

types_hash_max_size影響散列表的沖突率要出。types_hash_max_size越大鸳君,就會(huì)消耗更多的內(nèi)存,但散列key的沖突率會(huì)降低患蹂,檢索速度就更快或颊。types_hash_max_size越小,消耗的內(nèi)存就越小传于,但散列key的沖突率可能上升囱挑。

client_header_buffer_size

該指令用于設(shè)置Nginx服務(wù)器允許的客戶端請(qǐng)求頭部的緩沖區(qū)大小,默認(rèn)為1KB沼溜,此指令的賦值可以根據(jù)系統(tǒng)分頁(yè)大小來(lái)設(shè)置辆苔,分頁(yè)大小可以用以下命令獲取getconf PAGESIZE混驰。

client_max_body_size 8m

客戶端上傳的body的最大值蹈胡。超過(guò)最大值就會(huì)發(fā)生413(Request Entity Too Large)錯(cuò)誤耙旦。默認(rèn)為1m,最好根據(jù)自己的情況改大一點(diǎn)找都。

gzip on

啟用gzip唇辨,對(duì)響應(yīng)數(shù)據(jù)進(jìn)行在線實(shí)時(shí)壓縮,減少數(shù)據(jù)傳輸量。

gzip_disable

Nginx服務(wù)器在響應(yīng)這些種類的客戶端請(qǐng)求時(shí)能耻,不使用Gzip功能緩存應(yīng)用數(shù)據(jù)赏枚,gzip_disable "msie6"對(duì)IE6瀏覽器的數(shù)據(jù)不進(jìn)行GZIP壓縮亡驰。

gzip_min_length

Gzip壓縮功能對(duì)大數(shù)據(jù)的壓縮效果明顯,但是如果壓縮很小的數(shù)據(jù)嗡贺,可能出現(xiàn)越壓縮數(shù)據(jù)量越大的情況隐解,因此應(yīng)該根據(jù)相應(yīng)頁(yè)面的大小,選擇性開(kāi)啟或者關(guān)閉Gzip功能诫睬。建議將值設(shè)置為1KB煞茫。

gzip_comp_level

設(shè)置壓縮程度,包括級(jí)別1到級(jí)別9摄凡,級(jí)別1表示壓縮程度最低续徽,壓縮效率最高;級(jí)別9表示壓縮程度最高亲澡,壓縮效率最低钦扭,最費(fèi)時(shí)間。

gzip_vary

用于設(shè)置在使用Gzip功能時(shí)是否發(fā)送帶有“Vary:Accept-Encoding”頭域的響應(yīng)頭部床绪,該頭域的主要功能是告訴接收方發(fā)送的數(shù)據(jù)經(jīng)過(guò)了壓縮處理客情,開(kāi)啟后端效果是在響應(yīng)頭部Accept-Encoding: gzip,對(duì)于本身不支持Gzip的壓縮的客戶端瀏覽器是有用的癞己。

gzip_buffers;

該指令用于設(shè)置Gzip壓縮文件使用存儲(chǔ)空間的大小膀斋,
語(yǔ)法gzip_buffers number size;number,指定Nginx服務(wù)器需要向系統(tǒng)申請(qǐng)存儲(chǔ)空間的個(gè)數(shù)痹雅,size仰担,指定每個(gè)緩存空間的大小。根據(jù)配置項(xiàng)绩社,Nginx服務(wù)器在對(duì)響應(yīng)輸出數(shù)據(jù)進(jìn)行Gzip壓縮時(shí)需向系統(tǒng)申請(qǐng)numbersize大小的空間用于存儲(chǔ)壓縮數(shù)據(jù)摔蓝。默認(rèn)情況下,numbersize的值為128愉耙,其中size的值為系統(tǒng)內(nèi)存頁(yè)一頁(yè)的大小贮尉,用getconf PAGESIZE來(lái)獲取

gunzip_static

開(kāi)啟時(shí),如果客戶端瀏覽器不支持Gzip處理朴沿,Nginx服務(wù)器將返回解壓后的數(shù)據(jù)猜谚,如果客戶端瀏覽器支持Gzip處理,Nginx服務(wù)器忽略該指令設(shè)置悯仙。仍然返回壓縮數(shù)據(jù)龄毡。

gzip_types

Nginx服務(wù)器可以根據(jù)MIME類型選擇性開(kāi)啟Gzip壓縮功能吠卷。該指令涌來(lái)設(shè)置MIME類型锡垄。

轉(zhuǎn)載https://segmentfault.com/a/1190000011405320

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市祭隔,隨后出現(xiàn)的幾起案子货岭,更是在濱河造成了極大的恐慌路操,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千贯,死亡現(xiàn)場(chǎng)離奇詭異屯仗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搔谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門魁袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人敦第,你說(shuō)我怎么就攤上這事峰弹。” “怎么了芜果?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵鞠呈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我右钾,道長(zhǎng)蚁吝,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任舀射,我火速辦了婚禮窘茁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘后控。我一直安慰自己庙曙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布浩淘。 她就那樣靜靜地躺著捌朴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪张抄。 梳的紋絲不亂的頭發(fā)上砂蔽,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音署惯,去河邊找鬼左驾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛极谊,可吹牛的內(nèi)容都是我干的诡右。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼轻猖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帆吻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起咙边,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猜煮,失蹤者是張志新(化名)和其女友劉穎次员,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體王带,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淑蔚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愕撰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹衫。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搞挣,靈堂內(nèi)的尸體忽然破棺而出绪妹,到底是詐尸還是另有隱情,我是刑警寧澤柿究,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布邮旷,位于F島的核電站,受9級(jí)特大地震影響蝇摸,放射性物質(zhì)發(fā)生泄漏婶肩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一貌夕、第九天 我趴在偏房一處隱蔽的房頂上張望律歼。 院中可真熱鬧,春花似錦啡专、人聲如沸险毁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畔况。三九已至,卻和暖如春慧库,著一層夾襖步出監(jiān)牢的瞬間跷跪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工齐板, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吵瞻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓甘磨,卻偏偏與公主長(zhǎng)得像橡羞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子济舆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348