Skip to content

Zeroplex 生活隨筆

軟體開發、伺服器和生活瑣事

小 縮小字型大小。 中 重設字型大小。 大 放大字型大小。

標籤: Nginx

Nginx 將 deny all 換成 return 404

Posted on 2021 年 5 月 9 日2021 年 5 月 9 日 By 日落 在〈Nginx 將 deny all 換成 return 404〉中尚無留言

以往不想要讓人索引、讀取的目錄和檔案都會設定成 deny all:

在新分頁中預覽

location ~ /\.git {
    deny all;
}

這樣設定的話,開啟該目錄就會收到 HTTP 403 Forbidden。這個訊息有二個含意:主機上面的確有這份資料、你沒有權限打開。

也就是,檔案在 URL 的連結已經確定了,只要繞過權限管理即可讀取檔案。

與其這樣,不如直接讓主機回傳 HTTP 404,這樣便無法知道檔案是否存在:

location ~ /\.git {
    return 404;
}
Tags:Nginx, 資訊安全

PHP 在 background 處理資料的另一種方法

Posted on 2021 年 3 月 24 日2021 年 3 月 24 日 By 日落 在〈PHP 在 background 處理資料的另一種方法〉中尚無留言

一般用 PHP 實作 background task,大多都是先將 task 處理後再處理 user request。
所以程式大概是長這樣:

<?php

class Contrller
{
    public function handle()
    {
        if (Background::hasTask()) {
            Background::run();
        }

        $data = List::whereIn('id', [1, 4, 6])->get();
        view($data);
}

這樣做會有一些缺點,若背景程式跑了很久才結束,會讓使用者有一種「點了按鍵卻感覺沒有回應」的錯覺。

若有時候真的累積不少 background task 需要處理時,為了不讓使用者等太久,通常會 trigger 一些專為 background task 設定的程式去執行,像是一群的 consumer,或者會 trigger gearman 去處理。

而我再某一次很罕見的狀況下必須馬上讓使用者先收到 reponse 之後才去處理 background task。問題來了:通常都要 PHP return / exit 以後,response 才會傳回 client,那有什麼辦法先給已經處理好的 response,讓 client 繼續瀏覽以後再來跑 background task?

沒想到還真的讓我找到解法:fastcgi_finish_request()。

fastcgi_finish_request()這個函式會先通知 fastcgi 的上層 (我這邊是 Nginx reverse proxy) 要給 client 的資料都送出去囉,可以 ending 啦。然後 PHP 偷偷摸摸繼續在後面弄東西。
程式上寫起來會有點不一樣:

<?php

class Contrller
{
    public function handle()
    {
        $data = List::whereIn('id', [1, 4, 6])->get();
        view($data);
        fastcgi_finish_request();  // 這之後不管發生什麼事,client 都不會再收到訊息

        Background::run()
}

不過要注意,因為不管如何,client 都不再收到訊息,因此若有錯誤發生是很難 debug 的。
用 catch 也好,用 logger 也好,甚至你要請到 register_shutdown_function() 出場也都好,如果不這樣做,基本上沒什麼 debug 手段。

而我使用 fastcgi_finish_request() 也只有在 Nginx + php-fpm 時成功,我不曉得會做其他形式的 web server 架構是否可以使用。如果網友嘗試過,不如回覆讓其他人知道一下。

總之不得已才使用這個方法。

Tags:hack, Nginx, PHP

WordPress 上的 Nginx Gzip 參考範例

Posted on 2021 年 3 月 15 日2021 年 3 月 15 日 By 日落 在〈WordPress 上的 Nginx Gzip 參考範例〉中尚無留言

在 HTTP server 上設定 Gzip 壓縮,可以將文字類型 (HTML, *.js, *.css) 的檔案大小減少約 90%,可以加速檔案的傳輸,在頻寬較小的環境下會特別明顯。

WordPress 的外掛,提供了一些建議使用 Gzip 壓縮的檔案類型,可參考:

More “WordPress 上的 Nginx Gzip 參考範例” »

Tags:Nginx, WordPress

Nginx 上傳大檔案需要調整的參數

Posted on 2021 年 3 月 2 日2021 年 3 月 12 日 By 日落 在〈Nginx 上傳大檔案需要調整的參數〉中尚無留言

 Nginx 上傳大型檔案,在網路上查到的,基本上就是修改「client_max_body_size」:

client_max_body_size 100m; # 限制上傳大小為 100MB

也可以改成無限制:

client_max_body_size 0;

但要注意的是,若 Nginx 在主機上是當作 reverse proxy 使用時,Nginx 收到檔案預設是先暫存在自己的主機上面,等到資料接收完畢後再一起丟到 server。

當檔案丟到 server 時,超過預設的「client_body_timeout」的  60 秒,就會視為失敗。因此遇到抄道行檔案,使 Nginx 將資料傳至 server 時間比預期的還要長 (不是 local network 等) 時,記得要將「client_body_timeout」延長:

client_body_timeout 300s
Tags:Nginx, PHP

用 Nginx 設定擋掉特定的 user agent

Posted on 2020 年 6 月 21 日2021 年 6 月 25 日 By 日落 在〈用 Nginx 設定擋掉特定的 user agent〉中尚無留言

有些 bot 很討厭,掃描速度快,而且感覺在猜測網站內容,打出很多 HTTP 404:

$ grep bot access.log | awk '{print $NF}' |sort | uniq -c | sort -n | tail
    298 +http://napoveda.seznam.cz/en/seznambot-intro/)"
    525 +http://www.brandwatch.net)"
    599 +http://yandex.com/bots)"
   1005 bot@linguee.com)"
   1233 Safari/537.36"
   1421 +http://www.bing.com/bingbot.htm)"
   5335 +https://seostar.co/robot/)"
  48104 +http://www.semrush.com/bot.html)"
  81520 +http://www.google.com/bot.html)"
  93660 +http://ahrefs.com/robot/)"

參考了別人 $http_user_agent 的處理方法:

if ($http_user_agent ~* (AhrefsBot|SemrushBot)) {
    return 444;
}

另外要注意的是:

  • ~*:這個不分大小寫 (case insensitive)
  • ~:這個會區分大小寫

ps. 一般來說可以參考 HTTP status code 給 HTTP 403、444 等狀態碼,我是不爽所以給 HTTP 418

Tags:Nginx

文章分頁

上一頁 1 2 3 4 下一頁

其他

關於我  (About me)

小額贊助

  文章 RSS Feed

  留言 RSS Feed

Apache AWS Bash C/C++ Docker FreeBSD GCP Git Google Java JavaScript Laravel Linux Microsoft MSSQL MySQL Nginx PHP PHPUnit PostgreSQL Python Qt Ubuntu Unix Vim Web Windows WordPress XD 作業系統 分享 好站推薦 專題 攝影 新奇搞笑 新聞 旅遊 生活雜記 程式設計 網路架站 網頁設計 資訊學習 資訊安全 遊戲 音樂


創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權.