Score:2

Nginx วิธีปิดใช้งานการจำกัดอัตรา IP ต่อคน

ธง cn
Dan

ฉันมี API ที่เชื่อมต่อผ่าน ip ส่วนตัวของเซิร์ฟเวอร์ EC2 และดำเนินการลำดับการโทรกลับฉันต้องการปิดใช้งานการจำกัดอัตรา IP ในสถานการณ์นี้ ฉันได้ลองวิธีนี้ในเอกสารประกอบของ Nginx

สิ่งนี้ไม่ได้แก้ไขการจำกัดอัตราสำหรับปัญหา บันทึกการเข้าถึง

192.168.192.51 - - [14/มิ.ย./2021:00:09:55 +0530] "POST /project/api/v1/vendor/callback HTTP/1.1" 429 8576 "-" "Java/1.8.0_151" "- " "192.168.13.173" sn="192.168.13.173" rt=0.009 ua="unix:/var/run/php/php7.4-fpm.sock" us="429" ut="0.008" ul="8591 " คส=-

ไฟล์คอนฟิก Nginx

ผู้ใช้ www-data;
worker_processes อัตโนมัติ
pid /run/nginx.pid;
รวม /etc/nginx/modules-enabled/*.conf;

เหตุการณ์ {
    worker_connections 1024;
    # multi_accept บน;
}

http {

    จำกัด ทางภูมิศาสตร์ $ {
        ค่าเริ่มต้น 1;
        192.168.192.51 0;
    }
 
    แผนที่ $limit $limit_key {
            0 "";
            1 $binary_remote_addr;
    }
 
    limit_req_zone $limit_key zone=req_zone:อัตรา 10m=100r/s;

    ##
    # การตั้งค่าพื้นฐาน
    ##

    ส่งไฟล์บน;
    tcp_nopush บน;
    tcp_nodelay บน;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # ปิด server_tokens;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect ปิด;

    รวม /etc/nginx/mime.types;
    แอปพลิเคชัน default_type/octet-stream;

    ##
    # การตั้งค่า SSL
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # วาง SSLv3 อ้างอิง: พุดเดิ้ล
    เปิด ssl_prefer_server_ciphers;

    ##
    # การตั้งค่าการบันทึก
    ##

    error_log /var/log/nginx/error.log เตือน;
    log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '"$host" sn="$server_name" ' ' rt=$request_time ' 'ua="$upstream_addr" us="$upstream_status" ' 'ut="$upstream_response_time" ul="$upstream_response_length" ' 'cs=$upstream_cache_status' ;
    access_log /var/log/nginx/access.log main_ext;

    ##
    # การตั้งค่า Gzip
    ##

    เปิด gzip;

    # gzip_vary บน;
    # gzip_proxyed ใด ๆ ;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types ข้อความ/ข้อความล้วน/แอปพลิเคชัน css/แอปพลิเคชัน json/ข้อความจาวาสคริปต์/แอปพลิเคชัน xml/แอปพลิเคชัน xml/xml+rss ข้อความ/จาวาสคริปต์;

    ##
    # การกำหนดค่าโฮสต์เสมือน
    ##

    รวม /etc/nginx/conf.d/*.conf;
    รวม /etc/nginx/sites-enabled/*;

    fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        fastcgi_connect_timeout 90;
        fastcgi_send_timeout 90;
        fastcgi_read_timeout 90;
}

บล็อกเซิร์ฟเวอร์

เซิร์ฟเวอร์ {
    ฟัง 80;
    ฟัง 81;

        รูท /data/www;

        ดัชนี index.html index.htm index.php;

        server_name 192.168.13.173;


        ที่ตั้ง / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

    ที่ตั้ง/โครงการ{
                นามแฝง /data/www/project/public;
                try_files $uri $uri/ @โครงการ;

                ตำแหน่ง ~ \.php$ {
                        รวมตัวอย่าง/fastcgi-php.conf;
                        fastcgi_param SCRIPT_FILENAME $request_filename;
                        fastcgi_pass ยูนิกซ์:/var/run/php/php7.4-fpm.sock;
                }
        }

        ที่ตั้ง @โครงการ {
                เขียนใหม่ /project/(.*)$ /project/index.php?/$1 สุดท้าย;
        }


    ตำแหน่ง ~ \.php$ {
                รวมตัวอย่าง/fastcgi-php.conf;
                fastcgi_pass ยูนิกซ์:/var/run/php/php7.4-fpm.sock;
        }

        ตำแหน่ง ~ /\.ht {
                ปฏิเสธทั้งหมด
        }


}
djdomi avatar
za flag
หากเซิร์ฟเวอร์ของคุณไม่ว่าง นั่นเป็นปฏิกิริยาปกติ คุณได้ลองใช้ `worker_connections 10240;` (ค่า 10x) แล้วหรือยัง ให้มองหา https://www.nginx.com/blog/rate-limiting-nginx/ อาจมีมะนาวบ้าง มีบางอย่างซ่อนอยู่
djdomi avatar
za flag
อย่างไรก็ตาม เนื่องจากการเรียก API จำนวนมากสามารถแคชได้ ฉันขอแนะนำให้คุณดูที่ `set $memcached_key "$uri?$args"; โฮสต์ memcached_pass:11211; ` นอกจากนี้ยังอาจปรับปรุงเซิร์ฟเวอร์ของคุณด้วย ;) จำเป็นต้องมี memcached ที่ติดตั้งไว้สำหรับการใช้งานนี้
Dan avatar
cn flag
Dan
ขอบคุณ แต่ฉันคิดว่ามีบางอย่างผิดปกติกับแนวทางนี้ ไม่มีการเปลี่ยนแปลงแม้แต่ครั้งเดียวหลังจากที่ฉันได้เพิ่มรายการสีขาวที่จำกัดอัตรานี้แล้ว ดังนั้นฉันคิดว่าฉันขาดอะไรไปที่นี่?
sv flag
ตามบันทึกการเข้าถึงที่ระบุใน OP รหัสสถานะจะแสดงเป็น 429 (คำขอมากเกินไป) อย่างไรก็ตาม โดยค่าเริ่มต้น Nginx จะส่ง 503 อ้างอิง: https://nginx.org/r/limit_req_status การจำกัดอัตราจะมีผลใน Nginx ก็ต่อเมื่อกำหนดค่าทั้ง `limit_req_zone` และ `limit_req` การกำหนดค่าของคุณไม่มีคำสั่ง `limit_req` ฉันเดาว่าการจำกัดอัตราไม่มีผลใน Nginx หรือคุณไม่ได้ระบุการกำหนดค่าแบบเต็ม โปรดดูตัวอย่างการกำหนดค่าสำหรับกรณีการใช้งานของคุณ... https://www.nginx.com/blog/rate-limiting-nginx/#Advanced-Configuration-Examples
Dan avatar
cn flag
Dan
คุณถูกต้อง @PothiKalimuthu สิ่งนี้ไม่ได้สร้างจาก Nginx สิ่งนี้ถูกนำไปใช้จากรหัส (Laravel Framework) ฉันพลาดโดยบันทึกการเข้าถึง ฉันคิดว่าสิ่งนี้สร้างขึ้นจาก Nginx โดยดูที่บันทึกการเข้าถึง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา