日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

用PHP構(gòu)建一個(gè)簡(jiǎn)易監(jiān)視引擎

瀏覽:148日期:2024-02-10 08:10:38

摘要:在本文中,讓我們共同探討基于PHP語(yǔ)言構(gòu)建一個(gè)基本的服務(wù)器端監(jiān)視引擎的諸多技巧及注意事項(xiàng),并給出完整的源碼實(shí)現(xiàn)。

一. 更改工作目錄的問題

當(dāng)你編寫一個(gè)監(jiān)視程序時(shí),讓它設(shè)置自己的工作目錄通常更好些。這樣以來,如果你使用一個(gè)相對(duì)路徑讀寫文件,那么,它會(huì)根據(jù)情況自動(dòng)處理用戶期望存放文件的位置。總是限制程序中使用的路徑盡管是一種良好的實(shí)踐;但是,卻失去了應(yīng)有的靈活性。因此,改變你的工作目錄的最安全的方法是,既使用chdir()也使用chroot()。

chroot()可用于PHP的CLI和CGI版本中,但是卻要求程序以根權(quán)限運(yùn)行。chroot()實(shí)際上把當(dāng)前進(jìn)程的路徑從根目錄改變到指定的目錄。這使得當(dāng)前進(jìn)程只能執(zhí)行存在于該目錄下的文件。經(jīng)常情況下,chroot()由服務(wù)器作為一個(gè)'安全設(shè)備'使用以確保惡意代碼不會(huì)修改一個(gè)特定的目錄之外的文件。請(qǐng)牢記,盡管chroot()能夠阻止你訪問你的新目錄之外的任何文件,但是,任何當(dāng)前打開的文件資源仍然能夠被存取。例如,下列代碼能夠打開一個(gè)日志文件,調(diào)用chroot()并切換到一個(gè)數(shù)據(jù)目錄;然后,仍然能夠成功地登錄并進(jìn)而打開文件資源:

<?php$logfile = fopen('/var/log/chroot.log', 'w');chroot('/Users/george');fputs($logfile, 'Hello From Inside The Chrootn');?>

如果一個(gè)應(yīng)用程序不能使用chroot(),那么你可以調(diào)用chdir()來設(shè)置工作目錄。例如,當(dāng)代碼需要加載特定的代碼(這些代碼能夠在系統(tǒng)的任何地方被定位時(shí)),這是很有用的。注意,chdir()沒有提供安全機(jī)制來防止打開未授權(quán)的文件。

二. 放棄特權(quán)

當(dāng)編寫Unix守護(hù)程序時(shí),一種經(jīng)典的安全預(yù)防措施是讓它們放棄所有不需要的特權(quán);否則,擁有不需要的特權(quán)容易招致不必要的麻煩。在代碼(或PHP本身)中含有漏洞的情況下,通過確保一個(gè)守護(hù)程序以最小權(quán)限用戶身份運(yùn)行,往往能夠使損失減到最小。

一種實(shí)現(xiàn)此目的的方法是,以非特權(quán)用戶身份執(zhí)行該守護(hù)程序。然而,如果程序需要在一開始就打開非特權(quán)用戶無權(quán)打開的資源(例如日志文件,數(shù)據(jù)文件,套接字,等等)的話,這通常是不夠的。

如果你以根用戶身份運(yùn)行,那么你能夠借助于posix_setuid()和posiz_setgid()函數(shù)來放棄你的特權(quán)。下面的示例把當(dāng)前運(yùn)行程序的特權(quán)改變?yōu)橛脩鬾obody所擁有的那些權(quán)限:

$pw=posix_getpwnam('nobody');posix_setuid($pw['uid']);posix_setgid($pw['gid']);

就象chroot()一樣,任何在放棄特權(quán)之前被打開的特權(quán)資源都會(huì)保持為打開,但是不能創(chuàng)建新的資源。

三. 保證排它性

你可能經(jīng)常想實(shí)現(xiàn):一個(gè)腳本在任何時(shí)刻僅運(yùn)行一個(gè)實(shí)例。為了保護(hù)腳本,這是特別重要的,因?yàn)樵诤笈_(tái)運(yùn)行容易導(dǎo)致偶然情況下調(diào)用多個(gè)實(shí)例。

保證這種排它性的標(biāo)準(zhǔn)技術(shù)是,通過使用flock()來讓腳本鎖定一個(gè)特定的文件(經(jīng)常是一個(gè)加鎖文件,并且被排它式使用)。如果鎖定失敗,該腳本應(yīng)該輸出一個(gè)錯(cuò)誤并退出。下面是一個(gè)示例:

$fp=fopen('/tmp/.lockfile','a');if(!$fp || !flock($fp, LOCK_EX | LOCK_NB)) { fputs(STDERR, 'Failed to acquire lockn'); exit; }/*成功鎖定以安全地執(zhí)行工作*/

注意,有關(guān)鎖機(jī)制的討論涉及較多內(nèi)容,在此不多加解釋。

四. 構(gòu)建監(jiān)視服務(wù)

在這一節(jié)中,我們將使用PHP來編寫一個(gè)基本的監(jiān)視引擎。因?yàn)槟悴粫?huì)事先知道怎樣改變,所以你應(yīng)該使它的實(shí)現(xiàn)既靈活又具可能性。該記錄程序應(yīng)該能夠支持任意的服務(wù)檢查(例如,HTTP和FTP服務(wù))并且能夠以任意方式(通過電子郵件,輸出到一個(gè)日志文件,等等)記錄事件。你當(dāng)然想讓它以一個(gè)守護(hù)程序方式運(yùn)行;所以,你應(yīng)該請(qǐng)求它輸出其完整的當(dāng)前狀態(tài)。

一個(gè)服務(wù)需要實(shí)現(xiàn)下列抽象類:

abstract class ServiceCheck { const FAILURE = 0; const SUCCESS = 1; protected $timeout = 30; protected $next_attempt; protected $current_status = ServiceCheck::SUCCESS; protected $previous_status = ServiceCheck::SUCCESS; protected $frequency = 30; protected $description; protected $consecutive_failures = 0; protected $status_time; protected $failure_time; protected $loggers = array(); abstract public function __construct($params); public function __call($name, $args) {if(isset($this->$name)) { return $this->$name;} } public function set_next_attempt() {$this->next_attempt = time() + $this->frequency; } public abstract function run(); public function post_run($status) {if($status !== $this->current_status) { $this->previous_status = $this->current_status;}if($status === self::FAILURE) { if( $this->current_status === self::FAILURE ) {$this->consecutive_failures++; } else {$this->failure_time = time(); }}else { $this->consecutive_failures = 0;}$this->status_time = time();$this->current_status = $status;$this->log_service_event(); }  public function log_current_status() {foreach($this->loggers as $logger) { $logger->log_current_status($this);} } private function log_service_event() {foreach($this->loggers as $logger) { $logger->log_service_event($this);} } public function register_logger(ServiceLogger $logger) {$this->loggers[] = $logger; }}

上面的__call()重載方法提供對(duì)一個(gè)ServiceCheck對(duì)象的參數(shù)的只讀存取操作:

· timeout-在引擎終止檢查之前,這一檢查能夠掛起多長(zhǎng)時(shí)間。

· next_attempt-下次嘗試連接到服務(wù)器的時(shí)間。

· current_status-服務(wù)的當(dāng)前狀態(tài):SUCCESS或FAILURE。

· previous_status-當(dāng)前狀態(tài)之前的狀態(tài)。

· frequency-每隔多長(zhǎng)時(shí)間檢查一次服務(wù)。

· description-服務(wù)描述。

· consecutive_failures-自從上次成功以來,服務(wù)檢查連續(xù)失敗的次數(shù)。

· status_time-服務(wù)被檢查的最后時(shí)間。

· failure_time-如果狀態(tài)為FAILED,則它代表發(fā)生失敗的時(shí)間。

這個(gè)類還實(shí)現(xiàn)了觀察者模式,允許ServiceLogger類型的對(duì)象注冊(cè)自身,然后當(dāng)調(diào)用log_current_status()或log_service_event()時(shí)調(diào)用它。

這里實(shí)現(xiàn)的關(guān)鍵函數(shù)是run(),它負(fù)責(zé)定義應(yīng)該怎樣執(zhí)行檢查。如果檢查成功,它應(yīng)該返回SUCCESS;否則返回FAILURE。

當(dāng)定義在run()中的服務(wù)檢查返回后,post_run()方法被調(diào)用。它負(fù)責(zé)設(shè)置對(duì)象的狀態(tài)并實(shí)現(xiàn)記入日志。

ServiceLogger接口:指定一個(gè)日志類僅需要實(shí)現(xiàn)兩個(gè)方法:log_service_event()和log_current_status(),它們分別在當(dāng)一個(gè)run()檢查返回時(shí)和當(dāng)實(shí)現(xiàn)一個(gè)普通狀態(tài)請(qǐng)求時(shí)被調(diào)用。

該接口如下所示:

interface ServiceLogger { public function log_service_event(ServiceCheck$service); public function log_current_status(ServiceCheck$service);}

最后,你需要編寫引擎本身。該想法類似于在前一節(jié)編寫簡(jiǎn)單程序時(shí)使用的思想:服務(wù)器應(yīng)該創(chuàng)建一個(gè)新的進(jìn)程來處理每一次檢查并使用一個(gè)SIGCHLD處理器來檢測(cè)當(dāng)檢查完成時(shí)的返回值。可以同時(shí)檢查的最大數(shù)目應(yīng)該是可配置的,從而可以防止對(duì)系統(tǒng)資源的過渡使用。所有的服務(wù)和日志都將在一個(gè)XML文件中定義。

下面是定義該引擎的ServiceCheckRunner類:

class ServiceCheckRunner { private $num_children; private $services = array(); private $children = array(); public function _ _construct($conf, $num_children) {$loggers = array();$this->num_children = $num_children;$conf = simplexml_load_file($conf);foreach($conf->loggers->logger as $logger) { $class = new Reflection_Class('$logger->class'); if($class->isInstantiable()) {$loggers['$logger->id'] = $class->newInstance(); } else {fputs(STDERR, '{$logger->class} cannot be instantiated.n');exit; }}foreach($conf->services->service as $service) { $class = new Reflection_Class('$service->class'); if($class->isInstantiable()) {$item = $class->newInstance($service->params);foreach($service->loggers->logger as $logger) { $item->register_logger($loggers['$logger']);}$this->services[] = $item; } else {fputs(STDERR, '{$service->class} is not instantiable.n');exit; }} } private function next_attempt_sort($a, $b){if($a->next_attempt() == $b->next_attempt()) { return 0;}return ($a->next_attempt() < $b->next_attempt())? -1 : 1; } private function next(){usort($this->services,array($this,'next_attempt_sort'));return $this->services[0]; } public function loop(){declare(ticks=1);pcntl_signal(SIGCHLD, array($this, 'sig_child'));pcntl_signal(SIGUSR1, array($this, 'sig_usr1'));while(1) { $now = time(); if(count($this->children)< $this->num_children) {$service = $this->next();if($now < $service->next_attempt()) { sleep(1); continue;}$service->set_next_attempt();if($pid = pcntl_fork()) { $this->children[$pid] = $service;} else { pcntl_alarm($service->timeout()); exit($service->run());} } }  } public function log_current_status(){foreach($this->services as $service) { $service->log_current_status();} } private function sig_child($signal){$status = ServiceCheck::FAILURE;pcntl_signal(SIGCHLD, array($this, 'sig_child'));while(($pid = pcntl_wait($status, WNOHANG)) > 0){ $service = $this->children[$pid]; unset($this->children[$pid]); if(pcntl_wifexited($status) && pcntl_wexitstatus($status) ==ServiceCheck::SUCCESS)  {$status = ServiceCheck::SUCCESS; } $service->post_run($status);} } private function sig_usr1($signal){pcntl_signal(SIGUSR1, array($this, 'sig_usr1'));$this->log_current_status(); }}

這是一個(gè)很復(fù)雜的類。其構(gòu)造器讀取并分析一個(gè)XML文件,創(chuàng)建所有的將被監(jiān)視的服務(wù),并創(chuàng)建記錄它們的日志程序。

loop()方法是該類中的主要方法。它設(shè)置請(qǐng)求的信號(hào)處理器并檢查是否能夠創(chuàng)建一個(gè)新的子進(jìn)程。現(xiàn)在,如果下一個(gè)事件(以next_attempt時(shí)間CHUO排序)運(yùn)行良好,那么一個(gè)新的進(jìn)程將被創(chuàng)建。在這個(gè)新的子進(jìn)程內(nèi),發(fā)出一個(gè)警告以防止測(cè)試持續(xù)時(shí)間超出它的時(shí)限,然后執(zhí)行由run()定義的測(cè)試。

還存在兩個(gè)信號(hào)處理器:SIGCHLD處理器sig_child(),負(fù)責(zé)收集已終止的子進(jìn)程并執(zhí)行它們的服務(wù)的post_run()方法;SIGUSR1處理器sig_usr1(),簡(jiǎn)單地調(diào)用所有已注冊(cè)的日志程序的log_current_status()方法,這可以用于得到整個(gè)系統(tǒng)的當(dāng)前狀態(tài)。

當(dāng)然,這個(gè)監(jiān)視架構(gòu)并不沒有做任何實(shí)際的事情。但是首先,你需要檢查一個(gè)服務(wù)。下列這個(gè)類檢查是否你從一個(gè)HTTP服務(wù)器取回一個(gè)'200 Server OK'響應(yīng):

class HTTP_ServiceCheck extends ServiceCheck{ public $url; public function _ _construct($params){foreach($params as $k => $v) { $k = '$k'; $this->$k = '$v';} } public function run(){if(is_resource(@fopen($this->url, 'r'))) { return ServiceCheck::SUCCESS;}else { return ServiceCheck::FAILURE;} }}

與你以前構(gòu)建的框架相比,這個(gè)服務(wù)極其簡(jiǎn)單,在此恕不多描述。

五. 示例ServiceLogger進(jìn)程

下面是一個(gè)示例ServiceLogger進(jìn)程。當(dāng)一個(gè)服務(wù)停用時(shí),它負(fù)責(zé)把一個(gè)電子郵件發(fā)送給一個(gè)待命人員:

class EmailMe_ServiceLogger implements ServiceLogger { public function log_service_event(ServiceCheck$service) {if($service->current_status ==ServiceCheck::FAILURE) { $message = 'Problem with{$service->description()}rn'; mail('oncall@example.com', 'Service Event',$message); if($service->consecutive_failures() > 5) {mail('oncall_backup@example.com', 'Service Event', $message); }} } public function log_current_status(ServiceCheck$service){return; }}

如果連續(xù)失敗五次,那么該進(jìn)程還把一個(gè)消息發(fā)送到一個(gè)備份地址。注意,它并沒有實(shí)現(xiàn)一個(gè)有意義的log_current_status()方法。

無論何時(shí)象如下這樣改變一個(gè)服務(wù)的狀態(tài),你都應(yīng)該實(shí)現(xiàn)一個(gè)寫向PHP錯(cuò)誤日志的ServiceLogger進(jìn)程:

class ErrorLog_ServiceLogger implements ServiceLogger { public function log_service_event(ServiceCheck$service) {if($service->current_status() !==$service->previous_status()) { if($service->current_status() ===ServiceCheck::FAILURE) {$status = 'DOWN'; } else {$status = 'UP'; } error_log('{$service->description()} changed status to $status');} } public function log_current_status(ServiceCheck$service) {error_log('{$service->description()}: $status'); }}

該log_current_status()方法意味著,如果進(jìn)程發(fā)送一個(gè)SIGUSR1信號(hào),它將把其完整的當(dāng)前狀態(tài)復(fù)制到你的PHP錯(cuò)誤日志中。 該引擎使用如下的一個(gè)配置文件:

<config> <loggers><logger> <id>errorlog</id> <class>ErrorLog_ServiceLogger</class></logger><logger> <id>emailme</id> <class>EmailMe_ServiceLogger</class></logger> </loggers> <services><service> <class>HTTP_ServiceCheck</class> <params><description>OmniTI HTTP Check</description><url>http://www.omniti.com</url><timeout>30</timeout><frequency>900</frequency> </params> <loggers><logger>errorlog</logger><logger>emailme</logger> </loggers></service> <service> <class>HTTP_ServiceCheck</class> <params><description>Home Page HTTP Check</description><url>http://www.schlossnagle.org/~george</url><timeout>30</timeout><frequency>3600</frequency> </params> <loggers><logger>errorlog</logger> </loggers></service></services></config>

當(dāng)傳遞這個(gè)XML文件時(shí),ServiceCheckRunner的構(gòu)造器對(duì)于每一個(gè)指定的日志實(shí)例化一個(gè)日志記錄程序。然后,它相應(yīng)于每一個(gè)指定的服務(wù)實(shí)例化一個(gè)ServiceCheck對(duì)象。

注意 該構(gòu)造器使用Reflection_Class類來實(shí)現(xiàn)該服務(wù)和日志類的內(nèi)在檢查-在你試圖實(shí)例化它們之前。盡管這是不必要的,但是它很好地演示了PHP 5中新的反射(Reflection)API的使用。除了這些類以外,反射API還提供一些類來實(shí)現(xiàn)對(duì)PHP中幾乎任何內(nèi)部實(shí)體(類,方法或函數(shù))的內(nèi)在檢查。

為了使用你構(gòu)建的引擎,你仍然需要一些包裝代碼。監(jiān)視程序應(yīng)該會(huì)禁止你試圖兩次啟動(dòng)它-你不需要對(duì)每一個(gè)事件建立兩份消息。當(dāng)然,該監(jiān)視程序還應(yīng)該接收包括下列選項(xiàng)在內(nèi)的一些選項(xiàng):

選項(xiàng) 描述 [-f] 引擎的配置文件的一個(gè)位置,默認(rèn)是monitor.xml。 [-n]; 引擎允許的子進(jìn)程池的大小,默認(rèn)是5。 [-d]; 一個(gè)停用該引擎的守護(hù)功能的標(biāo)志。在你編寫一個(gè)把信息輸出到stdout或stderr的調(diào)試ServiceLogger進(jìn)程時(shí),這是很有用的。

下面是最終的監(jiān)視程序腳本,它分析選項(xiàng),保證排它性并且運(yùn)行服務(wù)檢查:

require_once 'Service.inc';require_once 'Console/Getopt.php';$shortoptions = 'n:f:d';$default_opts = array('n' => 5, 'f' =>'monitor.xml');$args = getOptions($default_opts, $shortoptions,null);$fp = fopen('/tmp/.lockfile', 'a');if(!$fp || !flock($fp, LOCK_EX | LOCK_NB)) { fputs($stderr, 'Failed to acquire lockn'); exit;}if(!$args['d']) { if(pcntl_fork()) {exit; } posix_setsid(); if(pcntl_fork()) {exit; }}fwrite($fp, getmypid());fflush($fp);$engine = new ServiceCheckRunner($args['f'],$args['n']);$engine->loop();

注意,這個(gè)示例使用了定制的getOptions()函數(shù)。

在編寫一個(gè)適當(dāng)?shù)呐渲梦募螅憧梢园慈缦路绞絾?dòng)該腳本:

> ./monitor.php -f /etc/monitor.xml

這可以保護(hù)并繼續(xù)監(jiān)視直到機(jī)器被關(guān)掉或該腳本被殺死。

這個(gè)腳本相當(dāng)復(fù)雜,但是仍然存在一些容易改進(jìn)的地方,這些只好留給讀者作為練習(xí)之用:

· 添加一個(gè)重新分析配置文件的SIGHUP處理器以便你能夠在不啟動(dòng)服務(wù)器的情況下改變配置。

· 編寫一個(gè)能夠登錄到一個(gè)數(shù)據(jù)庫(kù)的ServiceLogger以用于存儲(chǔ)查詢數(shù)據(jù)。

· 編寫一個(gè)Web前端程序以為整個(gè)監(jiān)視系統(tǒng)提供一種良好的GUI。

標(biāo)簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲调教视频在线观看| 在线天堂资源www在线污| 福利欧美精品在线| 亚洲91视频| 日韩精品欧美成人高清一区二区| 国产毛片久久久| 樱桃视频成人在线观看| 在线精品小视频| 国产精品欧美在线观看| 999国产精品| 国产免费av国片精品草莓男男| 奇米狠狠一区二区三区| 欧美黄色网页| 日韩不卡免费视频| 亚洲福利久久| 日韩成人精品一区二区三区| 国产麻豆久久| 91精品91| 日韩在线看片| 国产精品成人国产| 午夜久久影院| 国产精品xx| 亚洲+小说+欧美+激情+另类| av资源亚洲| 国产精品欧美在线观看| 亚洲一二av| 电影91久久久| 欧美日韩一区自拍| 99国产精品视频免费观看一公开 | 亚洲三级网站| 中文字幕在线免费观看视频| 国产日韩欧美中文在线| 日韩精品一级二级| 欧美日中文字幕| 日韩中文字幕无砖| 人人香蕉久久| 亚洲精品观看| 激情六月综合| 精品国产欧美日韩| 欧美日一区二区在线观看| 久久久久久久久丰满| 国产精品亚洲成在人线| 老牛影视精品| 欧美一级一区| 欧美天堂亚洲电影院在线观看| 国产欧美69| 亚洲欧美网站| 久久美女性网| 久久只有精品| 快she精品国产999| 蜜桃视频在线网站| 欧美激情五月| 亚洲精品系列| 欧美在线亚洲综合一区| 麻豆国产欧美日韩综合精品二区| 蜜桃视频免费观看一区| 欧美日韩在线网站| 麻豆久久久久久| 亚洲精品国模| 午夜电影亚洲| 在线精品亚洲欧美日韩国产| 国产精品久久久久久久免费软件| 久久精品亚洲人成影院| 国产欧美一区二区色老头| 精品欠久久久中文字幕加勒比| 国产亚洲在线观看| 成人在线黄色| 国产精品手机在线播放| 中文字幕亚洲在线观看| 欧美网站在线| 欧美日韩亚洲在线观看| av在线最新| 久久久久亚洲精品中文字幕| 激情综合自拍| 女生影院久久| 国产欧美三级| 亚洲精品激情| 亚洲少妇在线| 激情综合自拍| 精品欧美视频| 国产精品久久久久久久久免费高清 | 精品久久亚洲| 日韩精品国产欧美| 亚洲香蕉久久| 免费成人性网站| 中文字幕亚洲精品乱码| 国产亚洲毛片| 亚洲自拍另类| 国产精品嫩草99av在线| a日韩av网址| 桃色av一区二区| 97国产成人高清在线观看| 国产精品chinese| 国产精品亚洲片在线播放| 久久国产婷婷国产香蕉| 日本不卡中文字幕| 日韩精品免费视频人成| 日韩精品视频在线看| 日韩美女国产精品| 日韩精品国产精品| 四虎成人精品一区二区免费网站 | 久久高清一区| 日本欧洲一区二区| 综合五月婷婷| 国产精品尤物| 国产一区丝袜| 久久久一本精品| 狠狠操综合网| 视频精品一区| 久久免费影院| 久久一区二区中文字幕| 亚洲在线观看| 国产午夜久久av| 久久久久久夜| 99热国内精品| 亚洲在线久久| 91成人在线网站| 精品久久视频| 日韩欧美一区免费| 亚洲成人精品| 中文一区一区三区免费在线观| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美中文字幕| 国产精品自拍区| 国产精品成人a在线观看| 亚洲啊v在线| 精品日本视频| 91精品蜜臀一区二区三区在线| 国产高清一区二区| 一区二区三区国产在线| 男人的天堂久久精品| 国产精品手机在线播放| 高清一区二区| 精品国产一级| 日韩欧美精品| 亚洲精品福利| 精品99久久| 夜夜嗨av一区二区三区网站四季av| 日本欧美韩国一区三区| 精品国产网站| 中文字幕乱码亚洲无线精品一区| 狂野欧美性猛交xxxx| 一区福利视频| 精品国产aⅴ| 三级亚洲高清视频| 国产高清不卡| 亚洲精品综合| 99久久久久久中文字幕一区| 亚洲免费专区| 久久精品电影| 国产精品成人自拍| 999精品在线| 欧美国产不卡| 亚洲精品伊人| 欧美女激情福利| 色婷婷色综合| 国产午夜久久av| 免费久久99精品国产| 一区二区精品伦理...| 日本中文字幕一区二区| 中文字幕在线免费观看视频| 日韩三区四区| 水蜜桃久久夜色精品一区| 91精品一区国产高清在线gif | 麻豆一区二区三区| 亚洲经典在线| 国产日韩一区二区三区在线 | 亚洲一区二区三区在线免费| 日韩免费一区| 日韩av中文在线观看| 99精品视频在线观看免费播放| 国产精品亚洲综合色区韩国 | 99热国内精品| 国产成人a视频高清在线观看| 欧美一区成人| 模特精品在线| 黄色亚洲免费| 久久精品中文| 久久一区国产| 亚洲三级av| 亚洲美洲欧洲综合国产一区| 国产一区二区久久久久| 国产亚洲一区| 日韩美女国产精品| 在线亚洲成人| 国产精品99一区二区三区| 7777精品| 久久午夜精品一区二区| 成人日韩在线观看| 精品丝袜在线| 日韩天堂在线| 精品国内亚洲2022精品成人| 欧美一级一区| 婷婷五月色综合香五月| 美日韩精品视频| 亚洲男女自偷自拍| 伊人成人网在线看| 影院欧美亚洲| 亚洲一级在线| 巨乳诱惑日韩免费av|