{"id":5609,"date":"2025-11-11T17:00:52","date_gmt":"2025-11-11T13:30:52","guid":{"rendered":"https:\/\/parmin.cloud\/blog\/?p=5609"},"modified":"2025-11-17T15:53:04","modified_gmt":"2025-11-17T12:23:04","slug":"%da%86%da%af%d9%88%d9%86%d9%87-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-nginx-%d8%af%d8%b1-%d8%b3%db%8c%d8%b3%d8%aa%d9%85%d8%b9%d8%a7%d9%85%d9%84-ubuntu-20-04","status":"publish","type":"post","link":"https:\/\/parmin.cloud\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-%d8%a8%d8%a7-%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-nginx-%d8%af%d8%b1-%d8%b3%db%8c%d8%b3%d8%aa%d9%85%d8%b9%d8%a7%d9%85%d9%84-ubuntu-20-04\/","title":{"rendered":"\u0686\u06af\u0648\u0646\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Nginx \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645\u200c\u0639\u0627\u0645\u0644 Ubuntu 20.04 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u06cc Node.js \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0646\u0631\u062e (Rate Limit) \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u0645\u061f"},"content":{"rendered":"<h2>\u0645\u0642\u062f\u0645\u0647<\/h2>\n<p>\u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0646\u0631\u062e (rate limiters) \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637\u200c\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0636\u0631\u0648\u0631\u06cc \u0647\u0633\u062a\u0646\u062f \u0686\u0648\u0646 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u062d\u0645\u0644\u0627\u062a brute-force \u0645\u062e\u0631\u0628 \u0628\u0647 \u0645\u0646\u0627\u0628\u0639 \u062d\u0633\u0627\u0633 \u067e\u0634\u062a \u0641\u0631\u0645\u200c\u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0648\u0628 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0622\u0646\u200c\u0647\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a \u062a\u0648\u0632\u06cc\u0639\u200c\u0634\u062f\u0647\u0654 \u0627\u0646\u06a9\u0627\u0631 \u0633\u0631\u0648\u06cc\u0633 (DDoS) \u0646\u0642\u0634 \u0641\u0639\u0627\u0644\u06cc \u062f\u0627\u0631\u0646\u062f. \u0648\u0628\u200c\u0633\u0631\u0648\u0631\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f Nginx \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0628\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u0646\u0631\u062e \u062f\u0627\u0631\u0646\u062f \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u0627 \u0645\u0635\u0631\u0641 \u0645\u0646\u0627\u0628\u0639 \u06a9\u0645\u062a\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c Nginx \u0631\u0627 \u0637\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u06a9\u0631\u062f \u06a9\u0647 \u0645\u06cc\u0632\u0627\u0646 \u062a\u0631\u0627\u0641\u06cc\u06a9\u06cc \u0631\u0627 \u06a9\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647\u0654 \u0633\u0627\u062f\u0647\u0654 Node.js \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u062f\u0631\u06cc\u0627\u0641\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u0645\u062d\u062f\u0648\u062f \u06a9\u0646\u062f. \u0634\u0645\u0627 Nginx \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0639\u0631\u06cc\u0641 \u062d\u062f\u0627\u06a9\u062b\u0631 \u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0627\u0632\u0647\u0654 \u0632\u0645\u0627\u0646\u06cc \u0645\u0634\u062e\u0635 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f\u060c \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u062d\u062f \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f \u0648 \u0635\u0641\u062d\u0647\u0654 \u062e\u0637\u0627\u06cc 429 \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u062f.<\/p>\n<h2>\u067e\u06cc\u0634\u200c\u0646\u06cc\u0627\u0632\u0647\u0627<\/h2>\n<p>\u0628\u0631\u0627\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u062f \u0628\u0647:<\/p>\n<ul>\n<li>\u06cc\u06a9 \u0633\u0631\u0648\u0631 Ubuntu 20.04 \u06a9\u0647 Node.js \u0631\u0648\u06cc \u0622\u0646 \u0646\u0635\u0628 \u0634\u062f\u0647 \u0648 \u062f\u0627\u0631\u0627\u06cc 1 CPU \u0648 1GB \u0631\u0645 \u0627\u0633\u062a\u060c \u0628\u0627 \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u063a\u06cc\u0631 \u0631\u06cc\u0634\u0647 \u06a9\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc sudo \u062f\u0627\u0631\u062f \u0648 \u0641\u0627\u06cc\u0631\u0648\u0627\u0644 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a. \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc Nginx \u0628\u0647 \u062f\u0627\u0634\u062a\u0646 CPU \u0628\u06cc\u0634\u062a\u0631 \u0646\u0633\u0628\u062a \u0628\u0647 RAM \u062d\u0633\u0627\u0633\u200c\u062a\u0631\u0646\u062f.<\/li>\n<li>\u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Node.js \u0628\u0627 \u0645\u062f\u06cc\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 PM2 \u06a9\u0647 \u0631\u0648\u06cc \u0633\u0631\u0648\u0631 \u0634\u0645\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f.<\/li>\n<li>Nginx \u0646\u0635\u0628\u200c\u0634\u062f\u0647 \u0647\u0645\u0631\u0627\u0647 \u0628\u0627 \u06af\u0648\u0627\u0647\u06cc\u200c\u0647\u0627\u06cc SSL.<\/li>\n<li>\u06cc\u06a9 \u062f\u0627\u0645\u0646\u0647\u0654 \u062b\u0628\u062a\u200c\u0634\u062f\u0647. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062e\u062f\u0645\u0627\u062a\u06cc \u0645\u062b\u0644 Freenom \u062f\u0627\u0645\u0646\u0647\u0654 \u0631\u0627\u06cc\u06af\u0627\u0646 \u0628\u06af\u06cc\u0631\u06cc\u062f \u06cc\u0627 \u0627\u0632 \u062f\u0627\u0645\u0646\u0647\u0654 \u0645\u0648\u062c\u0648\u062f \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u06cc\u06a9 \u0631\u06a9\u0648\u0631\u062f DNS \u0627\u0632 \u0646\u0648\u0639 A \u06a9\u0647 \u0646\u0627\u0645 \u062f\u0627\u0645\u0646\u0647\u0654 \u0634\u0645\u0627 \u0631\u0627 \u0628\u0647 \u0622\u062f\u0631\u0633 IPv4 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0634\u0645\u0627 \u06a9\u0647 \u067e\u0634\u062a Nginx \u0642\u0631\u0627\u0631 \u062f\u0627\u0631\u062f \u0627\u0634\u0627\u0631\u0647 \u06a9\u0646\u062f.<\/li>\n<li>\u0622\u0634\u0646\u0627\u06cc\u06cc \u067e\u0627\u06cc\u0647\u200c\u0627\u06cc \u0628\u0627 HTML \u0648 CSS \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0648 \u0635\u0641\u062d\u0627\u062a \u062e\u0637\u0627 \u0645\u0641\u06cc\u062f \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/li>\n<\/ul>\n<h2>\u0646\u0645\u0627\u06cc \u06a9\u0644\u06cc<\/h2>\n<p>\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0646\u0631\u062e \u062c\u0644\u0648\u06cc API \u06cc\u0627 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u0632 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Node.js \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u06cc\u06a9 \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0633\u0627\u062f\u0647 \u0631\u0627 \u067e\u0634\u062a \u06cc\u06a9 \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647\u0654 \u0646\u0631\u062e \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<h2>\u06af\u0627\u0645 \u0627\u0648\u0644 \u2014 \u0622\u0645\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 Node.js<\/h2>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f\u060c \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f (\u0628\u0627 \u0627\u0633\u062a\u0627\u06cc\u0644 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc) \u0648 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u062f. \u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u067e\u0648\u0634\u0647\u0654 \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627\u06cc npm \u062f\u0631 \u0622\u0646 \u0630\u062e\u06cc\u0631\u0647 \u0634\u0648\u0646\u062f.<\/p>\n<p>\u06cc\u06a9 \u067e\u0648\u0634\u0647\u0654 \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>sudo mkdir -p \/srv\/rate-limited-login\r\nsudo chown sammy:sammy \/srv\/rate-limited-login\r\ncd \/srv\/rate-limited-login\r\nnpm init\r\n<\/code><\/pre>\n<p>\u062a\u0648\u0636\u06cc\u062d: \u0645\u0627\u0644\u06a9\u06cc\u062a \u067e\u0648\u0634\u0647 \u0631\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u063a\u06cc\u0631 \u0631\u06cc\u0634\u0647 (sammy) \u0627\u062e\u062a\u0635\u0627\u0635 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645 \u062a\u0627 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u0654 sudo \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0648 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0641\u0627\u06cc\u0644 \u062f\u0631 \u0627\u06cc\u0646 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0646\u0628\u0627\u0634\u062f.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0646\u0648\u0634\u062a\u0646 \u06a9\u062f\u060c Express \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc HTTP \u0631\u0627 \u062f\u0631 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Node.js \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f:<\/p>\n<pre><code>npm install express --save\r\n<\/code><\/pre>\n<p>\u062d\u0627\u0644\u0627 \u0645\u0633\u06cc\u0631 HTTP \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0639\u062f\u0627\u064b \u067e\u0634\u062a \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647 \u0642\u0631\u0627\u0631 \u0645\u06cc\u200c\u06af\u06cc\u0631\u062f. \u067e\u0648\u0634\u0647\u0654 \u067e\u0631\u0648\u0698\u0647 (\/srv\/rate-limited-login) \u0633\u0647 \u0641\u0627\u06cc\u0644 \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a: index.js\u060c \u067e\u0648\u0634\u0647\u0654 public \u0648 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc HTML\/CSS \u062f\u0627\u062e\u0644 \u0622\u0646.<\/p>\n<p>\u0641\u0627\u06cc\u0644 index.js \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>const express = require('express');\r\nconst app = express();\r\n\r\napp.use(express.urlencoded({ extended: true }));\r\napp.use(express.static('public'));\r\n\r\napp.post('\/', (req, res) =&gt; {\r\n  res.send('Logging in...');\r\n});\r\n\r\napp.listen(8080, () =&gt; {\r\n  console.log('Server running on port 8080');\r\n});\r\n<\/code><\/pre>\n<p>\u0627\u06cc\u0646 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0627 \u0627\u062c\u0631\u0627\u06cc index.js \u062a\u0648\u0633\u0637 Node.js\u060c \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc HTTP \u0631\u0627 \u067e\u0631\u062f\u0627\u0632\u0634 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0647\u0631 \u0641\u0627\u06cc\u0644\u06cc \u06a9\u0647 \u062f\u0631 \/srv\/rate-limited-login\/public \u0642\u0631\u0627\u0631 \u06af\u06cc\u0631\u062f \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0648\u0628\u200c\u0633\u0631\u0648\u0631 \u0642\u0627\u0628\u0644 \u062f\u0633\u062a\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f \u0648 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0628\u0647 http:\/\/localhost:8080 \u067e\u0627\u0633\u062e Logging in&#8230; \u0631\u0627 \u0628\u0627\u0632\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>\u06cc\u06a9 \u067e\u0648\u0634\u0647\u0654 public \u0628\u0631\u0627\u06cc \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc HTML \u0648 CSS \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>mkdir public\r\ncd public\r\n<\/code><\/pre>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 index.html \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>&lt;!doctype html&gt;\r\n&lt;html lang=\"fa\"&gt;\r\n&lt;head&gt;\r\n  &lt;meta charset=\"utf-8\"&gt;\r\n  &lt;title&gt;Login&lt;\/title&gt;\r\n  &lt;link rel=\"stylesheet\" href=\"login.css\"&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n  &lt;form method=\"POST\" action=\"\/\"&gt;\r\n    &lt;label&gt;Username:&lt;\/label&gt;\r\n    &lt;input type=\"text\" name=\"username\" \/&gt;\r\n    &lt;label&gt;Password:&lt;\/label&gt;\r\n    &lt;input type=\"password\" name=\"password\" \/&gt;\r\n    &lt;button type=\"submit\"&gt;Login&lt;\/button&gt;\r\n  &lt;\/form&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/code><\/pre>\n<p>\u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0641\u0631\u0645 \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u062f\u060c \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0628\u0647 \u0645\u0633\u06cc\u0631 \/ \u0641\u0631\u0633\u062a\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u06a9\u0647 \u062f\u0631 index.js \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u062f\u0631 \u0635\u0648\u0631\u062a \u062a\u0645\u0627\u06cc\u0644 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0641\u0627\u06cc\u0644 CSS \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f (\u0645\u062b\u0644\u0627\u064b login.css) \u062a\u0627 \u0627\u0633\u062a\u0627\u06cc\u0644 \u062f\u0644\u062e\u0648\u0627\u0647 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>\/* Example CSS *\/\r\nbody {\r\n  font-family: Arial, sans-serif;\r\n  height: 100vh;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n  background: linear-gradient(135deg, #71b7e6, #9b59b6);\r\n}\r\nform {\r\n  background: rgba(255,255,255,0.9);\r\n  padding: 20px;\r\n  border-radius: 8px;\r\n}\r\n<\/code><\/pre>\n<p>\u062d\u0627\u0644\u0627 \u0647\u0645\u0647\u0654 \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0631\u0627 \u062f\u0627\u0631\u06cc\u062f \u0648 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>node index.js\r\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u0645\u062a\u0648\u0642\u0641 \u06a9\u0631\u062f\u0646 \u0627\u062c\u0631\u0627\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0632 CTRL+C \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<h2>\u0627\u062c\u0631\u0627\u06cc \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0627 PM2<\/h2>\n<p>\u0627\u06af\u0631 \u062c\u0644\u0633\u0647\u0654 SSH \u062e\u0648\u062f \u0631\u0627 \u0628\u0628\u0646\u062f\u06cc\u062f\u060c \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u062a\u0648\u0642\u0641 \u062e\u0648\u0627\u0647\u062f \u0634\u062f. \u0628\u0631\u0627\u06cc \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0646 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u067e\u0633 \u0627\u0632 \u062e\u0631\u0648\u062c \u0627\u0632 \u0633\u0631\u0648\u0631 \u0627\u0632 PM2 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<pre><code>pm2 start index.js --name rate-limited-login\r\npm2 save\r\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0633\u062a\u060c \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a POST \u0628\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0641\u0631\u0633\u062a\u06cc\u062f:<\/p>\n<pre><code>curl -X POST http:\/\/localhost:8080\r\n<\/code><\/pre>\n<p>\u062f\u0631 \u0639\u0645\u0644 \u06cc\u06a9 \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0648\u0627\u0642\u0639\u06cc \u0646\u06cc\u0627\u0632\u0645\u0646\u062f \u0627\u0645\u0646\u06cc\u062a\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u0627\u0633\u062a\u061b \u0628\u0631\u0627\u06cc \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc\u200c\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0628\u0647 OWASP Authentication Cheat Sheet \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647\u200c\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f Passport \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<h2>\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647 \u0646\u0631\u062e \u062f\u0631 Nginx<\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0631\u062d\u0644\u0647 Nginx \u062a\u0631\u0627\u0641\u06cc\u06a9 \u0631\u0627 \u0628\u0647 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0648\u0631\u0648\u062f \u0647\u062f\u0627\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u0632 \u0633\u0647 \u062f\u0633\u062a\u0648\u0631 Nginx \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f: <code>limit_req_zone<\/code>\u060c <code>limit_req<\/code> \u0648 <code>limit_req_status<\/code>.<\/p>\n<p><strong>limit_req_zone<\/strong> \u0645\u0639\u06cc\u0627\u0631 \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u060c \u0645\u06cc\u0632\u0627\u0646 \u062d\u0627\u0641\u0638\u0647\u0654 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc Nginx \u0628\u0631\u0627\u06cc \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0633\u0648\u0627\u0628\u0642 \u0648 \u0646\u0631\u062e \u0645\u062c\u0627\u0632 \u0631\u0627 \u062a\u0639\u06cc\u06cc\u0646 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<p>\u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0633\u0627\u06cc\u062a \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f (\u0641\u0627\u06cc\u0644 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 login.your_domain.com):<\/p>\n<pre><code># open your server block configuration, e.g. \/etc\/nginx\/sites-available\/login.your_domain.com\r\n<\/code><\/pre>\n<p>\u06cc\u06a9 <code>limit_req_zone<\/code> \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r\/s;\r\n<\/code><\/pre>\n<p>\u062e\u0637 \u0628\u0627\u0644\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u0628\u0631 \u067e\u0627\u06cc\u0647\u0654 IP \u06a9\u0644\u0627\u06cc\u0646\u062a ($binary_remote_addr) \u0627\u0646\u062c\u0627\u0645 \u0634\u0648\u062f\u060c \u0645\u0646\u0637\u0642\u0647\u200c\u0627\u06cc \u0628\u0647 \u0646\u0627\u0645 login_limit \u0628\u0627 10\u0645\u06af\u0627\u0628\u0627\u06cc\u062a \u062d\u0627\u0641\u0638\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u062f \u0648 \u0646\u0631\u062e \u0645\u062c\u0627\u0632 5 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062f\u0631 \u062b\u0627\u0646\u06cc\u0647 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u0628\u0631 \u0627\u0633\u0627\u0633 \u0645\u0639\u06cc\u0627\u0631\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f <code>$geoip_country_code<\/code> \u06cc\u0627 \u0633\u0627\u06cc\u0631 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc Nginx \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><strong>limit_req<\/strong> \u0645\u062d\u062f\u0648\u062f\u0647\u0654 \u06a9\u0627\u0631\u0628\u0631\u062f \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u0648 \u06af\u0632\u06cc\u0646\u0647\u200c\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f burst \u0648 nodelay\/delay \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<pre><code>server {\r\n  ...\r\n  location \/ {\r\n    proxy_pass http:\/\/localhost:8080;\r\n    limit_req zone=login_limit burst=10;\r\n  }\r\n}\r\n<\/code><\/pre>\n<p>\u062f\u0633\u062a\u0648\u0631 <code>limit_req<\/code> \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u062f\u0631 context \u0647\u0627\u06cc <code>server<\/code> \u06cc\u0627 <code>location<\/code> \u0642\u0631\u0627\u0631 \u06af\u06cc\u0631\u062f.<\/p>\n<p><strong>limit_req_status<\/strong> \u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 Nginx \u0647\u0646\u06af\u0627\u0645 \u0639\u0628\u0648\u0631 \u0627\u0632 \u062d\u062f \u0622\u0633\u062a\u0627\u0646\u0647 \u06a9\u062f 503 \u0631\u0627 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f \u06a9\u0647 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u06af\u06cc\u062c\u200c\u06a9\u0646\u0646\u062f\u0647 \u0628\u0627\u0634\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>limit_req_status<\/code> \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0647 \u062c\u0627\u06cc 503\u060c \u06a9\u062f 429 (Too Many Requests) \u0631\u0627 \u0628\u0627\u0632\u06af\u0631\u062f\u0627\u0646\u06cc\u0645.<\/p>\n<pre><code>server {\r\n  ...\r\n  limit_req_status 429;\r\n}\r\n<\/code><\/pre>\n<p>\u0628\u0639\u062f \u0627\u0632 \u0627\u0641\u0632\u0648\u062f\u0646 \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0634\u0645\u0627 \u0686\u06cc\u0632\u06cc \u0645\u0634\u0627\u0628\u0647 \u0632\u06cc\u0631 \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a:<\/p>\n<pre><code>limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r\/s;\r\n\r\nserver {\r\n  listen 80;\r\n  server_name login.your_domain.com;\r\n\r\n  location \/ {\r\n    proxy_pass http:\/\/localhost:8080;\r\n    limit_req zone=login_limit burst=10;\r\n  }\r\n\r\n  limit_req_status 429;\r\n}\r\n<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u0646\u062a\u0647\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx \u0631\u0627 \u0631\u06cc\u200c\u0628\u0627\u0631 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>sudo nginx -t\r\nsudo systemctl reload nginx\r\n<\/code><\/pre>\n<h2>\u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647 \u0646\u0631\u062e \u0628\u0627 \u0627\u0628\u0632\u0627\u0631 \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc<\/h2>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0633\u062a\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0635\u0641\u062d\u0627\u062a \u0631\u0627 \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u0631\u0641\u0631\u0634 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u062e\u0637\u0627\u06cc 429 \u0628\u0628\u06cc\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0634\u0628\u06cc\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u062b\u0644 k6 \u06cc\u0627 Apache Benchmark (ab) \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u0627\u0632 Apache Benchmark \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0686\u0648\u0646 CLI \u0633\u0627\u062f\u0647 \u0648 \u0628\u062f\u0648\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062f\u0627\u0631\u062f.<\/p>\n<p>\u0646\u0635\u0628 Apache Benchmark:<\/p>\n<pre><code>sudo apt update\r\nsudo apt install apache2-utils\r\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627 100 \u0627\u062a\u0635\u0627\u0644 \u0647\u0645\u0632\u0645\u0627\u0646 \u0648 \u0645\u062c\u0645\u0648\u0639 100 \u062f\u0631\u062e\u0648\u0627\u0633\u062a:<\/p>\n<pre><code>ab -n 100 -c 100 https:\/\/login.your_domain.com\/\r\n<\/code><\/pre>\n<p>\u062f\u0631 \u062e\u0631\u0648\u062c\u06cc <code>ab<\/code> \u0628\u0647 \u062a\u0639\u062f\u0627\u062f \u067e\u0627\u0633\u062e\u200c\u0647\u0627\u06cc \u062e\u0637\u0627 \u062a\u0648\u062c\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0632\u0645\u0627\u0646\u200c\u0647\u0627\u06cc \u067e\u0627\u0633\u062e \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0627 \u0646\u0631\u062e \u0645\u062d\u062f\u0648\u062f 5r\/s\u060c \u062d\u062f\u0627\u06a9\u062b\u0631 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0631 200ms \u0645\u062c\u0627\u0632 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0645\u0634\u0627\u0647\u062f\u0647\u0654 \u0644\u0627\u06af \u062e\u0637\u0627\u0647\u0627\u06cc Nginx \u062f\u0631 \u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>sudo tail -f \/var\/log\/nginx\/error.log\r\n<\/code><\/pre>\n<p>\u0646\u0645\u0648\u0646\u0647\u0654 \u0644\u0627\u06af:<\/p>\n<pre><code>2020\/01\/01 12:00:00 [error] 12345#0: *1 limiting requests, excess: 120.00 by zone \"login_limit\", client: 1.2.3.4, server: login.your_domain.com, request: \"GET \/ HTTP\/1.1\", host: \"login.your_domain.com\"\r\n<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0644\u0627\u06af: <code>excess<\/code> \u0646\u0634\u0627\u0646\u200c\u062f\u0647\u0646\u062f\u0647\u0654 \u0645\u06cc\u0632\u0627\u0646 \u0645\u0627\u0632\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0646\u0633\u0628\u062a \u0628\u0647 \u0622\u0633\u062a\u0627\u0646\u0647 \u0627\u0633\u062a\u060c <code>login_limit<\/code> \u0646\u0627\u0645 \u0645\u0646\u0637\u0642\u0647\u0654 \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u0627\u0633\u062a\u060c <code>client<\/code> \u0622\u062f\u0631\u0633 IP \u0628\u0627\u0632\u062f\u06cc\u062f\u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a \u0648 <code>request<\/code> \u0646\u0648\u0639 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc\u200c\u062f\u0647\u062f.<\/p>\n<h2>\u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u067e\u06cc\u0634\u0631\u0641\u062a\u0647: burst\u060c nodelay \u0648 delay<\/h2>\n<p>\u0628\u0627 \u0646\u0631\u062e 5r\/s (\u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0631 200ms)\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0631\u0627\u06cc \u0648\u0628\u200c\u0633\u0627\u06cc\u062a\u06cc \u06a9\u0647 \u0645\u0646\u0627\u0628\u0639 \u0645\u062a\u0639\u062f\u062f\u06cc \u0645\u062b\u0644 \u062a\u0635\u0627\u0648\u06cc\u0631 \u0648 CSS \u0628\u0627\u0631\u06af\u0630\u0627\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0627\u0641\u06cc \u0646\u0628\u0627\u0634\u062f. Nginx \u0627\u0645\u06a9\u0627\u0646 \u062a\u0639\u06cc\u06cc\u0646 \u0635\u0641 burst \u0631\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0627 \u062a\u0639\u062f\u0627\u062f \u0627\u0636\u0627\u0641\u06cc \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0628\u0627\u0632\u06af\u0631\u062f\u0627\u0646\u062f\u0646 \u062e\u0637\u0627 \u0628\u067e\u0630\u06cc\u0631\u062f. \u0627\u0645\u0627 \u0635\u0641 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u0627\u0639\u062b \u0627\u06cc\u062c\u0627\u062f \u062a\u0627\u062e\u06cc\u0631 \u062f\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u0634\u0648\u062f \u0686\u0648\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0628\u0647 \u0646\u0648\u0628\u062a \u0633\u0631\u0648 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. <code>nodelay<\/code> \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0635\u0641 \u0628\u062f\u0648\u0646 \u0627\u0646\u062a\u0638\u0627\u0631 \u0628\u06cc\u0646 \u0647\u0631\u06a9\u062f\u0627\u0645 \u067e\u0631\u062f\u0627\u0632\u0634 \u0634\u0648\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0632 Nginx 1.15.7 \u0628\u0647 \u0628\u0639\u062f\u060c <code>delay<\/code> \u062a\u0631\u06a9\u06cc\u0628\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u062f\u0648 \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f \u062a\u0639\u062f\u0627\u062f\u06cc \u0627\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u062f\u0648\u0646 \u062a\u0627\u062e\u06cc\u0631 \u0639\u0628\u0648\u0631 \u062f\u0647\u06cc\u062f \u0648 \u0628\u0642\u06cc\u0647 \u0631\u0627 \u0628\u0627 \u062a\u0627\u062e\u06cc\u0631 \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u067e\u0631\u062f\u0627\u0632\u0634 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646 \u0635\u0641 burst:<\/p>\n<pre><code>location \/ {\r\n  proxy_pass http:\/\/localhost:8080;\r\n  limit_req zone=login_limit burst=10;\r\n}\r\n<\/code><\/pre>\n<p>\u0631\u06cc\u200c\u0644\u0648\u062f Nginx:<\/p>\n<pre><code>sudo systemctl reload nginx\r\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u0641\u0639\u0627\u0644\u200c\u0633\u0627\u0632\u06cc nodelay \u062a\u0627 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0635\u0641 \u0628\u062f\u0648\u0646 \u062a\u0627\u062e\u06cc\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u0634\u0648\u0646\u062f:<\/p>\n<pre><code>location \/ {\r\n  proxy_pass http:\/\/localhost:8080;\r\n  limit_req zone=login_limit burst=10 nodelay;\r\n}\r\n<\/code><\/pre>\n<p>\u0627\u06af\u0631 \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0647 \u062c\u0627\u06cc nodelay \u0627\u0632 delay \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f (\u0646\u0633\u062e\u0647\u0654 Nginx \u2265 1.15.7)\u060c \u0645\u062b\u0644\u0627\u064b \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u062a\u0627 4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0632 \u0635\u0641 \u0628\u062f\u0648\u0646 \u062a\u0627\u062e\u06cc\u0631 \u0639\u0628\u0648\u0631 \u06a9\u0646\u0646\u062f:<\/p>\n<pre><code>location \/ {\r\n  proxy_pass http:\/\/localhost:8080;\r\n  limit_req zone=login_limit burst=10 delay=4;\r\n}\r\n<\/code><\/pre>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u062d\u062f\u0627\u06a9\u062b\u0631 4 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u062f\u0648\u0646 \u062a\u0627\u062e\u06cc\u0631 \u067e\u0631\u062f\u0627\u0632\u0634 \u0634\u0648\u0646\u062f \u0648 \u0628\u0642\u06cc\u0647\u0654 6 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0635\u0641 \u0628\u0627 \u062d\u062f \u0645\u0634\u062e\u0635 (\u0645\u062b\u0644\u0627\u064b 200ms \u0628\u06cc\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627) \u067e\u0631\u062f\u0627\u0632\u0634 \u062e\u0648\u0627\u0647\u0646\u062f \u0634\u062f.<\/p>\n<h2>\u0627\u06cc\u062c\u0627\u062f \u0635\u0641\u062d\u0647\u0654 \u062e\u0637\u0627\u06cc 429 \u0633\u0641\u0627\u0631\u0634\u06cc<\/h2>\n<p>\u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0628\u0627\u0632\u062f\u06cc\u062f\u06a9\u0646\u0646\u062f\u0647 \u0627\u0632 \u062d\u062f \u0645\u062c\u0627\u0632 \u0641\u0631\u0627\u062a\u0631 \u0631\u0648\u062f\u060c Nginx \u0635\u0641\u062d\u0647\u0654 \u062e\u0637\u0627\u06cc \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f. \u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u062a\u062c\u0631\u0628\u0647\u0654 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0635\u0641\u062d\u0647\u0654 429 \u0633\u0641\u0627\u0631\u0634\u06cc\u200c\u0627\u06cc \u0645\u0637\u0627\u0628\u0642 \u0637\u0631\u0627\u062d\u06cc \u0633\u0627\u06cc\u062a \u062e\u0648\u062f \u0628\u0633\u0627\u0632\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9 \u067e\u0648\u0634\u0647 \u0628\u0631\u0627\u06cc \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u062e\u0637\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f \u0648 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 429.html \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<pre><code>sudo mkdir -p \/usr\/share\/nginx\/errors\r\nsudo nano \/usr\/share\/nginx\/errors\/429.html\r\n<\/code><\/pre>\n<pre><code>&lt;!doctype html&gt;\r\n&lt;html lang=\"fa\"&gt;\r\n&lt;head&gt;\r\n  &lt;meta charset=\"utf-8\"&gt;\r\n  &lt;title&gt;Too Many Requests&lt;\/title&gt;\r\n  &lt;style&gt;\r\n    body { font-family: Arial, sans-serif; height:100vh; display:flex; justify-content:center; align-items:center; background: linear-gradient(135deg,#71b7e6,#9b59b6); color:#fff; }\r\n    .card { background: rgba(0,0,0,0.4); padding: 30px; border-radius: 8px; text-align:center; }\r\n    h1 { font-size: 48px; margin:0 0 10px 0; }\r\n  &lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n  &lt;div class=\"card\"&gt;\r\n    &lt;h1&gt;429&lt;\/h1&gt;\r\n    &lt;p&gt;\u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0627\u0632 \u062d\u062f \u0645\u062c\u0627\u0632 \u0641\u0631\u0627\u062a\u0631 \u0631\u0641\u062a\u0647 \u0627\u0633\u062a. \u0644\u0637\u0641\u0627\u064b \u062f\u0642\u0627\u06cc\u0642\u06cc \u0628\u0639\u062f \u062a\u0644\u0627\u0634 \u06a9\u0646\u06cc\u062f.&lt;\/p&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/code><\/pre>\n<p>\u0633\u067e\u0633 \u062f\u0631 \u0628\u0644\u0648\u06a9 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Nginx\u060c \u0645\u0633\u06cc\u0631 \u062e\u0637\u0627 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f \u0648 \u067e\u0648\u0634\u0647\u0654 \/usr\/share\/nginx\/errors \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0639\u0645\u0648\u0645\u06cc \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f:<\/p>\n<pre><code>server {\r\n  listen 80;\r\n  server_name login.your_domain.com;\r\n\r\n  root \/var\/www\/html;\r\n\r\n  error_page 429 \/errors\/429.html;\r\n  location \/errors\/ {\r\n    alias \/usr\/share\/nginx\/errors\/;\r\n  }\r\n\r\n  location \/ {\r\n    proxy_pass http:\/\/localhost:8080;\r\n    limit_req zone=login_limit burst=10;\r\n  }\r\n\r\n  limit_req_status 429;\r\n}\r\n<\/code><\/pre>\n<p>\u0631\u06cc\u200c\u0644\u0648\u062f Nginx:<\/p>\n<pre><code>sudo nginx -t\r\nsudo systemctl reload nginx\r\n<\/code><\/pre>\n<p>\u0628\u0631\u0627\u06cc \u062f\u06cc\u062f\u0646 \u0635\u0641\u062d\u0647\u0654 429 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0647 login.your_domain.com \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0631\u062f\u0647 \u0648 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc\u200c\u0647\u0627 \u0631\u0627 \u0637\u0648\u0631\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f \u06a9\u0647 \u0633\u0631\u06cc\u0639\u200c\u062a\u0631 \u0646\u0631\u062e \u0645\u062c\u0627\u0632 \u0631\u0627 \u0631\u062f \u06a9\u0646\u06cc\u062f (\u0645\u062b\u0644\u0627\u064b \u062d\u0630\u0641 burst \u06cc\u0627 \u06a9\u0627\u0647\u0634 \u0645\u0642\u062f\u0627\u0631 rate) \u062a\u0627 \u0635\u0641\u062d\u0647\u0654 \u062e\u0637\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0634\u0648\u062f.<\/p>\n<h2>\u0646\u062a\u06cc\u062c\u0647\u200c\u06af\u06cc\u0631\u06cc<\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 Nginx \u0631\u0627 \u0637\u0648\u0631\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0631\u062f\u06cc\u062f \u06a9\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u0628\u0647 \u06cc\u06a9 \u0641\u0631\u0645 \u0648\u0631\u0648\u062f Node.js \u0631\u0627 \u0645\u062d\u062f\u0648\u062f \u06a9\u0646\u062f \u062a\u0627 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u0648 \u062d\u0645\u0644\u0627\u062a \u0645\u062e\u0631\u0628 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0634\u0648\u062f. \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u0627\u0645\u0646\u06cc\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u200c\u0647\u0627\u06cc \u0648\u0628 \u062e\u0648\u062f \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u06af\u0627\u0645 \u0628\u0639\u062f\u06cc: \u0645\u0633\u062a\u0646\u062f\u0627\u062a Nginx \u0631\u0627 \u0628\u0631\u0627\u06cc Limiting Access to Proxied HTTP Resources \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0628\u06cc\u0627\u0645\u0648\u0632\u06cc\u062f \u0686\u06af\u0648\u0646\u0647 \u067e\u0647\u0646\u0627\u06cc \u0628\u0627\u0646\u062f \u06cc\u0627 \u062a\u0639\u062f\u0627\u062f \u06a9\u0627\u0646\u06a9\u0634\u0646\u200c\u0647\u0627 \u0631\u0627 \u0646\u06cc\u0632 \u0645\u062d\u062f\u0648\u062f \u06a9\u0646\u06cc\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0644\u06cc\u0633\u062a \u062f\u0633\u062a\u0631\u0633\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u062c\u063a\u0631\u0627\u0641\u06cc\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0622\u062e\u0631\u06cc\u0646 \u062a\u0648\u0633\u0639\u0647\u200c\u0647\u0627\u06cc Nginx \u0628\u0647 \u0648\u0628\u0644\u0627\u06af Nginx \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0627 <strong><a href=\"https:\/\/parmin.cloud\/\">ParminCloud<\/a> <\/strong>\u0647\u0645\u0631\u0627\u0647\u06cc\u062f \u0645\u062a\u0634\u06a9\u0631\u06cc\u0645.<\/p>\n<div style='text-align:center' class='yasr-auto-insert-visitor'><\/div>","protected":false},"excerpt":{"rendered":"<p>\u0645\u0642\u062f\u0645\u0647 \u0645\u062d\u062f\u0648\u062f\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0646\u0631\u062e (rate limiters) \u0628\u0631\u0627\u06cc \u0645\u062d\u06cc\u0637\u200c\u0647\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0636\u0631\u0648\u0631\u06cc \u0647\u0633\u062a\u0646\u062f \u0686\u0648\u0646 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u062d\u0645\u0644\u0627\u062a brute-force \u0645\u062e\u0631\u0628 \u0628\u0647 \u0645\u0646\u0627\u0628\u0639 \u062d\u0633\u0627\u0633 \u067e\u0634\u062a \u0641\u0631\u0645\u200c\u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0648\u0628 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0622\u0646\u200c\u0647\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u062f\u0631 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a \u062a\u0648\u0632\u06cc\u0639\u200c\u0634\u062f\u0647\u0654 \u0627\u0646\u06a9\u0627\u0631 \u0633\u0631\u0648\u06cc\u0633 (DDoS) \u0646\u0642\u0634 \u0641\u0639\u0627\u0644\u06cc \u062f\u0627\u0631\u0646\u062f. \u0648\u0628\u200c\u0633\u0631\u0648\u0631\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f Nginx \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0628\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u062d\u062f\u0648\u062f\u0633\u0627\u0632\u06cc \u0646\u0631\u062e \u062f\u0627\u0631\u0646\u062f \u0648 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u0627 \u0645\u0635\u0631\u0641 \u0645\u0646\u0627\u0628\u0639 [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":5618,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"","footnotes":""},"categories":[258,150],"tags":[523,520,522,521,524],"class_list":["post-5609","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ubuntu","category-linux","tag-rate-limiting--node-js","tag---nginx---node-js","tag------nginx","tag-------ddos","tag----nginx"],"aioseo_notices":[],"yasr_visitor_votes":{"stars_attributes":{"read_only":false,"span_bottom":false},"number_of_votes":0,"sum_votes":0},"_links":{"self":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/5609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/comments?post=5609"}],"version-history":[{"count":3,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/5609\/revisions"}],"predecessor-version":[{"id":5619,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/5609\/revisions\/5619"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/media\/5618"}],"wp:attachment":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/media?parent=5609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/categories?post=5609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/tags?post=5609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}