記使用 Laravel-s 抵禦百度爬蟲的經歷

php_yt發表於2020-08-16

什麼是 Laravel-s

LaravelS是一個膠水專案,用於快速整合Swoole到Laravel或Lumen,賦予它們更好的效能
github地址

為什麼用 Laravel-s

百度小程式上線後,百度爬蟲過高的 qps(併發) 導致 cpu 滿載,伺服器當機,伺服器配置4核8G記憶體5M寬頻。這時候怎麼辦?

  1. 調整 php-fpm 引數,設定為靜態,靜態模式對比動態模式效能更高。比如設定子程式數量255甚至更高,越高承受的併發量越大,但越高佔用記憶體越大。結論,一定程度上有效果,但高併發下無用。
  2. 反饋百度調整爬蟲抓取頻率。結論,等吧,黃花菜都涼了,但還是反饋下比較好。
  3. 負載均衡。讓其他伺服器分擔壓力,前提是有足夠的伺服器,且都要部署相同的程式碼,且不能影響其他伺服器本來職責的業務。或者在某雲臨時申請N臺伺服器,但你不知道爬蟲什麼時間來,什麼時間去,不現實。
  4. 接下來就是文章的主題,用 Laravel-s 加速 http 響應。

Laravel-s 究竟起到多少加速效果

由於當時沒有統計所有時段 qps 具體值,所以沒辦法得出準確的結論,只能根據調整前後的機器負載做對比。

部署前,cpu滿載,機器當機N次,癱瘓狀態。外網出寬頻佔滿(5M),部署後cpu立即降到20+, 臨時升級寬頻15M後,cpu達到 60%,外網寬頻仍被佔滿(只能說百度爬蟲是真作啊,多少寬頻你就來多少啊)。結論,至少帶來5倍的效能提升。

具體部署

爬蟲所爬取的頁面只是一部分,所以並不是將線上專案改造成laravel-s,也不現實。我們只需要將爬取的頁面分離出來,單獨部署到laravel-s

  1. 新建空專案,業務邏輯只處理抓取的頁面api,專案埠號如 6501
  2. 部署 laravel-s ,測試api 及 ab壓測
  3. 線上專案將爬蟲爬取的頁面路徑代理到新建專案,如127.0.0.1:6501
    location ~ ^/v1/test.* {
     proxy_pass http://127.0.0.1:6501;
     proxy_set_header Host $host;
    }

注意的幾點:

  1. conf/laravels.php 中,預設開啟 worker 數量是 cpu 核數的兩倍。
  2. laravles 是執行在 swoole ,在記憶體中,每次更改程式碼,需重啟 laravel-s
  3. 由於第2條的原因,資料庫連線得不到釋放,需開啟 laravel 的斷開重連(>laravle5.1)。在 conf/database.phpmysql配置中新增
    'options'   => [
     // 開啟持久連線
     \PDO::ATTR_PERSISTENT => true,
    ],
本作品採用《CC 協議》,轉載必須註明作者和本文連結

focus

相關文章