精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個 Node 進程的死亡與善后

開發 前端
人固有一死,一個 Node 進程亦是如此,總有萬般不愿也無法避免。從本篇文章我們看看一個進程滅亡時如何從容離去。

[[387380]]

 本文轉載自微信公眾號「全棧成長之路」,作者山月行。轉載本文請聯系全棧成長之路公眾號。  

嗯,這是山月好久沒有更新的原創,正文從下開始。

人固有一死,一個 Node 進程亦是如此,總有萬般不愿也無法避免。從本篇文章我們看看一個進程滅亡時如何從容離去。

一個 Node 進程,除了提供 HTTP 服務外,也絕少不了跑腳本的身影。跑一個腳本拉取配置、處理數據以及定時任務更是家常便飯。在一些重要流程中能夠看到腳本的身影:

  • CI,用以測試、質量保障及部署等
  • Cron,用以定時任務
  • Docker,用以構建鏡像

如果在這些重要流程中腳本出錯無法及時發現問題,將有可能引發更加隱蔽的問題。如果在 HTTP 服務出現問題時,無法捕獲,服務異常是不可忍受的。

最近觀察項目鏡像構建,會偶爾發現一兩個鏡像雖然構建成功,但容器卻跑不起來的情況究其原因,是因為 一個 Node 進程滅亡卻未曾感知到的問題。

Exit Code

什么是 exit code?

exit code 代表一個進程的返回碼,通過系統調用 exit_group 來觸發。

在 POSIX 中,0 代表正常的返回碼,1-255 代表異常返回碼,在業務實踐中,一般主動拋出的錯誤碼都是 1。在 Node 應用中調用 API process.exitCode = 1 來代表進程因期望外的異常而中斷退出。

這里有一張關于異常碼的附表 Appendix E. Exit Codes With Special Meanings[1]。

 

Exit Code Number Meaning Example Comments
1 Catchall for general errors let "var1 = 1/0" Miscellaneous errors, such as "divide by zero" and other impermissible operations
2 Misuse of shell builtins (according to Bash documentation) empty_function() {} Missing keyword or command, or permission problem (and diff return code on a failed binary file comparison).
126 Command invoked cannot execute /dev/null Permission problem or command is not an executable
127 "command not found" illegal_command Possible problem with $PATH or a typo
128 Invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255 (see first footnote)
128+n Fatal error signal "n" kill -9 $PPID of script $? returns 137 (128 + 9)
130 Script terminated by Control-C Ctl-C Control-C is fatal error signal 2, (130 = 128 + 2, see above)
255* Exit status out of range exit -1 exit takes only integer args in the range 0 - 255

異常碼在操作系統中隨處可見,以下是一個關于 cat 進程的異常以及它的 exit code,并使用 strace 追蹤系統調用。

  1. $ cat a 
  2. cat: a: No such file or directory 
  3.  
  4. # 使用 strace 查看 cat 的系統調用 
  5. # -e 只顯示 write 與 exit_group 的系統調用 
  6. $ strace -e write,exit_group cat a 
  7. write(2, "cat: ", 5cat: )                    = 5 
  8. write(2, "a", 1a)                        = 1 
  9. write(2, ": No such file or directory", 27: No such file or directory) = 27 
  10. write(2, "\n", 1 
  11. )                       = 1 
  12. exit_group(1)                           = ? 
  13. +++ exited with 1 +++ 

從 strace 追蹤進程顯示的最后一行可以看出,該進程的 exit code 是 1,并把錯誤信息輸出到 stderr (stderr 的 fd 為 2) 中

如何查看 exit code

從 strace 中可以來判斷進程的 exit code,但是不夠方便過于冗余,更無法第一時間來定位到異常碼。

有一種更為簡單的方法,通過 echo $? 來確認返回碼

  1. $ cat a 
  2. cat: a: No such file or directory 
  3.  
  4. $ echo $? 
  5. $ node -e "preocess.exit(52)" 
  6. $ echo $? 
  7. 52 

未曾感知的痛苦何在: throw new Error 與 Promise.reject 區別

以下是兩段代碼,第一段拋出一個異常,第二段 Promise.reject,兩段代碼都會如下打印出一段異常信息,那么兩者有什么區別?

  1. function error () { 
  2.   throw new Error('hello, error'
  3.  
  4. error() 
  5.  
  6. // Output
  7.  
  8. // /Users/shanyue/Documents/note/demo.js:2 
  9. //   throw new Error('hello, world'
  10. //   ^ 
  11. // 
  12. // Error: hello, world 
  13. //     at error (/Users/shanyue/Documents/note/demo.js:2:9) 
  1. async function error () { 
  2.   return new Error('hello, error'
  3.  
  4. error() 
  5.  
  6. // Output
  7.  
  8. // (node:60356) UnhandledPromiseRejectionWarning: Error: hello, world 
  9. //    at error (/Users/shanyue/Documents/note/demo.js:2:9) 
  10. //    at Object.<anonymous> (/Users/shanyue/Documents/note/demo.js:5:1) 
  11. //    at Module._compile (internal/modules/cjs/loader.js:701:30) 
  12. //    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10) 

在對上述兩個測試用例使用 echo $? 查看 exit code,我們會發現 throw new Error() 的 exit code 為 1,而 Promise.reject() 的為 0。

從操作系統的角度來講,exit code 為 0 代表進程成功運行并退出,然而此時即使有 Promise.reject,操作系統也會視為它執行成功。

這在 Dockerfile 與 CI 中執行腳本時將留有安全隱患。

Dockerfile 在 Node 鏡像構建時的隱患

當使用 Dockerfile 構建鏡像或者 CI 時,如果進程返回非 0 返回碼,構建就會失敗。

這是一個淺顯易懂的含有 Promise.reject() 問題的鏡像,我們從這個鏡像來看出問題所在。

  1. FROM node:12-alpine 
  2.  
  3. RUN node -e "Promise.reject('hello, world')" 

構建鏡像過程如下,最后兩行提示鏡像構建成功:即使在構建過程打印出了 unhandledPromiseRejection 信息,但是鏡像仍然構建成功。

  1. $ docker build -t demo . 
  2. Sending build context to Docker daemon  33.28kB 
  3. Step 1/2 : FROM node:12-alpine 
  4.  ---> 18f4bc975732 
  5. Step 2/2 : RUN node -e "Promise.reject('hello, world')" 
  6.  ---> Running in 79a6d53c5aa6 
  7. (node:1) UnhandledPromiseRejectionWarning: hello, world 
  8. (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) 
  9. (node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 
  10. Removing intermediate container 79a6d53c5aa6 
  11.  ---> 09f07eb993fe 
  12. Successfully built 09f07eb993fe 
  13. Successfully tagged demo:latest 

但如果是在 node 15 鏡像內,鏡像會構建失敗,至于原因以下再說。

  1. FROM node:15-alpine 
  2.  
  3. RUN node -e "Promise.reject('hello, world')" 
  1. $ docker build -t demo . 
  2. Sending build context to Docker daemon  2.048kB 
  3. Step 1/2 : FROM node:15-alpine 
  4.  ---> 8bf655e9f9b2 
  5. Step 2/2 : RUN node -e "Promise.reject('hello, world')" 
  6.  ---> Running in 4573ed5d5b08 
  7. node:internal/process/promises:245 
  8.           triggerUncaughtException(err, true /* fromPromise */); 
  9.           ^ 
  10.  
  11. [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "hello, world".] { 
  12.   code: 'ERR_UNHANDLED_REJECTION' 
  13. The command '/bin/sh -c node -e "Promise.reject('hello, world')"' returned a non-zero code: 1 

Promise.reject 腳本解決方案

能在編譯時能發現的問題,絕不要放在運行時。所以,構建鏡像或 CI 中需要執行 node 腳本時,對異常處理需要手動指定 process.exitCode = 1 來提前暴露問題

  1. runScript().catch(() => { 
  2.   process.exitCode = 1 
  3. }) 

在構建鏡像時,Node 也有關于異常解決方案的建議:

  1. runScript().catch(() => { 
  2.   process.exitCode = 1 
  3. }) 

根據提示,--unhandled-rejections=strict 將會把 Promise.reject 的退出碼設置為 1,并在將來的 node 版本中修正 Promise 異常退出碼。

而下一個版本 Node 15.0 已把 unhandled-rejections 視為異常并返回非 0 退出碼。

  1. $ node --unhandled-rejections=strict error.js 

Signal

在外部,如何殺死一個進程?答:kill $pid

而更為準確的來說,一個 kill 命令用以向一個進程發送 signal,而非殺死進程。大概是殺進程的人多了,就變成了 kill。

The kill utility sends a signal to the processes specified by the pid operands.

每一個 signal 由數字表示,signal 列表可由 kill -l 打印

  1. # 列出所有的 signal 
  2. $ kill -l 
  3.  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP 
  4.  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1 
  5. 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM 
  6. 16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP 
  7. 21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ 
  8. 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR 
  9. 31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3 
  10. 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8 
  11. 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 
  12. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 
  13. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7 
  14. 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2 
  15. 63) SIGRTMAX-1  64) SIGRTMAX 

這些信號中與終端進程接觸最多的為以下幾個,其中 SIGTERM 為 kill 默認發送信號,SIGKILL 為強制殺進程信號

信號 數字 是否可捕獲 描述
SIGINT 2 可捕獲 Ctrl+C 中斷進程
SIGQUIT 3 可捕獲 Ctrl+D 中斷進程
SIGKILL 9 不可捕獲 強制中斷進程(無法阻塞)
SIGTERM 15 可捕獲 優雅終止進程(默認信號)
SIGSTOP 19 不可捕獲 優雅終止進程中

在 Node 中,process.on 可以監聽到可捕獲的退出信號而不退出。以下示例監聽到 SIGINT 與 SIGTERM 信號,SIGKILL 無法被監聽,setTimeout 保證程序不會退出

  1. console.log(`Pid: ${process.pid}`) 
  2.  
  3. process.on('SIGINT',  () => console.log('Received: SIGINT')) 
  4. // process.on('SIGKILL', () => console.log('Received: SIGKILL')) 
  5. process.on('SIGTERM', () => console.log('Received: SIGTERM')) 
  6.  
  7. setTimeout(() => {}, 1000000) 

運行腳本,啟動進程,可以看到該進程的 pid,使用 kill -2 97864 發送信號,進程接收到信號并未退出

  1. $ node signal.js 
  2. Pid: 97864 
  3. Received: SIGTERM 
  4. Received: SIGTERM 
  5. Received: SIGTERM 
  6. Received: SIGINT 
  7. Received: SIGINT 
  8. Received: SIGINT 

容器中退出時的優雅處理

當在 k8s 容器服務升級時需要關閉過期 Pod 時,會向容器的主進程(PID 1)發送一個 SIGTERM 的信號,并預留 30s 善后。如果容器在 30s 后還沒有退出,那么 k8s 會繼續發送一個 SIGKILL 信號。如果古時皇帝白綾賜死,教你體面。

其實不僅僅是容器,CI 中腳本也要優雅處理進程的退出。

當接收到 SIGTERM/SIGINT 信號時,預留一分鐘時間做未做完的事情。

  1. async function gracefulClose(signal) { 
  2.   await new Promise(resolve => { 
  3.     setTimout(resolve, 60000) 
  4.   }) 
  5.  
  6.   process.exit() 
  7.  
  8. process.on('SIGINT',  gracefulClose) 
  9. process.on('SIGTERM', gracefulClose) 

這個給腳本預留時間是比較正確的做法,但是如果是一個服務有源源不斷的請求過來呢?那就由服務主動關閉吧,調用 server.close() 結束服務

  1. const server = http.createServer(handler) 
  2.  
  3. function gracefulClose(signal) { 
  4.   server.close(() => { 
  5.     process.exit() 
  6.   }) 
  7.  
  8. process.on('SIGINT',  gracefulClose) 
  9. process.on('SIGTERM', gracefulClose) 

總結

  1. 當進程結束的 exit code 為非 0 時,系統會認為該進程執行失敗
  2. 通過 echo $? 可查看終端上一進程的 exit code
  3. Node 中 Promise.reject 時 exit code 為 0
  4. Node 中可以通過 process.exitCode = 1 顯式設置 exit code
  5. 在 Node12+ 中可以通過 node --unhandled-rejections=strict error.js 執行腳本,視 Promise.reject 的 exit code 為 1,在 Node15 中修復了這一個問題
  6. Node 進程退出時需要優雅退出
  7. k8s 關閉 POD 時先發一個 SIGTERM 信號,留 30s 時間處理未完成的事,如若 POD 沒有正常退出,30s 過后發送 SIGKILL 信號

參考資料

[1]

Appendix E. Exit Codes With Special Meanings: http://www.tldp.org/LDP/abs/html/exitcodes.html

 

責任編輯:武曉燕 來源: 全棧成長之路
相關推薦

2013-04-25 09:55:21

進程線程

2013-01-15 15:22:07

2019-09-18 15:09:50

進程線程操作系統

2015-10-15 17:50:00

2021-05-21 09:36:42

開發技能代碼

2011-10-25 09:28:30

Node.js

2020-07-16 07:22:10

PythonNode.JS編程語言

2013-02-25 10:26:31

創業創業者

2024-05-27 00:00:20

2025-07-11 08:09:07

Node.jsAPI權限

2020-07-28 10:25:30

Node模塊前端

2020-08-07 10:40:56

Node.jsexpress前端

2024-11-21 08:31:07

耗資源神秘進程

2023-09-04 08:08:59

2018-06-05 15:41:22

進程線程協程

2023-07-03 07:27:41

進程線程Win32

2010-10-09 17:11:16

病毒分析

2019-05-29 10:55:01

開源Linux發行版

2015-10-12 16:45:26

NodeWeb應用框架

2019-06-10 15:00:27

node命令行前端
點贊
收藏

51CTO技術棧公眾號

亚洲专区欧美专区| aaa国产精品视频| 2014亚洲片线观看视频免费| 青青草99啪国产免费| 亚洲第一香蕉网| 色综合久久久| 黄网站色欧美视频| 亚洲欧美日韩精品久久久| av观看在线免费| 一本一道久久综合狠狠老精东影业| 亚洲日韩欧美视频一区| 宇都宫紫苑在线播放| 中文av在线全新| 亚洲黄色小视频| 日本欧美精品久久久| av在线免费在线观看| 在线视频精品| 欧美大奶子在线| 亚洲 小说 欧美 激情 另类| 日本亚洲视频| 欧美日韩中文精品| 高清在线观看免费| www在线观看播放免费视频日本| 99久久99久久免费精品蜜臀| 久久久噜噜噜久久久| 波多野结衣加勒比| 国产精品久久久久久久久久久久久久久 | 97香蕉久久夜色精品国产| 91视频免费看片| 日韩精品导航| 日韩精品最新网址| 极品粉嫩美女露脸啪啪| 网友自拍亚洲| 丰满岳妇乱一区二区三区| 91免费版看片| 大片免费在线看视频| 国产欧美视频一区二区| 精品久久久久久乱码天堂| 国产日韩欧美一区二区东京热| 日本va欧美va精品| 热久久免费视频精品| 日韩精品国产一区二区| 国产精品第十页| 久久手机免费视频| 51精品免费网站| 全球成人免费直播| 亚洲视频一区二区| 中国毛片在线观看| 伊人久久大香线蕉综合网蜜芽| 日韩精品中文字幕一区二区三区| 深爱五月综合网| 亚洲一区二区av| 欧美日韩高清一区二区不卡| 99视频在线视频| 日本综合久久| 欧美性xxxxxx少妇| 天天爱天天操天天干| 中文字幕av一区二区三区佐山爱| 色综合久久久久综合| 久久精品一区二| 第84页国产精品| 色偷偷88欧美精品久久久| 欧美三级一级片| xx欧美视频| 欧美亚洲日本一区| 亚洲一级免费在线观看| 日韩有码欧美| 欧美一级久久久| 911亚洲精选| 欧美日韩直播| 尤物99国产成人精品视频| 9.1片黄在线观看| 久久久久久美女精品| 欧美另类第一页| 国产午夜精品无码| 天堂va蜜桃一区二区三区| 国产精品video| 在线免费观看日韩视频| 国产一区二区在线电影| 动漫一区二区在线| 三级视频在线| 国产精品久久久久久一区二区三区| 在线一区亚洲| 免费不卡av| 日韩人在线观看| 中文字幕国产免费| 澳门成人av| 亚洲男女性事视频| 小早川怜子一区二区的演员表| 欧美全黄视频| 欧美在线中文字幕| 国产理论视频在线观看| 成人精品鲁一区一区二区| 欧美午夜精品久久久久久蜜| 天堂аⅴ在线地址8| 亚洲国产精品久久人人爱蜜臀| 欧美极品欧美精品欧美图片| 四虎国产精品成人免费影视| 亚洲第一精品自拍| 人人艹在线视频| 亚洲电影成人| 国产欧美中文字幕| 天堂成人在线| 最新国产の精品合集bt伙计| 男人日女人下面视频| 色诱色偷偷久久综合| 精品一区二区三区四区在线| 日韩在线不卡av| 久久精品三级| 动漫精品视频| 国产黄网站在线观看| 欧美性色视频在线| av在线天堂网| 97国产成人高清在线观看| 久久久久久久久久久久av| 在线亚洲欧美日韩| 99国产精品久久久久久久久久| 五月天综合婷婷| 色豆豆成人网| 亚洲精品国产品国语在线| 希岛爱理中文字幕| 蜜桃在线一区二区三区| 久久成人资源| 91色在线看| 欧美少妇bbb| 五月天综合视频| 亚洲黄色大片| av一区和二区| 国产1区在线| 欧美日韩视频不卡| 特级西西www444人体聚色| 在线一区免费| 国产日韩在线一区| jizz在线观看视频| 在线欧美一区二区| 色无极影院亚洲| 日韩午夜一区| 国产精品视频入口| 好操啊在线观看免费视频| 欧美日韩在线播放| 一区二区三区伦理片| 久久久999| 欧美亚洲丝袜| 久久爱91午夜羞羞| 国产丝袜一区二区三区免费视频| 五月天综合在线| 风间由美性色一区二区三区 | 激情综合中文娱乐网| 91在线高清视频| 国产在线观看免费麻豆| 91精品国产综合久久福利软件 | 成人女性视频| 国产精品美女久久久久久免费| 美丽的姑娘在线观看免费动漫| 欧美日韩在线免费观看| 性欧美丰满熟妇xxxx性仙踪林| 国产极品久久久| 亚洲国产日韩在线| 精品乱子伦一区二区三区| а√在线中文在线新版| 精品香蕉一区二区三区| 黑人精品无码一区二区三区AV| 91麻豆福利精品推荐| 欧美 国产 日本| 经典一区二区| 成人国产精品一区| aa在线视频| 日韩欧美国产午夜精品| 久久综合色综合| 丁香六月综合激情| 免费在线激情视频| 欧美日韩一区二区三区视频播放| 国产精品香蕉国产| 性国产高清在线观看| 精品久久人人做人人爱| 久久夜靖品2区| 久久婷婷成人综合色| 精品久久久久久中文字幕2017| 日韩电影一区| 草莓视频一区| 亚洲电影观看| 日韩有码片在线观看| 亚洲av无码国产精品久久不卡| 婷婷丁香久久五月婷婷| 先锋影音av在线| 国产一区二区免费视频| 日本人体一区二区| 成人写真视频| 粉嫩精品一区二区三区在线观看 | 日本大臀精品| 在线观看91av| www.毛片.com| 亚洲图片欧美激情| 一本色道综合久久欧美日韩精品 | www.四虎精品| 老妇喷水一区二区三区| 欧美爱爱视频网站| 亚洲深夜福利在线观看| 91精品在线影院| 成人欧美大片| 欧美久久精品午夜青青大伊人| 污污网站免费在线观看| 在线91免费看| 亚洲黄色小说图片| 亚洲日本中文字幕区| 性久久久久久久久久| 国产精品一二三区在线| 十八禁视频网站在线观看| 欧美精品午夜| 一区二区冒白浆视频| 网红女主播少妇精品视频| 91在线短视频| 亚洲精品tv| 国产精品18久久久久久首页狼| 韩国日本一区| 久久精品99无色码中文字幕| 毛片免费在线观看| 精品国产乱码久久久久久蜜臀 | 国产精品一二三产区| 久久精品视频免费播放| 国产视频第一区| 亚洲精品电影久久久| av小说天堂网| 在线不卡中文字幕| 久久久久久亚洲av无码专区| 亚洲电影第三页| 欧美成人三级在线观看| 成人欧美一区二区三区1314| 伊人网在线视频观看| 成人高清视频在线观看| 男人的天堂免费| 九色|91porny| 午夜宅男在线视频| 国产精品嫩草99av在线| 男女啪啪免费视频网站| 欧美午夜一区| 99亚洲国产精品| 亚洲高清影视| 国产女人18毛片| 女同性一区二区三区人了人一 | 91最新国产视频| 亚洲国产91视频| 成人国产精品久久久| 精品国产黄a∨片高清在线| 国产精品国产三级国产aⅴ浪潮| 欧美天堂视频| 国产精品va在线播放| 少妇精品视频一区二区免费看| 国产精品678| 日本综合视频| 国产精品视频在线播放| 亚洲最大的免费视频网站| 国产日韩中文字幕| 欧美高清一级片| 成人看片在线| 国产毛片精品| 九九九九九九精品| 狠狠色丁香婷婷综合影院| 日本精品视频一区| 天天做天天爱综合| 国产91视频一区| 99视频一区| 亚洲五月天综合| 麻豆一区二区在线| 亚洲国产综合av| 粉嫩av一区二区三区| a天堂视频在线观看| 久久亚洲精品小早川怜子| 国产真实乱人偷精品人妻| 国产精品视频一区二区三区不卡| 亚洲天堂一级片| 亚洲自拍偷拍网站| 亚洲自拍一区在线观看| 欧美色综合天天久久综合精品| 国产sm主人调教女m视频| 亚洲成人精品视频在线观看| 青草久久伊人| 久久精品在线视频| wwwww亚洲| 国产大片精品免费永久看nba| 欧洲亚洲精品久久久久| 国产精品久久国产精品| 久久综合色占| 国产盗摄视频在线观看| 一本综合精品| 婷婷激情5月天| 不卡视频在线观看| 日本在线观看网址| 亚洲制服丝袜在线| 亚洲精品毛片一区二区三区| 欧美一区二区视频观看视频| 午夜性色福利影院| 色999日韩欧美国产| heyzo在线播放| 国产精品久久久久久久一区探花| 亚洲免费一区三区| 日韩欧美国产二区| 国产综合自拍| 日本 片 成人 在线| 成人小视频免费观看| 亚洲欧美日韩第一页| 五月天亚洲婷婷| 国产精品无码在线播放| 亚洲精品一区二区久| 中中文字幕av在线| 国产精品久久电影观看| 国产91精品入| 九九九视频在线观看| 成人18视频日本| 日韩欧美黄色网址| 精品久久香蕉国产线看观看亚洲 | 亚洲深夜影院| 原创真实夫妻啪啪av| 国产欧美日韩亚州综合| 福利一区二区三区四区| 欧美久久久久久蜜桃| 精品乱码一区二区三四区视频 | 九九色在线视频| 国产精品香蕉国产| 女人av一区| 亚洲国产精品成人天堂| 国产一区二区三区视频在线播放| 亚洲图片另类小说| 五月天婷婷综合| www.国产精品视频| 久久久国产精品亚洲一区| 日韩一区二区三区在线免费观看 | 欧日韩在线观看| 国产精品乱战久久久| 久久久久久久香蕉| 韩国三级电影一区二区| a级黄色免费视频| 日本韩国欧美一区二区三区| 偷拍自拍在线视频| 97久久精品国产| 成人搞黄视频| 精品国产一区二区三区无码| 国产精品自在在线| 国产女人被狂躁到高潮小说| 欧美精品一级二级三级| 尤物在线视频| 国产欧美日韩精品专区| 欧美亚洲国产精品久久| 国产一级特黄a大片免费| 久久久精品日韩欧美| 久久国产视频精品| 亚洲精选中文字幕| 日韩性xxx| 日韩精品无码一区二区三区| 老司机精品视频网站| 天天躁夜夜躁狠狠是什么心态| 在线观看av一区| www视频在线观看免费| 国产精品视频资源| 亚洲成人一区| 天堂va欧美va亚洲va老司机| 亚洲高清久久久| 午夜小视频免费| 国产精品91在线| 欧美韩国日本在线观看| 在线a免费观看| 亚洲高清免费观看| 精品久久av| 国产乱肥老妇国产一区二| 国产精品毛片一区二区在线看| 久久精品一卡二卡| 亚洲高清在线精品| 可以在线观看的av| 国产欧美日韩中文字幕| 综合久久综合| 日本黄色动态图| 在线观看视频欧美| av片在线观看永久免费| 欧美日韩精品在线| 国产又黄又猛又粗又爽| 一区二区欧美久久| 在线视频成人| 成人免费性视频| 久久久久久亚洲综合影院红桃| 影音先锋国产资源| 欧美国产高跟鞋裸体秀xxxhd| 欧美大奶一区二区| 91看片在线免费观看| 亚洲精品久久久久久国产精华液| 日本韩国在线观看| 国产精品免费看久久久香蕉| 亚洲高清影视| 国产精品1000部啪视频| 在线不卡中文字幕| 九色porny丨入口在线| 亚洲欧洲日韩精品| www.亚洲激情.com| 久久久久久av无码免费看大片| 九九热在线精品视频| 久久av综合| 午夜男人的天堂| 欧美日韩不卡视频| 夜鲁夜鲁夜鲁视频在线播放| 亚洲免费视频播放| 久久久久久久久久久久久夜|