Nginx 限制請求速率 (ngx_http_limit_req_module)
說明本篇文章介紹 Nginx 的限制請求速率模組 ngx_http_limit_req_module,說明可用指令和基本範例。限制請求速率通常用來防止 DDOS 或是暴力破解密碼等惡意攻擊,該模組有以下指令: limit_req_zone limit_req limit_req_dry_run limit_req_log_level limit_req_status 指令limit_req_zone 標題 內容 語法 limit_req_zone key zone=name:size rate=rate [sync]; 預設值 - Context http 這個指令是定義規則,相關的參數如下 key:可以視為符合的條件,例如照 IP、Server Name 或國家等等不同條件,參考最後的範例。 name:唯一名稱。 size:配置多少記憶體。 rate:限制的速率,可以是每秒或是每分多少次。 sync:是商業版的功能,暫時先不討論。 簡單的例子 1limit_req_zone $binary_remote_addr zone=perip ...
Nginx 限制連線數 (ngx_http_limit_conn_module)
說明本篇文章介紹 Nginx 的限制連線數模組 ngx_http_limit_conn_module,說明可用指令和基本範例。限制連線數通常用來防止 DDOS 等惡意攻擊,該模組有以下指令: limit_conn_zone limit_conn limit_conn_dry_run limit_conn_log_level limit_conn_status 指令limit_conn_zone 標題 內容 語法 limit_conn_zone key zone=name:size; 預設值 - Context http 這個指令是定義規則,相關的參數如下 key:可以視為符合的條件,例如照 IP、Server Name 或國家等等不同條件,參考最後的範例。 name:唯一名稱。 size:配置多少記憶體。 簡單的例子 1limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn 標題 內容 語法 limit_conn zone number; 預設值 - Con ...
Rails + Passenger 解決 Request queue full (configured max. size: 100)
問題透過 Passenger 的相關 HTTP Request 回應 503,出現下面錯誤訊息 1Request queue full (configured max. size: 100) 原因Passenger 使用多個程序 (Process) 來處理 HTTP 請求,預設為 6 個。當大量 Request 進來時,處理不及的會先放在 Queue 等待處理,預設 100 個,當超過 Queue 的上限時會出現這錯誤。 處理請求速度不夠,來不及消化是出現錯誤的原因,然而處理速度不夠的原因就有很多可能,而對應的解決方式也都不同。這邊列出幾個我想得到的原因: 設定問題 程式效能問題 大量 HTTP 請求 程式存在 Bug 底層框架或套件有 Bug 網路上可能會看到有人說去修改 passenger_max_request_queue_size 的設定,來增加 Queue 的大小,但這沒有根本解決問題,還是要找出原因來對做應處理。 設定問題說明比較常見的是 Passenger 使用 ActionCable 時設定沒有正確。ActionCable 使用 Socket 持續連線,所以會常時 ...
Rails ActionCable 效能測試
本篇文章說明連線數上限相關設定,以及實測 ActionCable 預設模式、Standalone 模式和 AnyCable 三種方案的效能比較。 準備首先建立一個 Rails 專案來測試 ActionCable 連線效能,先寫一個簡單的 Channel 12345class MessageChannel < ApplicationCable::Channel def subscribed stream_for 'message_channel' endend 在 config/environments/development.rb 加上 1config.action_cable.disable_request_forgery_protection = true 然後寫一個 Node Client 程式來測試,使用套件 @anycable/web 和 ws 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849imp ...
在陣列中找出第 K 大的數字
題目在陣列中找出第 K 大的數字。Find Kth largest number in an array. 說明找第 K 大的數字,我們可以直覺的用排序後就可以找出來,時間複雜度取決於排序演算法,例如使用快速排序法為 O(n log n)。 另外一個方法是延續前一個題目的想法,找第 K 大就用 K 個變數去保存?不過由於 K 也是個變數,所以我們需利用動態的資料結構來保存,這個 Case 使用 Linked List 是最合適。時間複雜度則為 O(n K),而當 K 很小的時候可以接近 O(n)的效能,反之,K 很大的時候,可能會比直接用快速排序法還慢。 解法123456789101112131415static int Find(int[] array, int k){ List list = new List(); for (int i = 0; i < array.Length; ++i) { int n = array[i]; int j = 0; for (int length = Math ...
計算 1 * 2 + 2 * 3 +...+ (N - 1) * N 總和
題目計算 1 * 2 + 2 * 3 +…+ (n-1) * n 總和。Write a function to calculate 1 * 2 + 2 * 3 + … + (N - 1) * N. 說明題目為計算 1 * 2 + 2 * 3 +…+ (n-1) * n 的總和,一樣是求合的問題,同樣使用迴圈或遞迴即可,如果能用數學證明出公式的話,也可以直接套公式。 迴圈解1234567int sum(int n){ int sum = 0; for (int i = 2; i <= n; ++i) sum += (i - 1) * i; return sum;} 遞迴解123456int sum(int n){ if (n < 2) return 0; return (n - 1) * n + sum(n - 1);} 數學解網路上沒有找到比較好的推導,主要概念是將數列拆解為下面兩個數列 然後這兩個數列可以找到公式 最後將兩個式子相減 寫成程式碼 1234int sum ...
PageSpeed - 減少無用的 CSS
說明使用 PageSpeed 或 Lighthouse 測試網頁的時候,很容易遇到這個錯誤,原因也如字面上一樣的淺顯易懂,就是 CSS 過大。可參考官方提供的如何減少無用的 CSS 建議作法。 解決方法我整理了以下幾種解決方法 壓縮 CSS 減少無用的 CSS 拆分檔案 壓縮 CSS由於有另一個檢測項目就是壓縮 CSS,所以文件沒有寫到,這邊就大概提一下。現在很多框架和工具都可以壓縮 CSS,所以也算是有效又簡單解決方案之一,就不做過多說明。 減少無用的 CSS如同字面上和官方文件所說,找出並刪除無用的 CSS。然而實務上常常會直接使用 CSS 框架,例如 Bootstrap,很容易就無法通過這項檢測。在允許的情況下,我們可以嘗試只引用需要的部分,例如原本在 SCSS 中引用 Bootstrap 可能是這樣寫: 1@import "bootstrap"; 改為依據實際情況引用需要部分 12345678910111213141516171819202122232425262728293031323334353637@import "bootstrap/f ...
非同步載入 CSS
本篇文章說明無樣式內容閃爍 FOUC(Flash of unstyled content)、渲染阻塞 (render-blocking) 的問題,以及如何非同步載入 CSS。 無樣式內容閃爍英文為 FOUC(Flash of unstyled content),這是 HTML 載入後就先顯示出來,之後 CSS 才載入進來,會看到沒有套用樣式的 HTML 畫面。而載入 CSS 可能沒有很久,看起來就像閃了一下。除了這個情況之外,現在有很多網頁也有透過 JavaScript 來載入畫面,也會有類似的問題發生。 例如一個使用 Bootstrap 的頁面放入一個按鈕 1<a class="btn btn-primary" href="https://www.google.com/">Google</a> 如果發生了 FOUC 會有一瞬間看到 當樣式載入後才會看到正確的結果 渲染阻塞為了避免上面的情況,瀏覽器使用渲染阻塞 (render-blocking) 來處理,會將一些渲染阻塞資源載入後才開始渲染畫面,而 CSS 是渲染阻塞資 ...
GCP Cloud Monitoring 減少流量和費用
Cloud Monitoring 可以用來監控系統狀態,並透過它來寄出警示通知。主要用來監控硬碟容量和一些自訂狀態,於是在所有機器裝上了 Ops Agent 來監控硬碟狀態。但後來發現帳單的費用驚人,於是研究了一下他的費用和如何降低成本。 費用首先了解一下 Cloud Monitoring 定價,平常用到的只有第一個項目 Monitoring 資料,這部分前 150 MiB 是免費額度,如果能夠壓低在這之下就可以免費使用。本篇文章也是針對這項目說明。 帳單點開帳單可以找到名為 Metric Volume 的項目,這就是 Cloud Monitoring 資料的費用。 可以看到月份的前幾天沒有這項目,大概在 5 號的時候才出現,這是因為前幾天是 150 MiB 的免費額度。可以看到後面每天都花費 $4.3 左右。這是八台主機的情況。 也可以看到多少流量被計算費用 流量從監控的[設定]頁簽中,在 GCP Projects 之下,展開專案名稱,可以看到流量報告。 在 Agent Metrics 最右邊點擊[在 Metrics Exploer 中查看],可以查詢每個時間的流量狀況。 不過這裡無 ...
GCP Cloud Storage 無法下載或複製
問題使用 GCP Cloud Storage 的網頁時,想把物件複製到別的地方,結果出現錯誤無法複製您的物件。 存取遭拒 直接點下載則是出現 12ForbiddenError 403 點擊物件進查看則出現:您必須具備其他權限,才能查看這個物件的中繼資料;請要求物件擁有者授予您「storage.objects.get」權限 (例如為您的帳戶授予身分與存取權管理 (IAM) 儲存空間管理員角色)。 使用指令複製 1gsutil cp gs://backup/20230529.gz gs://archives/20230529.gz 出現錯誤 12Copying gs://backup/20230529.gz [Content-Type=application/octet-stream]...AccessDeniedException: 403 [email protected] does not have storage.objects.get access to the Google Cloud Storage object. Permission 'storage.objec ...