nginx proxy+keepalived实现双主模式高可用集群

keepalived+nginx proxy

直接开始做实验吧。跟着下面一步步做,基本不会出问题。

  • 准备五台设备
  1. [root@node1 ~]# httpd服务器192.168.40.184

  2. [root@node2 ~]# httpd服务器192.168.40.185

  3. [root@node3 ~]# keepalived+nginx服务器192.168.40.186 Vip:192.168.100.1

  4. [root@node4 ~]# keepalived+nginx服务器192.168.40.187 Vip:192.168.100.2

  5. [root@localhost ~] 客户机

  • 配置httpd服务器

httpd1配置

[root@node1 ~]#

[root@node1 ~]#yum install httpd -y
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Package httpd-2.4.6-45.el7.centos.x86_64 already installed and latest version
Nothing to do
[root@node1 ~]#echo 'webserver1' > /var/www/html/index.html 
[root@node1 ~]#systemctl start httpd

我这里是已经安装过hpptd,如果没有安装直接会读条安装

httpd2配置

[root@node2 ~]#

[root@node2 ~]# yum -y install httpd
Loaded plugins: fastestmirror
base                                                                     | 3.6 kB  00:00:00     
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-45.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-45.el7.centos for package: httpd-2.4.6-45.el7.cen
tos.x86_64--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-45.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-45.el7.centos.x86
_64--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-45.el7.centos.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package httpd-tools.x86_64 0:2.4.6-45.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================
 Package                Arch              Version                         Repository       Size
================================================================================================
Installing:
 httpd                  x86_64            2.4.6-45.el7.centos             base            2.7 M
Installing for dependencies:
 apr                    x86_64            1.4.8-3.el7                     base            103 k
 apr-util               x86_64            1.5.2-6.el7                     base             92 k
 httpd-tools            x86_64            2.4.6-45.el7.centos             base             84 k
 mailcap                noarch            2.1.41-2.el7                    base             31 k

Transaction Summary
================================================================================================
Install  1 Package (+4 Dependent packages)

Total download size: 3.0 M
Installed size: 10 M
Downloading packages:
------------------------------------------------------------------------------------------------
Total                                                            24 MB/s | 3.0 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-3.el7.x86_64                                                       1/5 
  Installing : apr-util-1.5.2-6.el7.x86_64                                                  2/5 
  Installing : httpd-tools-2.4.6-45.el7.centos.x86_64                                       3/5 
  Installing : mailcap-2.1.41-2.el7.noarch                                                  4/5 
  Installing : httpd-2.4.6-45.el7.centos.x86_64                                             5/5 
  Verifying  : httpd-tools-2.4.6-45.el7.centos.x86_64                                       1/5 
  Verifying  : mailcap-2.1.41-2.el7.noarch                                                  2/5 
  Verifying  : apr-1.4.8-3.el7.x86_64                                                       3/5 
  Verifying  : httpd-2.4.6-45.el7.centos.x86_64                                             4/5 
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                                  5/5 

Installed:
  httpd.x86_64 0:2.4.6-45.el7.centos                                                            

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7                             apr-util.x86_64 0:1.5.2-6.el7            
  httpd-tools.x86_64 0:2.4.6-45.el7.centos             mailcap.noarch 0:2.1.41-2.el7            

Complete!
[root@node2 ~]# echo 'webserver2' > /var/www/html/index.html
[root@node2 ~]# systemctl start httpd
  • 配置nginx服务器

[root@node3 ~]#

[root@node3 ~]# yum install nginx -y
[root@node3 ~]# vim /etc/nginx/nginx.conf
打开配置文件,在http{}里直接添加:
upstream httpds {
        server 192.168.40.184;
        server 192.168.40.185;
}
然后找到下面location这一行改为:
        location / {
        proxy_pass http://httpds:
 }
 
[root@node3 ~]# systemctl start nginx

测试:
[root@node3 ~]# curl 192.168.40.186
webserver1
[root@node3 ~]# curl 192.168.40.186
webserver2

[root@node4 ~]#

[root@node4 ~]# yum install nginx -y
[root@node4 ~]# vim /etc/nginx/nginx.conf

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

   upstream httpds {
        server 192.168.40.184;
        server 192.168.40.185;
} 

   server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        proxy_pass http://httpds;
        }

[root@node4 ~]# systemctl start nginx

测试:
[root@node4 ~]# curl 192.168.40.187
webserver1
[root@node4 ~]# curl 192.168.40.187
webserver2

  • 配置keepalived

[root@node3 ~]#

[root@node3 ~]# yum -y install keepalived
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package keepalived.x86_64 0:1.2.13-8.el7 will be installed
--> Processing Dependency: libsensors.so.4()(64bit) for package: keepalived-1.2.13-8.el7.x86_64
--> Processing Dependency: libnetsnmpmibs.so.31()(64bit) for package: keepalived-1.2.13-8.el7.x8
6_64--> Processing Dependency: libnetsnmpagent.so.31()(64bit) for package: keepalived-1.2.13-8.el7.x
86_64--> Processing Dependency: libnetsnmp.so.31()(64bit) for package: keepalived-1.2.13-8.el7.x86_64
--> Running transaction check
---> Package lm_sensors-libs.x86_64 0:3.4.0-4.20160601gitf9185e5.el7 will be installed
---> Package net-snmp-agent-libs.x86_64 1:5.7.2-24.el7_2.1 will be installed
---> Package net-snmp-libs.x86_64 1:5.7.2-24.el7_2.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================================
 Package                   Arch         Version                                Repository  Size
================================================================================================
Installing:
 keepalived                x86_64       1.2.13-8.el7                           base       224 k
Installing for dependencies:
 lm_sensors-libs           x86_64       3.4.0-4.20160601gitf9185e5.el7         base        41 k
 net-snmp-agent-libs       x86_64       1:5.7.2-24.el7_2.1                     base       702 k
 net-snmp-libs             x86_64       1:5.7.2-24.el7_2.1                     base       747 k

Transaction Summary
================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 1.7 M
Installed size: 5.6 M
Downloading packages:
------------------------------------------------------------------------------------------------
Total                                                            15 MB/s | 1.7 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : lm_sensors-libs-3.4.0-4.20160601gitf9185e5.el7.x86_64                        1/4 
  Installing : 1:net-snmp-libs-5.7.2-24.el7_2.1.x86_64                                      2/4 
  Installing : 1:net-snmp-agent-libs-5.7.2-24.el7_2.1.x86_64                                3/4 
  Installing : keepalived-1.2.13-8.el7.x86_64                                               4/4 
  Verifying  : 1:net-snmp-agent-libs-5.7.2-24.el7_2.1.x86_64                                1/4 
  Verifying  : keepalived-1.2.13-8.el7.x86_64                                               2/4 
  Verifying  : 1:net-snmp-libs-5.7.2-24.el7_2.1.x86_64                                      3/4 
  Verifying  : lm_sensors-libs-3.4.0-4.20160601gitf9185e5.el7.x86_64                        4/4 

Installed:
  keepalived.x86_64 0:1.2.13-8.el7                                                              

Dependency Installed:
  lm_sensors-libs.x86_64 0:3.4.0-4.20160601gitf9185e5.el7                                       
  net-snmp-agent-libs.x86_64 1:5.7.2-24.el7_2.1                                                 
  net-snmp-libs.x86_64 1:5.7.2-24.el7_2.1                                                       
Complete!

[root@node3 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   } 
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id router1
   vrrp_mcast_group4 224.1.1.1
}  

vrrp_instance VI_1 {
    state MASTER
    interface ens37
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.40.101 
    }   
}   

vrrp_instance VI_2 {
    state BACKUP
    interface ens37
    virtual_router_id 2
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }   
    virtual_ipaddress {
        192.168.40.102
    }   
}   

[root@node3 ~]# systemctl start keepalived

[root@node4 ~]#

[root@node4 ~]# yum -y install keepalived

[root@node4 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   } 
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id router2
   vrrp_mcast_group4 224.1.1.1
}  

vrrp_instance VI_1 {
    state BACKUP
    interface ens37
    virtual_router_id 1
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.40.101 
    }   
}   

vrrp_instance VI_2 {
    state MASTER
    interface ens37
    virtual_router_id 2
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 2222
    }   
    virtual_ipaddress {
        192.168.40.102
    }   
}  

[root@node4 ~]# systemctl start keepalived
  • 测试

上面已经把基础都配置好了,现在开始启动做测试。

[root@node3 ~]#

[root@node3 ~]# ip a

3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:26:5d:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.186/24 brd 192.168.40.255 scope global dynamic ens37
       valid_lft 1309sec preferred_lft 1309sec
    inet 192.168.40.101/32 scope global ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::1446:88c6:b45f:64e9/64 scope link 
       valid_lft forever preferred_lft forever
通过ip a可以看到192.168.40.101已经配置上去了,这个上面就算成功了,下面在看看另一台。

[root@node4 ~]#

[root@node4 ~]# ip a
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:28:c1:83 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.187/24 brd 192.168.40.255 scope global dynamic ens37
       valid_lft 1707sec preferred_lft 1707sec
    inet 192.168.40.102/32 scope global ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::ad66:2c63:7f34:fd2c/64 scope link 
       val id_lft forever preferred_lft forever
这个也出现了,也成功了

上面使用ip a名称看来都已经成功了,另外两台虚拟机上面都配置了后端httpd1与2的代理服务,那么我们现在用客户机访问测试一下是否正常。

[root@localhost ~]

[root@localhost ~]# for i in {1..10};do curl http://192.168.40.101/;done
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
访问192.168.40.101没问题,试试102

[root@localhost ~]# for i in {1..10};do curl http://192.168.40.102/;done
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
192.168.40.102也没问题

测试到这里说明这个实验已经完成,但是还需要测试如果一台主机宕机了,其他两个虚拟Ip还可以正常工作吗,那么我们在来测试一下

[root@node3 ~]#

[root@node3 ~]# systemctl stop keepalived #停止keeplived

[root@node3 ~]# ip a

3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:26:5d:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.186/24 brd 192.168.40.255 scope global dynamic ens37
       valid_lft 1309sec preferred_lft 1309sec
    inet6 fe80::1446:88c6:b45f:64e9/64 scope link 
       valid_lft forever preferred_lft forever

服务停掉以后可以看到vip已经不见了,现在应该是转移到node2上面去了,我们去看看

[root@node4 ~]#

[root@node4 ~]# ip a

3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:28:c1:83 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.187/24 brd 192.168.40.255 scope global dynamic ens37
       valid_lft 1707sec preferred_lft 1707sec
    inet 192.168.40.101/32 scope global ens37
       valid_lft forever preferred_lft forever
    inet 192.168.40.102/32 scope global ens37
       valid_lft forever preferred_lft forever
    inet6 fe80::ad66:2c63:7f34:fd2c/64 scope link 
       val id_lft forever preferred_lft forever
现在node4上面出现了2个vip,那么网页还能正常工作不,我们再去用客户机访问一下。

[root@localhost ~]#

[root@localhost ~]# for i in {1..10};do curl http://192.168.40.101/;done
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
[root@localhost ~]# for i in {1..10};do curl http://192.168.40.102/;done
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
webserver1
webserver2
两个ip依然可以正常访问。

ip转移的原理就是配置文件中权重的设置,虚拟主机在广播域内每秒都会更新优先级,权重值,一旦发现在权重较高者就将vip添加到相应的设备上,为了更加清楚的看到过程,我们可以用监控来查看信息。

[root@node4 ~]#

[root@node4 ~]# yum -y install tcpdump

[root@node4 ~]# tcpdump -i ens37 -nn host 224.1.1.1
16:03:06.372459 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 95, authtype simple, intvl 1s, length 20
16:03:06.896593 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:03:07.373876 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 95, authtype simple, intvl 1s, length 20
16:03:07.898220 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:03:08.374548 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 95, authtype simple, intvl 1s, length 20
16:03:08.900079 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:03:09.377419 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 95, authtype simple, intvl 1s, length 20
16:03:09.903509 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20

以上主要观看prio值,在node3没有启动时(上面做测试的时候关闭了),node4每秒广播一次优先级为95的vrid 1与优先级100的vrid 2,如果当我启动node3的keepalived可以看到监控中,node3与node4同时广播了一次自己的优先级,node4的vrid 1为95,node3的为100,然后可以发现vrid 1就变成了node3的100了,不广播node4的95了,因为node3的优先级较高。

[root@node4 ~]# tcpdump -i ens37 -nn host 224.1.1.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens37, link-type EN10MB (Ethernet), capture size 65535 bytes
16:17:01.406785 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 95, authtype simple, intvl 1s, length 20
16:17:01.730866 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:20:58.304585 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:20:59.118167 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20
16:20:59.308064 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:21:00.121610 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20
16:21:00.309219 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:21:01.124993 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20
16:21:01.312567 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:21:02.127997 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20
16:21:02.315574 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:21:03.129976 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20
16:21:03.317468 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20
16:21:04.134008 IP 192.168.40.186 > 224.1.1.1: VRRPv2, Advertisement, vrid 1, prio 100, authtype simple, intvl 1s, length 20
16:21:04.321042 IP 192.168.40.187 > 224.1.1.1: VRRPv2, Advertisement, vrid 2, prio 100, authtype simple, intvl 1s, length 20

测试到这里就结束了,跟node3一样,如果node4宕机,他的ip就会转到node3上,优先级谁高谁先输出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容