Nginx支持TCP代理和負載均衡-stream模塊

個人專題目錄


nginx安裝手冊

LVS混卵,Nginx和HAProxy負載均衡對比

Nginx支持TCP代理和負載均衡-stream模塊

ngx_stream_core_module

ngx_stream_core_module模塊自1.9.0版開始提供彬呻。默認情況下不構建此模塊腋妙,應使用--with-stream 配置參數(shù)啟用它探橱。

官網(wǎng):http://nginx.org/en/docs/stream/ngx_stream_core_module.html

示例配置

worker_processes auto;

error_log /var/log/nginx/error.log info;

#事件
events {
    worker_connections 1024;
}

#流模塊
stream {
    #上游后端
    upstream backend {
        hash $remote_addr consistent;

        server backend1.example.com:12345 weight = 5;
        server 127.0.0.1:12345 max_fails = 3 fail_timeout = 30s;
        server unix:/ tmp / backend3;
    }
    #上游后端
    upstream dns {
       server 192.168.0.1:53535;
       server dns.example.com:53;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
}

指令

listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

設置服務器將接受連接的套接字addressport码撰⊙裕可以僅指定端口搞隐。地址也可以是主機名晨缴,例如:

listen 127.0.0.1:12345;
listen *:12345;
listen 12345;     # same as *:12345
listen localhost:12345;

IPv6地址在方括號中指定:

listen [::1]:12345;
listen [::]:12345;

UNIX域套接字使用“ unix:”前綴指定:

listen unix:/var/run/nginx.sock;

ssl參數(shù)允許指定此端口上接受的所有連接都應在SSL模式下工作译秦。

udp參數(shù)配置一個偵聽套接字以處理數(shù)據(jù)報(1.9.13)。

proxy_protocol參數(shù)(1.11.4)允許指定這個端口上接受的所有連接應使用 代理服務器協(xié)議击碗。

自版本1.13.11起支持PROXY協(xié)議版本2筑悴。

listen指令可以有幾個特定于與套接字相關的系統(tǒng)調(diào)用的附加參數(shù)。

  • backlog=number

    設置調(diào)用中的backlog參數(shù)稍途,該參數(shù) listen()限制掛起連接隊列的最大長度(1.9.2)阁吝。默認情況下, backlog在FreeBSD械拍,DragonFly BSD和macOS上設置為-1突勇,在其他平臺上設置為511。

  • rcvbuf=size

    設置SO_RCVBUF偵聽套接字的接收緩沖區(qū)大锌缆恰(選項)(1.11.13)甲馋。

  • sndbuf=size

    設置SO_SNDBUF偵聽套接字的發(fā)送緩沖區(qū)大小(選項)(1.11.13)迄损。

  • bind

    此參數(shù)指示對bind() 給定地址進行單獨調(diào)用 addressport定躏。事實是,如果有多個listen指令具有相同的端口但地址不同芹敌,并且其中一個 listen指令偵聽給定端口(*:port)的所有地址痊远,則nginx將 bind()僅執(zhí)行*:port。應該注意氏捞,getsockname()在這種情況下將進行系統(tǒng)調(diào)用以確定接受連接的地址碧聪。如果使用ipv6onlyso_keepalive參數(shù),那么對于給定的 addressportbind()將始終進行單獨的調(diào)用液茎。

  • ipv6only= on|off

    此參數(shù)確定(通過IPV6_V6ONLY套接字選項)偵聽通配符地址的IPv6套接字是[::] 僅接受IPv6連接還是僅接受IPv6和IPv4連接逞姿。默認情況下,此參數(shù)處于啟用狀態(tài)豁护。它只能在開始時設置一次哼凯。

  • reuseport

    此參數(shù)(1.9.1)指示為每個工作進程創(chuàng)建一個單獨的偵聽套接字(使用SO_REUSEPORTLinux 3.9+和DragonFly BSD上的 套接字選項,或者SO_REUSEPORT_LB在FreeBSD 12+上)楚里,允許內(nèi)核在工作進程之間分配傳入連接。目前僅適用于Linux 3.9 +猎贴,DragonFly BSD和FreeBSD 12+(1.15.1)班缎。不恰當?shù)厥褂么诉x項可能會產(chǎn)生安全 隱患蝴光。

  • so_keepalive= on| off| [ keepidle]:[ keepintvl]:[ keepcnt]

    此參數(shù)配置偵聽套接字的“TCP keepalive”行為。如果省略此參數(shù)达址,則操作系統(tǒng)的設置將對套接字有效蔑祟。如果將其設置為值“ on”, SO_KEEPALIVE則為套接字打開選項沉唠。如果將其設置為值“ off”疆虚,SO_KEEPALIVE則為套接字關閉該選項。在每個插槽的基礎使用的TCP甭穑活參數(shù)某些操作系統(tǒng)支持設置TCP_KEEPIDLE径簿,TCP_KEEPINTVLTCP_KEEPCNT套接字選項。在這樣的系統(tǒng)(目前嘀韧,Linux的2.4 +竭讳,NetBSD的5+和FreeBSD 9.0-STABLE)儡炼,它們可以使用配置的keepidlekeepintvlkeepcnt參數(shù)〖遥可以省略一個或兩個參數(shù),在這種情況下古涧,相應套接字選項的系統(tǒng)默認設置將生效馍乙。例如,SO_KEEPALIVE =30m::10將idle timeout(TCP_KEEPIDLE)設置為30分鐘炎辨,將探測間隔(TCP_KEEPINTVL)保留為系統(tǒng)默認值捕透,并將探測count(TCP_KEEPCNT)設置為10個探測器。

不同的服務器必須監(jiān)聽不同的 address:port對蹦魔。

語法

Syntax Default Context Description
preread_buffer_size size 16k stream,server 指定size了的 預讀緩沖區(qū)激率。
preread_timeout timeout 30s stream,server 指定timeout了的 預讀階段。
proxy_protocol_timeout timeout 30s stream,server 指定timeout用于讀取PROXY協(xié)議標頭以完成勿决。如果在此時間內(nèi)未傳輸整個標頭乒躺,則關閉連接。
resolver address ... [valid=time][ipv6=on off - stream,server 將用于解析上游服務器名稱的名稱服務器配置到地址中低缩,例如:resolver 127.0.0.1 [:: 1]:5353;
resolver_timeout time 30s stream,server 設置名稱解析的超時
server { ... } - stream 設置服務器的配置
stream { ... } - main 提供指定流服務器指令的配置文件上下文
tcp_nodelay on | off on stream,server 啟用或禁用該TCP_NODELAY選項的使用嘉冒。為客戶端和代理服務器連接啟用該選項
variables_hash_bucket_size size 64 stream 設置變量哈希表的桶大小。設置哈希表的詳細信息在單獨的文檔中提供 咆繁。
variables_hash_max_size size 1024 stream 設置size變量哈希表的最大值讳推。設置哈希表的詳細信息在單獨的文檔中提供。

可以將地址指定為域名或IP地址玩般,以及可選端口银觅。如果未指定端口,則使用端口53坏为。以循環(huán)方式查詢名稱服務器究驴。

默認情況下镊绪,nginx將在解析時查找IPv4和IPv6地址。如果不需要查找IPv6地址洒忧,則ipv6=off可以指定參數(shù)蝴韭。

默認情況下,nginx使用響應的TTL值緩存答案熙侍¢可選valid參數(shù)允許覆蓋它:

resolver 127.0.0.1 [::1]:5353 valid=30s;

嵌入式變量

ngx_stream_core_module模塊支持自1.11.2以來的變量。

  • $binary_remote_addr

    客戶端地址采用二進制形式蛉抓,值的長度始終為IPv4地址的4個字節(jié)或IPv6地址的16個字節(jié)

  • $bytes_received

    從客戶端收到的字節(jié)數(shù)(1.11.4)

  • $bytes_sent

    發(fā)送到客戶端的字節(jié)數(shù)

  • $connection

    連接序列號

  • $hostname

    主機名

  • $msec

    以毫秒為單位的當前時間(以毫秒為單位)

  • $nginx_version

    nginx版本

  • $pid

    工作進程的PID

  • $protocol

    用于與客戶端溝通的協(xié)議: TCPUDP(1.11.4)

  • $proxy_protocol_addr

    來自PROXY協(xié)議頭的客戶端地址庆尘,否則為空字符串(1.11.4)必須先通過proxy_protocollisten指令中設置參數(shù)來啟用PROXY協(xié)議 。

  • $proxy_protocol_port

    來自PROXY協(xié)議頭的客戶端端口芝雪,否則為空字符串(1.11.4)必須先通過proxy_protocollisten指令中設置參數(shù)來啟用PROXY協(xié)議 减余。

  • $remote_addr

    客戶端地址

  • $remote_port

    客戶端端口

  • $server_addr

    接受連接的服務器的地址計算此變量的值通常需要一次系統(tǒng)調(diào)用。為避免系統(tǒng)調(diào)用惩系,listen指令必須指定地址并使用該bind參數(shù)位岔。

  • $server_port

    接受連接的服務器的端口

  • $session_time

    會話持續(xù)時間(以秒為單位),分辨率為毫秒(1.11.4);

  • $status

    會話狀態(tài)(1.11.4)堡牡,可以是以下之一:200會話成功完成400無法解析客戶端數(shù)據(jù)抒抬,例如PROXY協(xié)議403例如,當某些客戶端地址的訪問受限時晤柄,禁止訪問500內(nèi)部服務器錯誤502壞網(wǎng)關擦剑,例如,如果無法選擇或到達上游服務器芥颈。503服務不可用惠勒,例如,當訪問受連接數(shù)限制時

  • $time_iso8601

    當?shù)貢r間采用ISO 8601標準格式

  • $time_local

    通用日志格式的本地時間

測試nginx代理TCP協(xié)議的配置

realserver : 10.111.17.89:8080

nginx :10.111.16.75

客戶端:10.100.34.198

TCP監(jiān)聽端口:2018

配置nginx

nginx1.90對TCP協(xié)議的代理并不是默認開啟的爬坑,需要在編譯的時候配置 --with-stream 參數(shù):

./configure --add-module=/root/nginx_upstream_check_module-master --with-stream

make && make install

nginx.config文件參照官網(wǎng):

stream {
    
    upstream tcpend {
        hash $remote_addr consistent;

        server 10.111.17.89:8080 weight=5 max_fails=3 fail_timeout=30s;
    }
    
    server {
        listen 2018;
        proxy_connect_timeout 1s;
        proxy_timeout 180s;
        proxy_pass tcpend;
    }  
}

啟動nginx纠屋,發(fā)現(xiàn)nginx已經(jīng)開始監(jiān)聽2018端口了

cd usr/local/nginx/sbin
#啟動
./nginx
#重啟
./nginx -s reload
#判斷配置文件是否正確
./nginx -t
netstat -anp|grep :2018

[root@vm10-111-16-75 ~]# netstat -anp|grep :2018

tcp 0 0 0.0.0.0:2018 0.0.0.0:* LISTEN 18457/nginx

測試客戶端連realserver

在客戶端通過telnet連接realserver的2018端口:

telnet
open 10.111.17.89 8080

[root@vm10-65-140-249 ~]# telnet 
telnet> open 10.111.17.89 8080
Trying 10.111.17.89...
Connected to 10.111.17.89.
Escape character is '^]'.
Connection closed by foreign host.
[root@vm10-65-140-249 ~]# telnet 
telnet> open 10.111.17.89 8080
Trying 10.111.17.89...
Connected to 10.111.17.89.
Escape character is '^]'

在realserver上查看網(wǎng)絡連接:

netstat -anpl|grep :8080

[root@vm10-111-17-89 ~]# netstat -anpl|grep :8080
tcp        0      0 :::8080                     :::*                        LISTEN      5182/java           
tcp        0      0 ::ffff:10.111.17.89:8080    ::ffff:10.100.34.198:14470  ESTABLISHED 5182/java 

可以正常連接

測試客戶端連接nginx

在客戶端通過telnet連接nginx所在服務器的2018端口

telnet
open 10.111.16.75 2018

[root@vm10-65-140-249 ~]# telnet
telnet> open 10.111.16.75 2018
Trying 10.111.16.75...
Connected to 10.111.16.75.
Escape character is '^]'.

在nginx機器上查看網(wǎng)絡連接

[root@vm10-111-16-75 ~]# netstat -anp|grep :2018
tcp        0      0 0.0.0.0:2018                0.0.0.0:*                   LISTEN      18457/nginx         
tcp        0      0 10.111.16.75:2018           10.100.34.198:51539         ESTABLISHED 18458/nginx 

在realserver上查看網(wǎng)絡連接

[root@vm10-111-17-89 ~]# netstat -anpl|grep :8080
tcp        0      0 :::8080                     :::*                        LISTEN      5182/java           
tcp        0      0 ::ffff:10.111.17.89:8080    ::ffff:10.111.16.75:40794   ESTABLISHED 5182/java  

nginx是給做了一個TCP連接的中轉。

client和nginx有一個tcp長連接盾计,nginx和realserver有一個tcp長連接售担,但是client和realserver之間并沒有tcp長連接,僅由nginx服務器負責數(shù)據(jù)中轉署辉。

四層七層負載的區(qū)別

1. 什么是負載均衡

負載均衡 建立在現(xiàn)有網(wǎng)絡結構之上族铆,它提供了一種廉價有效透明的方法擴展網(wǎng)絡設備和服務器的帶寬、增加吞吐量哭尝、加強網(wǎng)絡數(shù)據(jù)處理能力哥攘、提高網(wǎng)絡的靈活性和可用性。

2. 負載均衡分類

負載均衡根據(jù)所采用的設備對象(軟/硬件負載均衡),應用的OSI網(wǎng)絡層次(網(wǎng)絡層次上的負載均衡)献丑,及應用的地理結構(本地/全局負載均衡)等來分類末捣。根據(jù)應用的 OSI 網(wǎng)絡層次來分類的兩個負載均衡類型侠姑。

網(wǎng)絡模型圖创橄,包含了 OSI 模型及 TCP/IP 模型,兩個模型雖然有一點點區(qū)別莽红,但主要的目的是一樣的妥畏,模型圖描述了通信是怎么進行的。它解決了實現(xiàn)有效通信所需要的所有過程安吁,并將這些過程劃分為邏輯上的層醉蚁。層可以簡單地理解成數(shù)據(jù)通信需要的步驟。

OSI_TCP/IP

根據(jù)負載均衡所作用在 OSI 模型的位置不同鬼店,負載均衡可以大概分為以下幾類:

  • 二層負載均衡(mac)

    根據(jù)OSI模型分的二層負載网棍,一般是用虛擬mac地址方式,外部對虛擬MAC地址請求妇智,負載均衡接收后分配后端實際的MAC地址響應滥玷。

  • 三層負載均衡(ip)

    一般采用虛擬IP地址方式,外部對虛擬的ip地址請求巍棱,負載均衡接收后分配后端實際的IP地址響應惑畴。

  • 四層負載均衡(tcp)

    在三層負載均衡的基礎上,用ip+port接收請求航徙,再轉發(fā)到對應的機器如贷。

  • 七層負載均衡(http)

    根據(jù)虛擬的url或IP,主機名接收請求到踏,再轉向相應的處理服務器杠袱。

在實際應用中,比較常見的就是四層負載及七層負載窝稿。這里也重點說下這兩種負載楣富。

3. 四層負載均衡(基于IP+端口的負載均衡)

所謂四層負載均衡,也就是主要通過報文中的目標地址和端口讹躯,再加上負載均衡設備設置的服務器選擇方式菩彬,決定最終選擇的內(nèi)部服務器。

layer4
  1. 在三層負載均衡的基礎上潮梯,通過發(fā)布三層的IP地址(VIP)骗灶,然后加四層的端口號,來決定哪些流量需要做負載均衡秉馏,對需要處理的流量進行NAT處理耙旦,轉發(fā)至后臺服務器,并記錄下這個TCP或者UDP的流量是由哪臺服務器處理的萝究,后續(xù)這個連接的所有流量都同樣轉發(fā)到同一臺服務器處理免都。
  2. 以常見的TCP為例锉罐,負載均衡設備在接收到第一個來自客戶端的SYN 請求時,即通過上述方式選擇一個最佳的服務器绕娘,并對報文中目標IP地址進行修改(改為后端服務器IP)脓规,直接轉發(fā)給該服務器。TCP的連接建立险领,即三次握手是客戶端和服務器直接建立的侨舆,負載均衡設備只是起到一個類似路由器的轉發(fā)動作。在某些部署情況下绢陌,為保證服務器回包可以正確返回給負載均衡設備挨下,在轉發(fā)報文的同時可能還會對報文原來的源地址進行修改。
  3. 對應的負載均衡器稱為四層交換機(L4 switch)脐湾,主要分析IP層及TCP/UDP層臭笆,實現(xiàn)四層負載均衡。此種負載均衡器不理解應用協(xié)議(如HTTP/FTP/MySQL等等)
    要處理的流量進行NAT處理秤掌,轉發(fā)至后臺服務器愁铺,并記錄下這個TCP或者UDP的流量是由哪臺服務器處理的,后續(xù)這個連接的所有流量都同樣轉發(fā)到同一臺服務器處理机杜。
  4. 實現(xiàn)四層負載均衡的軟件有:
    • F5:硬件負載均衡器帜讲,功能很好,但是成本很高椒拗。
    • lvs:重量級的四層負載軟件
    • nginx:輕量級的四層負載軟件似将,帶緩存功能,正則表達式較靈活
    • haproxy:模擬四層轉發(fā)蚀苛,較靈活

4. 七層的負載均衡(基于虛擬的URL或主機IP的負載均衡)

所謂七層負載均衡在验,也稱為“內(nèi)容交換”,也就是主要通過報文中的真正有意義的應用層內(nèi)容堵未,再加上負載均衡設備設置的服務器選擇方式腋舌,決定最終選擇的內(nèi)部服務器。

layer7
  1. 在四層負載均衡的基礎上(沒有四層是絕對不可能有七層的)渗蟹,再考慮應用層的特征块饺,比如同一個Web服務器的負載均衡,除了根據(jù)VIP加80端口辨別是否需要處理的流量雌芽,還可根據(jù)七層的URL授艰、瀏覽器類別、語言來決定是否要進行負載均衡世落。舉個例子淮腾,如果你的Web服務器分成兩組,一組是中文語言的,一組是英文語言的谷朝,那么七層負載均衡就可以當用戶來訪問你的域名時洲押,自動辨別用戶語言,然后選擇對應的語言服務器組進行負載均衡處理圆凰。
  2. 以常見的TCP為例杈帐,負載均衡設備如果要根據(jù)真正的應用層內(nèi)容再選擇服務器,只能先代理最終的服務器和客戶端建立連接(三次握手)后送朱,才可能接受到客戶端發(fā)送的真正應用層內(nèi)容的報文娘荡,然后再根據(jù)該報文中的特定字段,再加上負載均衡設備設置的服務器選擇方式驶沼,決定最終選擇的內(nèi)部服務器。負載均衡設備在這種情況下争群,更類似于一個代理服務器回怜。負載均衡和前端的客戶端以及后端的服務器會分別建立TCP連接。所以從這個技術原理上來看换薄,七層負載均衡明顯的對負載均衡設備的要求更高玉雾,處理七層的能力也必然會低于四層模式的部署方式。
  3. 對應的負載均衡器稱為七層交換機(L7 switch)轻要,除了支持四層負載均衡以外复旬,還有分析應用層的信息,如HTTP協(xié)議URI或Cookie信息冲泥,實現(xiàn)七層負載均衡驹碍。此種負載均衡器能理解應用協(xié)議。
  4. 實現(xiàn)七層負載均衡的軟件有:
    • haproxy:天生負載均衡技能凡恍,全面支持七層代理志秃,會話保持,標記嚼酝,路徑轉移浮还;
    • nginx:只在http協(xié)議和mail協(xié)議上功能比較好,性能與haproxy差不多闽巩;
    • apache:功能較差
    • Mysql proxy:功能尚可钧舌。

5. 區(qū)別

區(qū)別 四層負載均衡(layer 4) 七層負載均衡(layer 7)
基于 基于IP+Port的 基于虛擬的URL或主機IP等。
類似于 路由器 代理服務器
握手次數(shù) 1 次 2次
復雜度
性能 高涎跨;無需解析內(nèi)容 中洼冻;需要算法識別 URL,Cookie 和 HTTP head 等信息
安全性 低六敬,無法識別 DDoS等攻擊 高碘赖, 可以防御SYN cookie以SYN flood等
額外功能 會話保持,圖片壓縮,防盜鏈等
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末普泡,一起剝皮案震驚了整個濱河市播掷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼班,老刑警劉巖歧匈,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砰嘁,居然都是意外死亡件炉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門矮湘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斟冕,“玉大人,你說我怎么就攤上這事缅阳】纳撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵十办,是天一觀的道長秀撇。 經(jīng)常有香客問我,道長向族,這世上最難降的妖魔是什么呵燕? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮件相,結果婚禮上再扭,老公的妹妹穿的比我還像新娘。我一直安慰自己适肠,他們只是感情好霍衫,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侯养,像睡著了一般敦跌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛揩,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天柠傍,我揣著相機與錄音,去河邊找鬼辩稽。 笑死惧笛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的逞泄。 我是一名探鬼主播患整,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拜效,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了各谚?” 一聲冷哼從身側響起紧憾,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昌渤,沒想到半個月后赴穗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡膀息,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年般眉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜支。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡甸赃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毁腿,到底是詐尸還是另有隱情辑奈,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布已烤,位于F島的核電站,受9級特大地震影響妓羊,放射性物質(zhì)發(fā)生泄漏胯究。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一躁绸、第九天 我趴在偏房一處隱蔽的房頂上張望裕循。 院中可真熱鬧,春花似錦净刮、人聲如沸剥哑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽株婴。三九已至,卻和暖如春暑认,著一層夾襖步出監(jiān)牢的瞬間困介,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蘸际, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留座哩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓粮彤,卻偏偏與公主長得像根穷,于是被迫代替她去往敵國和親姜骡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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