搭建全功能服務器(Nginx+Tomcat+PHP+SSL)

本文將介紹Linux環境下如何安裝Web服務基礎運行環境,包括以下內容:

安裝jdk

安裝Tomcat

安裝MySQL

安裝PHP

安裝Nginx

安裝SSL證書

整合Nginx和Tomcat

整合完成后,服務器將可以滿足大部分應用場景需求。

以下案例使用的服務器是一款美國的VPS,騰訊云、阿里云等云主機搭建過程與之類似。

首先看一下服務器的參數

這臺服務器內存有1G,使用的是CentOS7 64位系統,可以跑中小型的Java Web程序。特別提醒,由于目前的項目一般都會用到springmvc、mybatis等一堆框架,對內存的消耗很大,建議內存最低配置要1G以上。以這臺服務器為例,只跑一個應用,由于用了較多的框架,tomcat內存占用已達到277M。

tomcat占用

之前我圖省錢選擇了768M內存的VPS,發現每隔一段時間Tomcat就無緣無故shutdown,花了很長時間排查原因,最后查看系統日志才發現是由于java內存占用過高而被系統 強制kill掉。

事前準備

由于這臺VPS默認的語言環境是英文,所以需要先切換到中文。

(1)設置語言

export LANG="zh_CN.UTF-8"

(2)重新載入

. /etc/profile

(3)檢查修改結果

echo $LANG

此外,由于是美國的服務器,所以還要將系統的時間改為北京時間,執行以下命令:

(1)修改日期

date -s 16/11/2017

(2)修改時間(這里是上午11:35)

date -s 111:35

(3)將時鐘寫入CMOS,確保重啟后依然生效(記得不要漏了這一句)

clock -w

(4)修改時區

cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

會提示是否覆蓋,選Y

安裝JDK

先檢查一下系統是否已經裝了jdk

rpm -qa | grep jdk

某些系統可能安裝了openjdk,不過據說這個版本可能兼容性不是很好,你可以看情況選擇是否要卸載而重新安裝Oracle版本。我這里選擇的是卸載后重新安裝。

(1)卸載

yum remove java-1.7.0-openjdk

(2)安裝Oracle官方的JDK

先要下載rpm安裝包,可以在瀏覽器打開jdk下載頁面,右鍵獲取鏈接。但是目前網頁需要進行用戶驗證(需要你點擊accept才能下載),所以wget的時候要加上一些參數來跳過這個檢查

wget --no-check-certificate --no-cookie --header "Cookie:oraclelicense=accept-secureback-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.rpm

(3)直接安裝

rpm -ivh jdk-8u121-linux-x64.rpm

系統默認會將jdk安裝到這個位置:/usr/java/jdk1.8.0_121

安裝Tomcat

Tomcat可以使用yum或者下載安裝的方式,我這里采用的是下載安裝的方式。

(1)下載壓縮包

wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.11/bin/apache-tomcat-8.5.11.tar.gz

(2)解壓縮

tar -zxvf apache-tomcat-8.5.11.tar.gz

(3)將apache-tomcat-8.5.11 移動到/usr/local目錄下

mv apache-tomcat-8.5.11 /usr/local

(4)將apache-tomcat-8.5.11目錄名更名為tomcat

mv/usr/localapache-tomcat-8.5.11/usr/localtomcat

為了安全起見,我們一般會將諸如Tomcat、Nginx等對外提供服務應用的目錄權限修改一下。

(1)新建一個tomcat用戶組

groupadd tomcat

(2)新建一個tomcat用戶并加入tomcat用戶組,同時限制該賬戶無法使用bash

useradd -g tomcat -s /sbin/nologin tomcat

(3)可以使用以下命令查看一下設置結果

id tomcat

(4)將tomcat目錄的擁有者改為tomcat,并將目錄權限改為770:

chown -R tomcat:tomcat /usr/local/tomcat

chmod -R 770 /usr/local/tomcat

此外,我們一般還會設置Tomcat隨系統自動啟動。

(1)在tomca/bin 目錄下面,增加 setenv.sh 配置,catalina.sh會在tomcat啟動的時候被調用。

這個文件包含如下兩行內容(Java內存參數根據自己服務器配置來修改):

#指定tomcat pid的路徑,系統將以此來區分進程

CATALINA_PID="$CATALINA_BASE/tomcat.pid"

#增加一些java內存配置參數,并修改一下時區,否則tomcat日志的時間可能不準確

JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=64m -XX:MaxPermSize=128m -Duser.timezone=Asia/Shanghai"

(2)添加服務

切換至/usr/lib/systemd/system/目錄,建立tomcat.service文件并輸入以下內容:

[Unit]

Description=Tomcat

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

PIDFile=/usr/local/tomcat/tomcat.pid

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

User=tomcat

Group=tomcat

[Install]

WantedBy=multi-user.target

(3)設置為開機啟動

systemctl enable tomcat

(4)啟動、停止、重啟tomcat命令:

#啟動tomcat

systemctl start tomcat

#停止tomcat

systemctl stop tomcat

#重啟tomcat

systemctl restart tomcat

#查看tomcat服務狀態

systemctl status tomcat.service

systemctl status tomcat.service

如果看到狀態為active(running),表明tomcat已經成功啟動。不過,這時候你還不能通過http://IP地址:8080來訪問tomcat,因為我們還沒有開放8080端口。先別急,我們繼續往下走。

安裝PHP

(1)先檢查系統是否已經安裝了php及其版本

yum list installed | grep php

(2)如果有安裝的PHP包,先刪除他們

yum remove php.*

(3)配置yum源(可能要試幾次才能成功)

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

(4)接著就一次性安裝php及相關組件

yum install php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 php56w-fpm.x86_64

(5)檢查一下php是否安裝成功:

由于我們使用的是yum的安裝方式,所以已經幫我們配置好相關的service了,直接啟動就可以,相關命令:

#啟動

systemctl start php-fpm

#重啟

systemctl restart php-fpm

#停止

systemctl stop php-fpm

#設置開機啟動php-fpm

systemctl enable php-fpm.service

接下來,我們要對php進行一下配置。

(1)打開php.ini配置文件

vi /etc/php.ini

(2)限制PHP只能操作指定目錄下的文件,注意后面要加斜杠。

由于我們會用到Nginx服務器,所以這里我們將PHP目錄直接放到Nginx默認的web路徑之下(見下文)

open_basedir = /usr/local/nginx/html/

另外還會有很多安全選項可以配置,如allow_url_include、allow_url_fopen、allow_url_include、display_errors等,這些選項在正式環境下建議關閉。不過由于本案例會用到phpMyAdmin這個可視化工具來管理MySQL數據庫,所以暫時先保留默認狀態。

安裝MySQL

這臺服務器默認安裝了MariaDB(MySQL的一個分支),其用法基本跟MySQL一致,但也有微小區別(如字段大小寫問題),由于我在本地開發的時候用的是MySQL,所以這里我還是換回了MySQL。

(1)卸載MariaDB

檢查系統是否安裝了mariadb

rpm -qa | grep mariadb

強制卸載

rpm -e –nodeps mariadb-libs-5.5.37-1.el7_0.x86_64

(2)下載mysql的repo源

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

(3)安裝mysql-community-release-el7-5.noarch.rpm包

rpm -ivh mysql-community-release-el7-5.noarch.rpm

安裝這個包后,會獲得兩個mysql的yum repo源:

/etc/yum.repos.d/mysql-community.repo

/etc/yum.repos.d/mysql-community-source.repo

(4)之后就可以使用yum方式安裝mysql

yum install mysql-server

(5)設為開機啟動并立即啟動服務

systemctl enable mysqld

systemctl start mysqld

安裝完之后要第一時間進行安全初始化設置,直接輸入mysql_secure_installation

mysql_secure_installation

該指令會引導你完成初始化操作:

Set root password? [Y/n] <– 回車

New password: <– 輸入ROOT密碼 // KD020lzb@

Re-enter new password: <– 再輸入一次ROOT密碼

Remove anonymous users? [Y/n] <– 回車

Disallow root login remotely? [Y/n] <– 回車

Remove test database and access to it? [Y/n] <– 回車

Reload privilege tables now? [Y/n] <– 回車

(6)可以驗證一下剛才設置的密碼

此外,由于我們數據庫會用到中文字符集,所以要進行一下相應配置。

(1)修改/etc/my.cnf

vi /etc/my.cnf

在[client]段增加:

default-character-set=utf8

在[mysqld]段增加:

character-set-server=utf8

collation-server=utf8_general_ci

(2)配置完成后要重啟服務

systemctl restart mysqld

安裝Nginx

我使用的是手工安裝的方式,你也可以選擇yum方式

(1)Nginx的運行需要依賴以下組件,需要先安裝

yum install -y gcc-c++

yum install -y pcre pcre-devel

yum install -y zlib zlib-devel

yum install -y openssl openssl-devel

(2)下載安裝包

wget -c https://nginx.org/download/nginx-1.10.2.tar.gz

(3)解壓

tar -zxvf nginx-1.10.2.tar.gz

(4)進入nginx-1.10.2目錄,直接編譯安裝

./configure

make

make install

默認會安裝到/usr/local/nginx目錄。

(5)設置開機啟動,方式跟tomcat類似

vi /usr/lib/systemd/system/nginx.service

輸入以下內容:

[Unit]

Description=nginx - high performance web server

After=network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

PIDFile=/usr/local/nginx/logs/nginx.pid

ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

設置開機啟動并立即啟動服務

systemctl enable nginx.service

systemctl start nginx.service

(6)開放相關端口

在訪問應用之前,我們要先在防火墻中開放相關的端口,可以直接使用以下命令:

firewall-cmd --permanent --zone=public --add-service=http

firewall-cmd --permanent --zone=public --add-service=https

firewall-cmd --reload

這時候輸入http://IP地址,應該就能夠看到Nginx中默認的頁面了。不過由于我們沒有開放8080端口,所以你不能使用8080端口來訪問Tomcat。為什么不開放8080端口呢?因為我們不需要開放,我們走的是Nginx反向代理,Nginx會自動根據配置(見下文)將內容轉交給Tomcat處理。

接下來申請SSL證書并對Nginx和Tomcat進行整合。

申請免費的SSL證書

目前SSL證書大部分都是要收費的。對于企業網站,建議還是花點錢買個安心吧,而對于個人網站,可以選擇免費的Let's encrypt。

安裝SSL證書的過程并不復雜,第一步是申請證書,第二步是在Nginx中配置證書路徑。

(1)安裝certbot工具

yum install epel-release

yum install certbot

這個工具會在 你的網站根目錄(也就是/usr/local/nginx/html)/.well-known 生成特殊的文件,在申請證書時,Let's Encrypt 服務會通過 http 來訪問此文件,以簽證服務器,所以在使用 certbot 獲取證書之前,你要確保可以瀏覽器中能夠通過http正常訪問服務器。

(2)申請證書

certbot certonly -a webroot --webroot-path=/usr/local/nginx/html -d xxx.com -d www.xxx.com

這里的--webroot-path指定網站的根目錄,使用-d來指定應用證書的域名,如果有多個,使用多個-d就可以(一般至少應該兩個,一個沒有www、一個有www)。

最終會在 /etc/letsencrypt/live/xxx.com 下,生成四個 PEM 文件

cert.pem: 域名證書

chain.pem:Let's Enctrypt chain certificate

fullchain.pem:cert.pem 和 chain.pem 組成

privkey.pem:證書的私鑰

我們需要用到的是后面的兩個:fullchain.pem和privkey.pem

(3)在Nginx中應用證書

這一步見下一部分的具體配置。

(4)配置自動更新證書

因為 Let's Encrypt 的證書有效期是90天,到期前要更新證書。certbot 提供了更新證書的命令 cerbot renew。添加一個 conb job 來實現自動更新

crontab -e

輸入

30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

35 2 * * 1 /usr/bin/systemctl reload nginx

保存即可創建 cron job。以后每周1的凌晨2點30自動更新證書,2點35自動重啟nginx。

Nginx與Tomcat終極整合

Nginx對于靜態內容的處理能力非常強,跟Tomcat整合我們一般會將靜態資源交給Nginx來處理,同時,考慮到我們會使用靜態化技術來將頁面轉為html并會用到文件上傳功能,所以,我們要將Nginx目錄的權限也交給tomcat用戶,以便其可以正常將文件寫入到/usr/local/nginx/html目錄下。

chown -R tomcat:tomcat /usr/local/nginx

修改/usr/local/nginx/conf/nginx.conf,內容如下,我已經在要關注的地方進行了說明。這個配置主要實現了以下幾項功能:

(1)與Tomcat服務器整合(支持集群)

(2)支持ssl,對特定目錄強制使用https協議,其他目錄則可以分別使用兩種協議

(3)與php整合,對phpMyAdmin增加多一重auth basic驗證

#注意改為tomcat

user tomcat;

#根據服務器CPU數量來設

worker_processes 1;

error_log logs/error.log;

#這個pid路徑要跟/usr/lib/systemd/system/nginx.service中的保持一致

pid logs/nginx.pid;

events {

use epoll;

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

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 logs/access.log main;

sendfile on;

tcp_nopush on;

keepalive_timeout 65;

types_hash_max_size 2048;

#注意這里我們包含了一個proxy.conf文件,該文件也是位于/usr/local/nginx/conf目錄,下文會講

include proxy.conf;

#下面這堆配置主要用來限制并發連接數,以及壓縮內容節省帶寬

limit_conn_zone $binary_remote_addr zone=addr:10m;

gzip on;

gzip_min_length 1000;

gzip_comp_level 4;

gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

open_file_cache max=655350 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 2;

#定義Tomcat服務器的位置,包括端口、權重。如果要配置集群,可以在其中增加多個server,只要將localhost改為具體IP地址并設置權重即可。這里實用的是ip_hash方案,即對于集群環境下,根據ip地址來確定內容轉交給哪個Tomcat處理。

upstream tomcats{

ip_hash;

server localhost:8080 weight=1;

}

#下面定義的是默認監聽端口80,我們要求所有java action(jsp)以及php都走https協議,因此80端口下放的都是靜態資源(html、圖片、js等),因此無須太多的配置。

server{

listen 80;

server_name xxx.com www.xxx.com;

#admin目錄和phpMyAdmin目錄強制使用https協議

location ~ /(admin|phpMyAdmin)/ {

return 301 https://$server_name$request_uri;

}

#do、jsp等交由Tomcat來處理

location ~ .*.(do|jsp|action|jspx|shtml)?$ {

proxy_pass http://tomcats;

}

}

#下面是監聽https協議(默認443端口)

server {

listen 443 ssl;

server_name xxx.com www.xxx.com;

server_tokens off;

charset utf-8;

//限制并發連接數,這里的“addr”是在前面的“ limit_conn_zone”中定義的,名稱要保持一致

limit_conn addr 5;

#只允許我們的域名訪問

if ($host !~ ^(xxx.com|www.xxx.com|images.xxx.com)$ ) {

return 444;

}

#屏蔽非法請求類型

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

return 444;

}

#拒絕異常的User-Agents

if ($http_user_agent ~* LWP::Simple|BBBike|wget) {

return 403;

}

if ($http_user_agent ~* Sosospider|YodaoBot) {

return 403;

}

#設置網站根目錄

root /usr/local/nginx/html;

#設置默認首頁

index index.html index.htm index.php;

include /etc/nginx/default.d/*.conf;

#配置ssl證書

ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

location / {

}

location ^~ /static/{

}

#admin目錄轉交Tomcat處理

location ~ /admin/ {

proxy_pass http://tomcats;

}

#do、jsp等資源轉交Tomcat處理

location ~ .*.(do|jsp|action|jspx|shtml)?$ {

proxy_pass http://tomcats;

}

#phpMyAdmin目錄轉交php處理

location ~ /phpMyAdmin/ {

fastcgi_index index.php;

location ~ .*.(php|php5)?$ {

#這里的9000端口是在/etc/php.ini中配置的,9000是默認值,你也可以修改

fastcgi_pass 127.0.0.1:9000;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

#/配置auth_basic驗證

auth_basic "security";

#密碼保存在哪里

auth_basic_user_file /usr/local/nginx/conf/passwd;

}

error_page 404 /404.html;

location = /40x.html {

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

}

上面的配置文件中我們還調用了兩個配置文件:proxy.conf、passwd。

proxy.conf的內容如下:

proxy_redirect off; #代理重定向關閉

proxy_set_header Host $host; #從header頭中獲取的主機名

proxy_set_header X-Real-IP $remote_addr;#獲取header頭中獲取的主機的真實IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #獲取header頭中獲取代理者的真實ip

proxy_set_header X-Forwarded-Proto $scheme;

server_names_hash_bucket_size 128;

large_client_header_buffers 4 32k; #設置請求緩存

client_header_buffer_size 64k; #客戶端上傳文件緩存大小

client_max_body_size 300m; #設置客戶端能夠上傳文件大小

client_body_buffer_size 512k;

proxy_connect_timeout 60; #跟后臺服務器連接超時時間發起握手等待響應超時時間

proxy_send_timeout 90; #后臺服務器數據回傳時間,就是在規定時間內后端服務器必須傳完所有數據

proxy_read_timeout 90; #連接成功后,等待服務器響應時間,其實已經進入后端的排隊之中等待處理

proxy_buffer_size 16k; #設置請求緩存區,這個緩存區會保存用戶的頭信息,以供nginx進行規則處理,一般只要能保存下頭信息即可

proxy_buffers 4 64k; #告訴nginx保留單個用到幾個Buffer最大用多少空間

proxy_busy_buffers_size 128k; #代理忙碌時使用的緩沖區大小

proxy_temp_file_write_size 128k;#緩存臨時文件的大小

而passwd文件則要通過命令來生成:

printf "admin:$(openssl passwd -crypt admin888) " >>/usr/local/nginx/conf/passwd

上面的admin是用戶名、admin888是密碼。當我們訪問http://xxx.com/phpMyAdmin的時候,將會先彈出以下提示,然后才進入正常的登陸界面。

除了配置Nginx外,我們還要配置Tomcat。

打開/usr/local/tomcat/conf/server.xml,在 節增加如下內容:

remoteIpHeader="X-Forwarded-For"

protocolHeader="X-Forwarded-Proto"

protocolHeaderHttpsValue="https"/>

這里順便將Host的unpackWARs以及autoDeploy設置成false,主要是為了提高安全性。

至此,所有配置完成,訪問網站的時候可以看到URL位置有“安全連接”的提示:

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容