Debian 部署 Python3 + Flask + uwsgi + Nginx + Supervisor

永遠(yuǎn)不要逃避問題,有些問題你是逃不過去的,你現(xiàn)在逃避,你以后就會(huì)花十倍的精力去面對(duì),因?yàn)闀r(shí)間不會(huì)給弱者任何回報(bào) 。

安裝編譯用的包

如果在 root 下就不用輸入 sudo。在子用戶下就在命令前加上 sudo。

  1. $ sudo apt-get install build-essential

  2. $ sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev

  3. $ sudo apt-get install libdb5.1-dev libgdbm-dev libsqlite3-dev libssl-dev

  4. $ sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

下載安裝 Python3

  • 下載 Python3 包

$ wget --no-check-certificate

https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz

'下載可能會(huì)出現(xiàn)證書無效問題,只要安裝個(gè) ca-certificates 或使用 --no-check-certificate 下載就可以避免下面的錯(cuò)誤'

  • 進(jìn)入下載目錄
 $ cd 下載的目錄下/
  • 解壓包
 $ tar -zxf Python-3.6.3.tgz
  • 進(jìn)入python3
 $ cd Python-3.6.3

編譯安裝

(1)解決 PIP 包管理器所需依賴包

 $ vim Modules/Setup.dist

(2)將下面 1 行取消注釋,大概在文件的 361 行左右.修改后 esc:wq 保存并退出

 zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

自定義安裝目錄

(1)創(chuàng)建安裝目錄

$ mkdir -p /usr/local/python3.6.3

(2)進(jìn)入 Python3 目錄

 $ cd Python-3.6.3

(3)指定到安裝目錄

 $ ./configure --prefix=/usr/local/python3.6.3
 $ ./configure --enable-optimizations

(4)這里編譯使用的是 make all 沒有直接使用 make,all 參數(shù)會(huì)編譯所有子模塊。

 $ make all
 $ make install

把 Python3 添加到 PATH 里

(1)打開~/.bashrc 文件

(2)添加執(zhí)行路徑

 $ sudo vim ~/.bashrc
 export PATH=$PATH:/usr/local/python3.6.3/bin

添加新的別名信息來修改默認(rèn)使用的Python版本

alias python='/usr/bin/python3.6.3'

(3)生效配置文件

$ source .bashrc

(4)查看版本:

因?yàn)樯厦嬉呀?jīng)添加了默認(rèn)使用 Python3.6.3,所以直接輸入 $ python -V 會(huì)出現(xiàn)

(-bash: /usr/bin/python3.6.3: No such file or directory)

報(bào)錯(cuò)。

查看 Python 版本輸入以下:

 $ sudo vim ~/.bashrc
 export PATH=$PATH:/usr/local/python3.6.3/bin

安裝 Nginx

(1)安裝

$ sudo apt-get install nginx
# 查看版本
$ nginx -v

(2)啟動(dòng) Nginx

$ sudo /etc/init.d/nginx start

瀏覽器訪問:你的服務(wù)器ip地址 如:http://45.45.162.162

出現(xiàn)上圖:表示成功

(3)停止 Nginx

 $ sudo nginx -s stop

安裝 uWSGI

(1)因?yàn)橐呀?jīng)安裝 Python3 所以要使用 pip3 進(jìn)行安裝

 $ pip3 install uwsgi

(2)查看版本

 $ uwsgi --version

(3)安裝方法二

下載:

 $ wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz

(4)解壓:

 $ tar zxvf uwsgi-latest.tar.gz

測(cè)試

如果:有現(xiàn)成的項(xiàng)目可以把項(xiàng)目上傳到服務(wù)器中,在 git 管理項(xiàng)目,只需要 git clone 一下就可以了。

如果:你需要從本地上傳項(xiàng)目文件,可以用 scp 命令,這里就不啰嗦用法了。總之我們將項(xiàng)目文件放到服務(wù)器,然后就可以用 virtualenv 管理 Python 環(huán)境

virtualenv 就不多說了。這里直接用 flask demo 進(jìn)行。

一、安裝虛擬環(huán)境

$ pip3 install virtualenv

二、創(chuàng)建一個(gè)包

 $ mkdir myproject
 $ cd myproject

三、創(chuàng)建虛擬環(huán)境

 $ virtualenv env

(1)激活虛擬環(huán)境

 $ source env/bin/activate

(2)在虛環(huán)境中安裝 flask

 $ pip3 install flask

(3)退出虛環(huán)境

 $ deactivate

(4)創(chuàng)建啟動(dòng)文件

 $ vim run.py

(5)寫入一個(gè) flask,端口自己進(jìn)行設(shè)置。我這里用的 80 端口。

 from flask import Flask
 app = Flask(__name__)
 @app.route("/")
 def hello():
     return "Hello World!"
 if __name__ == "__main__":
     app.run(host='0.0.0.0', port=80)

(6)esc+wq 保存并且退出

四、運(yùn)行這個(gè) run.py 文件

(1)先停止 Nginx

 $ nginx -s stop

(2)打開你設(shè)置的端口(端口默認(rèn)全部是關(guān)閉狀態(tài))端口自行設(shè)置。

 $ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 # 如果想關(guān)閉打開的端口:
 $ iptables -A INPUT -p tcp --dport 80 -j DROP

(3)啟動(dòng) flask 程序

 $ cd myproject
 $ python3 run.py

五、用其他電腦和手機(jī) 4G 訪問你的服務(wù)器 ip 地址+上端口。

如:http://45.32.122.555:80/

出現(xiàn):Hello World! 那就成功了。

配置 Nginx

(1)進(jìn)入

 $ cd /etc/nginx/sites-enabled/

(2)編輯 default

 $ vim default
------------------------------------
 # 或者直接配置 $ cd /etc/nginx 
 $ vim nginx.conf
 # 不過要根據(jù)其語法來配置其實(shí)最后nginx.conf還是會(huì)調(diào)用/etc/nginx/sites-enabled/default的配置。

(3)在最后寫入后 : wq 保存并且退出

 server {
 listen  80;
 server_name 45.32.162.255; 
 charset      utf-8;
 client_max_body_size 75M;
 location / {
     include      uwsgi_params;
     uwsgi_pass   127.0.0.1:8000;  
     uwsgi_param UWSGI_PYHOME /root/myproject/venv;
     uwsgi_param UWSGI_CHDIR  /root/myproject; 
     uwsgi_param UWSGI_SCRIPT run:app; 
     }
 }

(4)解析

listen 80; # 服務(wù)器監(jiān)聽端口
server_name 45.32.162.255; # 這里寫你的域名或者公網(wǎng)IP
charset utf-8; # 編碼
client_max_body_size 75M; # 之前寫的關(guān)于GET和POST的區(qū)別
include uwsgi_params; # 導(dǎo)入uwsgi配置
uwsgi_pass 127.0.0.1:8000; # 轉(zhuǎn)發(fā)端口,需要和uwsgi配置當(dāng)中的監(jiān)聽端口一致 (下面會(huì)配置uwsgi)
uwsgi_param UWSGI_PYTHON /root/myproject/venv; # Python解釋器所在的路徑(這里為虛擬環(huán)境)【路徑按照自己具體的路徑填寫】
uwsgi_param UWSGI_CHDIR /root/myproject; # 項(xiàng)目根目錄
uwsgi_param UWSGI_SCRIPT run:app; # 項(xiàng)目的主程序,即Flask app所在的位置【run是運(yùn)行文件run.py文件(根據(jù)自己創(chuàng)建的文件名)app是falsk實(shí)例】

(5)測(cè)試一下配置文件是否正確,若檢測(cè)配置文件失敗,再好好檢查下配置文件有沒有疏漏。

$ nginx -t

表示測(cè)試成功

(6)此時(shí)訪問 Nginx 服務(wù)器應(yīng)該會(huì)得到 502 Bad Gateway 的提示,因?yàn)檎?qǐng)求被 Nginx 轉(zhuǎn)發(fā)了,但是并沒有轉(zhuǎn)發(fā)服務(wù)器來處理請(qǐng)求(還沒有配置好 uwsgi)。

 $ service nginx start

配置 uwsgi

一、在項(xiàng)目文件根目錄新建配置文件 uwsgi.ini(uwsgi 支持多種配置文件格式: xml, ini, json 等)

(1)進(jìn)入項(xiàng)目根目錄

 $ cd myproject

(2)創(chuàng)建 uwsgi 文件

 $ vim uwsgi.ini

(3)寫入以下內(nèi)容后 : wq 保存并退出

 [uwsgi]                                                     
 socket = 127.0.0.1:8000                         
 plugins = python                                        
 chidir = /root/myproject                                    
 wsgi-file = run.py                                       
 callable = app                  
# uwsgi的監(jiān)聽端口【要跟上面nginx配置里的端口一樣】
# 這行一定要加上,不然請(qǐng)求時(shí)會(huì)出現(xiàn)-- unavailable modifier requested: 0 --錯(cuò)誤提示
# 項(xiàng)目根目錄【路徑按照自己具體的路徑填寫】
# flask程序的啟動(dòng)文件【這里我命名為run.py】
# 程序變量名 【app是falsk實(shí)例變量】

二、啟動(dòng)測(cè)試

(1)啟動(dòng) Nginx

 $ service nginx restart

(2)啟動(dòng) uwsgi

注意要回到項(xiàng)目根目錄下執(zhí)行

 $ cd ~
 $ cd myproject
 $ uwsgi uwsgi.ini

若一切正常的話就可以在終端上看到 uwsgi 的啟動(dòng)信息了

(3)打開瀏覽器

訪問你的 ip 加上端口

例:http://45.32.162.255:80

頁面出現(xiàn):Hello World!

說明 Nginx 和 uwsgi 配置成功了

但離真正項(xiàng)目上線還差一段,因?yàn)?uwsgi 是直接在前臺(tái)啟動(dòng)的,當(dāng)我們的連接終端跟服務(wù)器斷開的時(shí)候 uwsgi 進(jìn)程也被關(guān)閉了,所以我們需要 uwsgi 在后臺(tái)運(yùn)行。

解釋一下上面這段話:我們?cè)谶B接服務(wù)器啟動(dòng)項(xiàng)目后可以用瀏覽器訪問成功。但是我們一但關(guān)閉與服務(wù)器的連接后再用瀏覽器訪問就不行了.項(xiàng)目是運(yùn)行在前臺(tái)的也就是說.在關(guān)閉與服務(wù)器連接的同時(shí)也關(guān)閉了服務(wù)器的命令窗.運(yùn)行在前臺(tái)的項(xiàng)目也同時(shí)關(guān)閉。所以我們需要把項(xiàng)目運(yùn)行在后臺(tái)。

三、后臺(tái)啟動(dòng)項(xiàng)目

(1)用 nohup 啟動(dòng):不掛斷運(yùn)行命令,用"&"可以讓你的命令在后臺(tái)執(zhí)行

(nohup 詳細(xì)的命名參數(shù)請(qǐng)到官網(wǎng)查詢)注意:別漏了 & 號(hào)。

 $ nohup uwsgi uwsgi.ini &

(2)關(guān)閉與服務(wù)器的連接,然后用瀏覽器訪問你的 ip 地址:

顯示:Hello World! 表示 ok 了!

(3)可以通過命令把這個(gè)項(xiàng)目從后臺(tái)停止,查詢 uwsgi 的進(jìn)程( linux 命令不詳細(xì)說了)

 $ ps -ef|grep uwsgi

找到 uwsgi 進(jìn)程 uwsgi.ini:

root 7950 1 0 14:57 ? 00:00:00 uwsgi uwsgi.ini

進(jìn)程 id 每個(gè)人都不一樣 這里的 id 是 7950。

(4)殺掉后臺(tái)的 uwsgi 進(jìn)程 kill -9 后面加上進(jìn)程的 id 或者 killall uwsgi 殺掉全部同名為 uwsgi 的進(jìn)程。

 $ kill -9 7950
 $ killall uwsgi

(5)再用瀏覽器去訪問 ip

瀏覽器頁面顯示: 502 Bad Gateway 表示停止掉 uwsgi 程序的運(yùn)行

(6)項(xiàng)目根目錄下會(huì)生成 nohup.out 記錄日志

使用 Supervisor 進(jìn)程監(jiān)控

** Supervisor 是 Python2 寫就的一款強(qiáng)大的運(yùn)維工具。**

目前 Supervisor 還不支持 Python3。可以通過以下方法解決。

可通過 pip 安裝.這里用的是 Python3 的 pip.所以會(huì)安裝失敗.使用以下.

(1)首先安裝 supervisor (默認(rèn)由自帶的 python2.7 驅(qū)動(dòng))

 $ apt-get install supervisor

(2)進(jìn)入默認(rèn)配置文件(修改配置文件)

 $ cd /etc/supervisor/
 $ vim supervisord.conf

按 shift+G 跳到末尾

添加:files = /etc/supervisor/*.conf

esc:wq 保存

這樣方便為每個(gè) app 單獨(dú)設(shè)置 conf 文件而不必全部寫在全局設(shè)置里面

在啟動(dòng) supervisorctl 須先啟動(dòng) supervisord。

否則會(huì)出現(xiàn)

error:

<class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python2.7/socket.py line: 575錯(cuò)誤

執(zhí)行:(若不是在 root 下執(zhí)行在最前面加上 sudo)

 $ supervisord -c /etc/supervisor/supervisord.conf
 $ supervisorctl -c /etc/supervisor/supervisord.conf
 # 這里補(bǔ)充以一下:每當(dāng)修改完配置后如果出現(xiàn)
 error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.
 # 請(qǐng)重新執(zhí)行以上的兩句命令

進(jìn)入:supervisor shell 模式表示成功

退出:supervisor shell

supervisor> exit

(3)創(chuàng)建腳本文件,生成默認(rèn)配置文件.

 $ cd /etc/supervisor/conf.d/
 新建app.conf文件(文件名自己定義)
 $ vim app.conf

(4)進(jìn)入編輯模式添加配置

 [program:myproject]
 directory = /root/myproject/
 command= uwsgi --ini /root/myproject/uwsgi.ini
 autostart = true
 startsecs = 5
 autorestart = true
 startretries = 3
 user = root
 redirect_stderr = true
 stdout_logfile_maxbytes = 20MB
 stdout_logfile_backups = 20
 stdout_logfile = /tmp/app.log
 stopasgroup=false
 killasgroup=false

esc:wq 保存并退出

解析

[program:myproject]:# 項(xiàng)目的包名字(我的是myproject)

directory = /root/myproject/:# 程序的啟動(dòng)目錄路徑

command= uwsgi --ini /root/myproject/uwsgi.ini:#啟動(dòng)命令
(相當(dāng)于直接啟動(dòng) uwsgi uwsgi.ini一樣只是加上了路徑)

autostart = true:# 在 supervisord 啟動(dòng)的時(shí)候也自動(dòng)啟動(dòng)
startsecs = 5: # 啟動(dòng) 5 秒后沒有異常退出,就當(dāng)作已經(jīng)正常啟動(dòng)了
autorestart = true:# 程序異常退出后自動(dòng)重啟
startretries = 3:# 啟動(dòng)失敗自動(dòng)重試次數(shù),默認(rèn)是 3
user = root: # 使用哪個(gè)用戶啟動(dòng)(我這里用的root)

redirect_stderr = true:# 把 stderr 重定向到 stdout,默認(rèn) false
stdout_logfile_maxbytes = 20MB:# stdout 日志文件大小,默認(rèn) 50MB
stdout_logfile_backups = 20:# stdout 日志文件備份數(shù)

注意:

stdout 日志文件,需要注意當(dāng)指定目錄不存在時(shí)無法正常啟動(dòng),所以需要手動(dòng)創(chuàng)建目錄( supervisord 會(huì)自動(dòng)創(chuàng)建日志文件)別忘了配置之后創(chuàng)建下面繼續(xù)。

stdout_logfile = /tmp/app.log

說下這兩個(gè)有用的配置項(xiàng) stopasgroup 和 killasgroup,如果我們用 Flask 等 Rest 服務(wù),通常其會(huì)開啟幾個(gè)進(jìn)程,那么如果 stopasgroup 不啟用的話, supervisor 無法重啟此服務(wù)(關(guān)閉主進(jìn)程時(shí)其子進(jìn)程沒有關(guān)閉,再開啟主進(jìn)程時(shí)會(huì)提示端口被占用等錯(cuò)誤信息)。

stopasgroup=false:

默認(rèn)為 false,如果設(shè)置為 true,當(dāng)進(jìn)程收到 stop 信號(hào)時(shí),會(huì)自動(dòng)將該信號(hào)發(fā)給該進(jìn)程的子進(jìn)程。如果這個(gè)配置項(xiàng)為 true,那么也隱含 killasgroup 為 true。例如在 Debug 模式使用 Flask 時(shí),F(xiàn)lask 不會(huì)將接收到的 stop 信號(hào)也傳遞給它的子進(jìn)程,因此就需要設(shè)置這個(gè)配置項(xiàng)。

killasgroup=false:

默認(rèn)為 false,如果設(shè)置為 true,當(dāng)進(jìn)程收到 kill 信號(hào)時(shí),會(huì)自動(dòng)將該信號(hào)發(fā)給該進(jìn)程的子進(jìn)程。如果這個(gè)程序使用了 python 的 multiprocessing 時(shí),就能自動(dòng)停止它的子線程。

 # 創(chuàng)建日志的文件夾
 $ cd ~
 $ cd /myproject/
 $ mkdir tmp

配置完成。

還有更多的配置參數(shù)請(qǐng)查閱官網(wǎng)

這里我們可以看出,雖然 supervisor 是 Python2 寫的,但只要我們指定運(yùn)行的 Python3 解釋器去運(yùn)行程序就行了。

(5)使配置生效(每當(dāng)修改主配置文件或增改子配置文件都需要執(zhí)行使它生效)

需要先進(jìn)入 $ cd /etc/supervisor 目錄或者項(xiàng)目的目錄 cd myproject/ 才可以運(yùn)行相關(guān)的命令如:supervisorctl reload 等相關(guān)命令

 $ supervisorctl update # 因?yàn)槭莗ython3執(zhí)行該命令可能會(huì)報(bào)錯(cuò)
 # 可以使用以下命令:重新加載配置文件
 $ supervisorctl reload

(6)運(yùn)行 supervisorctl,即可進(jìn)入 shell 里面方便的操作,如 start app、restart app等。

 $ cd /etc/supervisor
 $ supervisorctl
 $ start myproject # 你的項(xiàng)目名稱
 # 執(zhí)行start后可以看到 myproject RUNNING pid 16758, uptime 0:02:58
 $ restart myproject # 重新啟動(dòng)
 $ stop myproject # 停止
 # 更多相關(guān)命令可以到官網(wǎng)上查閱這里不消息介紹

(7)以上我們只能在控制臺(tái)查看運(yùn)行.我們需要 web 界面上查看

 # 添加修改配置文件
 $ cd /etc/supervisor/
 $ vim supervisord.conf
 # 如果在 vim 模式下找到則對(duì)應(yīng)修改
 # 如果沒有 按 shift+G 跳至末尾添加

 # IP和綁定端口
 # 管理員名稱
 # 管理員密碼
 [inet_http_server]
 port = 45.32.111.111:9001   
 username = user 
 password = 666666
 # 如果不需要密碼可以注釋在最前面機(jī)上;號(hào)
 # ;username = user 
 # ;password = 666666
 # 重新加載配置文件使它生效
 $ cd /etc/supervisor
 $ supervisorctl reload
 # 最后你需要打開你的這個(gè)端口并且重啟 supervisorctl
 $ iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
 $ cd /etc/supervisor
 $ supervisorctl

(8)用瀏覽器啟動(dòng)

 # 輸入你的 ip 和端口
 45.32.111.111:9001

看到上圖界面表示已經(jīng)成功,之后可以通過打開 Supervisor 端口去監(jiān)控管理你的項(xiàng)目一鍵啟動(dòng)/停止你的項(xiàng)目。

有什么遺漏不足的請(qǐng)多多指導(dǎo)!!!

作者:[沙河頂戰(zhàn)神]
原文鏈接:http://www.cnblogs.com/yangyuexiong/p/7825306.html

技術(shù)交流群:238757010

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