• How to Exclude a Word with grep

    grep命令在用於在文本數據中搜索定義的字符串,字符,單詞或正則表達式匹配的行和代碼片段時非常有用。 儘管grep的大多數用途是對語法匹配的數據進行排序,但是如果我們想用grep排除單詞或字符串怎麼辦? 用grep排除與在grep中查找匹配項是類似的,今天讓我們看看如何使用grep排除字符串匹配和單詞。

    grep是與操作系統無關的實用程序,因此您可以在Mac OS,Linux,Unix或任何其他使用grep的系統中使用排除。

    如何使用grep排除單個單詞

    排除具有字符串或語法匹配行數據最簡單方法是使用grep和-v。

    例如,假設我們使用cat在命令行中輸出文件,但是我們想排除所有包含“google”的行,那麼語法將如下所示:

    cat webserver.log | grep -v “google”

    輸出將是webserver.log文本中不包括與”google”匹配字符串的數據。

    也可以直接在文件上使用grep,並根據單詞或語法排除匹配,如下所示:

    grep -v “google” webserver.log

    如何使用grep排除多個字符串或單詞

    既然我們知道如何排除單個單詞,下一個明顯的問題是使用grep排除多個單詞。 這同樣簡單,並且有幾種不同的方法可以使用-v標誌和-e標誌來完成此操作。

    首先,以上述示例為例,在透過管道傳輸到grep的文件中使用cat,並排除與兩個單詞匹配的任何數據:“google”和“baidu”,如下所示:

    cat webserver.log | grep -v -e “google” -e “baidu”

    包含“ google”或“ baidu”的每一行將從打印結果中排除。

    您還可以像以前一樣直接在文件上使用grep

    grep -v -e “google” -e “baidu” webserver.log

    另一種方法是通過使用管道來分隔每個匹配項來用grep分隔要排除的內容,如下所示:

    grep -Ev “google|baidu” webserver.log

    如果在示例文本文件上測試了這些選項中的任何一個,無論採用哪種方法,輸出都是相同的,每個選項都會輸出排除了包含目標短語,語法,單詞或文本匹配項的數據。

  • How to install PHP 7.4 on FreeBSD 12

    一直以來我都使用源代碼編譯的方式安裝php,一方面是因為Centos上yum的php版本比較舊,源代碼編譯比較適用於各種類unix平台,另外一方面是因為有時候需要加入第三方的模塊,比如pagespeed的時候,就必須從源代碼進行編譯,但是,FreeBSD一直都不支持pagespeed,所以,其實使用pkg自帶的版本就足夠好用了。

    安裝的命令很簡單:

    pkg install php74 php74-zlib php74-exif php74-gd php74-mbstring php74-xml php74-pdo_mysql php74-mysqli php74-curl php74-opcache php74-intl php74-sockets php74-zip php74-openssl php74-bz2 php74-pecl-redis php74-session php74-json php74-dom php74-fileinfo php74-simplexml php74-simplexml php74-pdo_sqlite php74-iconv php74-pecl-imagick-im7 php74-filter

    如果有需要其他的模塊,繼續在後面添加就可以。

    我一般會對/usr/local/etc/php.ini做如下一些修改:

    post_max_size = 22M

    upload_max_filesize = 20M

    date.timezone = Asia/Taipei

    opcache.memory_consumption=32
    opcache.blacklist_filename=/root/sh/opcachebl.txt

    當你不想為所有的php script啟用opcache的時候,你可以把那些目錄加入黑名單,這樣你可以節省很多內存。

    有一些pkg中沒有的so,phpize安裝後,需要在/usr/local/etc/php 目錄中新建一個extension.ini,並添加例如
    extension=imagick.so

    如果服務器內存足夠大,那麼我們可以使用redis作為session handler,將php的session放入內存,比直接扔在磁碟上的效率要高不少,針對php.ini需要修改兩處:

    session.save_handler = files 修改為
    session.save_handler = redis

    同時,session.save_path = “/tmp”
    修改為session.save_path = “tcp://127.0.0.1:6379?auth=ifyouhaveapassword”

    如果redis-server沒有設置密碼,那麼後面就不需要添加。

    好吧,其實是因為使用源代碼編譯intl模塊在FreeBSD上怎麼都過不去,看起來似乎是一個bug,而且是幾年前的bug,粗略的尋找了一下,沒有找到答案,也許以後可以解決這個問題。

  • Blocking aggressive crawlers/scrapers/bots

    有很多人喜歡用Blocking UA的方法,但很幸運的是,如果你使用了CF的CDN服務,那麼Cloudflare為我們提供了防火牆功能。

    當你把你的網站放在CF的CDN後面,有許多增強的安全設置可以為我們所使用,其中一個就是根據UA來進行處置,Block或者Challenge,使用Challenge選項時,會首先到達一個驗證碼頁面,這個頁面,在大陸由百度雲加速提供,除大陸地區,由CF自己提供,這個Challenge頁面非常類似於常用的抗DOS設備的跳轉頁面,需要輸入驗證碼,或是使用js檢測瀏覽器完整性後,才會將用戶側瀏覽器傳遞到目的url。

    但是,很多時候,一些非正式的bot,使用了各種千奇百怪的UA,比如華為和阿里巴巴,你們又沒有搜索引擎,抓來抓去抓什麼呢?這種時候,我覺得UA非常煩擾,於是我通常會將16位的B類地址段直接設置為需要Challenge,通常來講,既然它是bot,它就不可能完成Challenge。當然,還有一些俄羅斯和法國的惡意bots,通常也會加到Challenge的範圍,由於俄羅斯的實在是太多,乾脆就直接把Russia加進去。

    通過以上的一些設置,整個服務器的負荷就小了很多,訪問量變成高峰期的三分之二左右。