Score:0

การตั้งค่า NGINX สำหรับ REST API ส่งคืนการกำหนดค่าเริ่มต้น

ธง cn

ฉันได้จ้าง VPS เพื่อเล่นกับโครงการส่วนตัวบางอย่าง ในการเริ่มต้น ฉันกำลังพยายามตั้งค่าให้โฮสต์ REST API โดยใช้ Node.js เนื่องจากฉันเคยใช้ Spring Boot สำหรับสิ่งนั้นเท่านั้น

ฉันได้นำโซลูชันไปใช้โดยดัดแปลงจากคำแนะนำต่อไปนี้:

https://www.robinwieruch.de/node-express-server-rest-api (รหัส API ส่วนใหญ่มีลักษณะเช่นนี้)

https://itnext.io/building-restful-api-with-node-js-express-js-and-postgresql-the-right-way-b2e718ad1c66 (แต่ผมค่อยๆแปลงไปใช้มาตรฐานจากที่นี่นะครับ)

สำหรับการปรับใช้จริง ฉันได้เปลี่ยนเพื่อรวม API กับ Babel และฉันกำลังปรับใช้กับ PM2

https://www.nginx.com/blog/deploying-nginx-plus-as-an-api-gateway-part-1/ (ไม่ใช่พลัสแม้ว่า)

(ลิงค์ทั้งหมดเหล่านั้นมีอยู่ผ่าน http://web.archive.org/ ดังนั้นพวกเขาจะไม่ไปไหนในเร็วๆ นี้)

ฉันสร้างโปรเจ็กต์ Node.js อื่นโดยใช้ แกน เพื่อทดสอบคำขอ REST ใช้งานใน VPS เดียวกันได้ แต่ฉันต้องเปลี่ยนรหัส API เพื่อผูก โลคัลโฮสต์. ก่อนหน้านี้ ไม่มีการระบุที่อยู่การโยงไว้ การผูกกับ IPv6 โลคัลโฮสต์ (ถ้าฉันเข้าใจถูกต้อง) และเนื่องจากโดเมนของฉันใช้งานไม่ได้กับ IPv6 ฉันจึงจะใช้ IPv4 ต่อไป

ในด้าน NGINX ฉันได้ทำการเปลี่ยนแปลงมากที่สุดเนื่องจากตอนนี้ฉันมีเพียง 1 API และฉันจะไม่ใช้การทำโหลดบาลานซ์ นอกจากนี้ ฉันได้เปลี่ยนนโยบายการตั้งชื่อแล้ว ฉันจะใช้ example.com/app_or_project_name/api_or_web_or_other_kind_of_interface/project_specific_routes.

นี่คือลักษณะของการตั้งค่า NGINX ของฉัน ฉันไม่ระบุชื่อและเปลี่ยนเป็นชื่อเดียวกับตัวอย่าง NGINX:

api_backends.conf

คลังสินค้าต้นน้ำ {
    โซน api 64k;
    เซิร์ฟเวอร์ 127.0.0.1:some_port_number;
}

นั่นคือโฮสต์ REST API และหมายเลขพอร์ต

api_conf.d/warehouse_api.conf

# API คลังสินค้า
#
ตำแหน่ง /คลังสินค้า/api/ {
    # การกำหนดค่านโยบายที่นี่ (การรับรองความถูกต้อง การจำกัดอัตรา การบันทึก และอื่นๆ...)
    #
    access_log /var/log/nginx/warehouse_api.log หลัก;
    auth_request /_validate_apikey;

    # การกำหนดเส้นทาง URI
    #
    proxy_pass http://คลังสินค้า;

    กลับ 404; #จับทั้งหมด
}

api_gateway.conf

รวมถึง api_backends.conf;
รวมถึง api_keys.conf;

เซิร์ฟเวอร์ {
    access_log /var/log/nginx/api_access.log หลัก; # แต่ละ API อาจบันทึกไปยังไฟล์แยกต่างหาก

    ฟัง 443 ssl;
    server_name my-domain.net;

    #การกำหนดค่า TLS
    ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem; # จัดการโดย Certbot
    ssl_session_cache ที่ใช้ร่วมกัน: SSL:10m;
    ssl_session_timeout 5 นาที;
    ssl_ciphers สูง:!aNULL:!MD5;
    ssl_protocols TLSv1.2 TLSv1.3;

    # คำจำกัดความของ API หนึ่งรายการต่อไฟล์
    รวม api_conf.d/*.conf;

    #ตอบผิด
    # error_page 404 = @400; # เส้นทางที่ไม่ถูกต้องถือเป็นคำขอที่ไม่ถูกต้อง
    เปิด proxy_intercept_errors; # อย่าส่งข้อผิดพลาดส่วนหลังไปยังไคลเอนต์
    รวมถึง api_json_errors.conf; # การตอบสนองข้อผิดพลาด JSON ที่เป็นมิตรกับไคลเอ็นต์ API
    แอปพลิเคชัน default_type/json; # หากไม่มีประเภทเนื้อหาให้ถือว่า JSON

    # การตรวจสอบคีย์ API
    ตำแหน่ง = /_validate_apikey {
        ภายใน;

        ถ้า ($http_apikey = "") {
            กลับ 401; #ไม่ได้รับอนุญาต
        }
        ถ้า ($api_client_name = "") {
            กลับ 403; # ต้องห้าม
        }

        กลับ 204; # ตกลง (ไม่มีเนื้อหา)
    }

}

ฉันอาจจะตั้งค่า proxy_intercept_errors ถึง ปิด เมื่อมันทำงาน ฉันจะต้องทำการทดสอบเพื่อดูว่ามีการเปลี่ยนแปลงอะไรบ้างในคำตอบ

api_json_errors.conf

เหมือนกับตัวอย่าง

default.conf

เซิร์ฟเวอร์ {
    server_name www.my-domain.net;

    #access_log /var/log/nginx/host.access.log หลัก;

    ที่ตั้ง / {
        รูท /usr/share/nginx/html;
        ดัชนี index.html index.htm;
    }

    #error_page 404 /404.html;

    # เปลี่ยนเส้นทางหน้าข้อผิดพลาดของเซิร์ฟเวอร์ไปยังหน้าสแตติก /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    ตำแหน่ง = /50x.html {
        รูท /usr/share/nginx/html;
    }

    # พร็อกซี่สคริปต์ PHP เพื่อ Apache ฟัง 127.0.0.1:80
    #
    #location ~ \.php$ {
    #proxy_pass http://127.0.0.1;
    #}

    # ส่งสคริปต์ PHP ไปยังเซิร์ฟเวอร์ FastCGI ที่รับฟัง 127.0.0.1:9000
    #
    #location ~ \.php$ {
    # รูท html;
    # fastcgi_pass 127.0.0.1:9000;
    #fastcgi_index index.php;
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # รวม fastcgi_params;
    #}

    # ปฏิเสธการเข้าถึงไฟล์ .htaccess หากรูทเอกสารของ Apache
    # เห็นด้วยกับของ nginx
    #
    #location ~ /\.ht {
    #ปฏิเสธทั้งหมด
    #}

    ฟัง 443 ssl; # จัดการโดย Certbot
    ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem; # จัดการโดย Certbot
    รวม /etc/letsencrypt/options-ssl-nginx.conf; # จัดการโดย Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # จัดการโดย Certbot

}

เซิร์ฟเวอร์ {
    ถ้า ($host = www.my-domain.net) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot

    ถ้า ($host = my-domain.net) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot

    ฟัง 80;
    server_name my-domain.net www.my-domain.net;
    กลับ 404; # จัดการโดย Certbot

}

ฉันต้องทำการเปลี่ยนแปลงบางอย่างที่นี่เนื่องจากมีที่อยู่และพอร์ตที่ซ้ำกัน เซิร์ฟเวอร์ การกำหนดค่า

nginx.conf

ผู้ใช้ nginx;
worker_processes อัตโนมัติ

ข้อมูล error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

load_module /etc/nginx/modules/ngx_http_js_module.so;

เหตุการณ์ {
    worker_connections 1024;
}

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

    log_format main '$remote_addr - $remote_user [$time_local] "$request"'
                      '$สถานะ $body_bytes_sent "$http_referer"'
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log หลัก;

    ส่งไฟล์บน;
    #tcp_nopush บน;

    keepalive_timeout 65;

    รวม /etc/nginx/api_gateway.conf; # การกำหนดค่าเกตเวย์ API ทั้งหมด
    รวม /etc/nginx/conf.d/*.conf; # การเข้าชมเว็บปกติ
}

เมื่อฉันเรียกใช้โครงการทดสอบเดียวกันนอก VPS ฉันได้รับผลลัพธ์ต่อไปนี้:

{
  ข้อความ: 'คำขอล้มเหลวด้วยรหัสสถานะ 404'
  ชื่อ: 'ข้อผิดพลาด',
  คำอธิบาย: ไม่ได้กำหนด,
  จำนวน: ไม่ได้กำหนด,
  ชื่อไฟล์: ไม่ได้กำหนด,
  lineNumber: ไม่ได้กำหนด,
  จำนวนคอลัมน์: ไม่ได้กำหนด,
  ซ้อนกัน: '...',
  การกำหนดค่า: {
    URL: 'https://my-domain.net/warehouse/api/messages',
    วิธีการ: 'รับ',
    ส่วนหัว: {
      ยอมรับ: 'application/json, text/plain, */*',
      'การควบคุมการเข้าถึง - อนุญาต - ต้นทาง': '*',
      'ตัวแทนผู้ใช้': 'axios/0.21.1'
    },
    transformRequest: [ [ฟังก์ชั่น: transformRequest] ],
    transformResponse: [ [ฟังก์ชัน: converterResponse] ],
    หมดเวลา: 0,
    อะแดปเตอร์: [ฟังก์ชัน: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    ความยาวเนื้อหาสูงสุด: -1,
    ความยาวลำตัวสูงสุด: -1,
    ตรวจสอบสถานะ: [ฟังก์ชัน: ตรวจสอบสถานะ],
    apikey: '...',
    ข้อมูล: ไม่ได้กำหนด
  },
  รหัส: ไม่ได้กำหนด
}

สิ่งหนึ่งที่ฉันคิดออกคือข้อผิดพลาด 404 ถูกส่งกลับโดย warehouse_api.conf เพราะถ้าฉันเปลี่ยนไป กลับ 404; ไปที่รหัสอื่น นั่นคือรหัสที่ฉันจะได้รับ

ฉันเปิดใช้งานการดีบักใน NGINX แล้ว แต่ฉันไม่เข้าใจผลลัพธ์ แม้จะค้นหาเพียงเล็กน้อย:

22/07/2021 11:54:17 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *757 โดยใช้ตำแหน่ง: @404 "/warehouse/api/messages?"
22/07/2021 11:54:31 [แก้ปัญหา] nginx_pid#nginx_pid: *758 http cl:-1 สูงสุด:1048576
2021/07/22 11:54:31 [debug] nginx_pid#nginx_pid: *758 เฟสเขียนใหม่: 3
22/07/2021 11:54:31 [debug] nginx_pid#nginx_pid: *758 http จบคำขอ: 404, "/warehouse/api/messages?" ก:1, ค:1
22/07/2021 11:54:31 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *758 http การตอบกลับพิเศษ: 404, "/warehouse/api/messages?"
22/07/2021 11:54:31 [debug] nginx_pid#nginx_pid: *758 ตำแหน่งทดสอบ: "@400"
22/07/2021 11:54:31 [debug] nginx_pid#nginx_pid: *758 ตำแหน่งทดสอบ: "@401"
22/07/2021 11:54:31 [debug] nginx_pid#nginx_pid: *758 ตำแหน่งทดสอบ: "@403"
22/07/2021 11:54:31 [debug] nginx_pid#nginx_pid: *758 ตำแหน่งทดสอบ: "@404"
22/07/2021 11:54:31 [แก้ปัญหา] nginx_pid#nginx_pid: *758 โดยใช้ตำแหน่ง: @404 "/warehouse/api/messages?"

ฉันลองใช้วิธีการต่างๆ สองสามวิธีเพื่อค้นหาเกี่ยวกับทั้งหมดนี้ แต่ไม่พบโอกาสในการขายเลย

แล้วเกิดอะไรขึ้น มีอะไรผิดปกติ และฉันจะแก้ไขได้อย่างไร

ขอบคุณล่วงหน้า.

อัพเดท 2021-08-04

ตามคำตอบของ @ jose-fernando-lopez-fernandez ฉันเปลี่ยนไป api_conf.d/warehouse_api.conf ดังต่อไปนี้:

# API คลังสินค้า
#
ตำแหน่ง /คลังสินค้า/api/ {
    # การกำหนดค่านโยบายที่นี่ (การรับรองความถูกต้อง การจำกัดอัตรา การบันทึก และอื่นๆ...)
    #
    access_log /var/log/nginx/warehouse_api.log หลัก;
    auth_request /_validate_apikey;

    # การกำหนดเส้นทาง URI
    #
    ตำแหน่ง /คลังสินค้า/api/ {
        proxy_pass http://คลังสินค้า;
    }

    กลับ 404; #จับทั้งหมด
}

เพื่อให้สอดคล้องกับตัวอย่างที่ฉันกำลังติดตาม ฉันทดสอบอีกครั้งและได้รับข้อผิดพลาด 401 แทน ฉันตรวจสอบแล้วและกำลังจะผ่านอย อภิคี ไม่ถูกต้อง

ฉันแก้ไข ทดสอบอีกครั้ง และได้ 404 อีกครั้ง แต่ตอนนี้ฉันได้รับผลลัพธ์มากขึ้นจาก nginx-ดีบัก.

ฉันไม่เปิดเผยตัวตน ฉันเปลี่ยนแล้ว อภิคี โดยคนอื่นที่ฉันสร้างขึ้นและจะไม่ใช้เพื่ออะไร

ฉันยังได้เปลี่ยน posix_memalign, เพิ่มการล้าง http, ฟรี, นักเขียนลูกโซ่ใน และ มัลลอค ด้วยสตริงที่มีความยาวเท่ากันกับไบต์สุ่มฉันไม่รู้ว่าควรจะไม่ระบุชื่อหรือไม่ หากจำเป็นสำหรับคำตอบของคำถามนี้ โปรดถาม แล้วเราจะเพิ่มกลับเข้าไปตามความจำเป็นที่ควรทราบ

ต่อไปนี้:

2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 http cl:-1 สูงสุด:1048576
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสเขียนใหม่: 3
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 โพสต์เฟสเขียนใหม่: 4
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสทั่วไป: 5
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสทั่วไป: 6
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสทั่วไป: 7
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสการเข้าถึง: 8
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสการเข้าถึง: 9
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสการเข้าถึง: 10
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวจัดการคำขอตรวจสอบสิทธิ์
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http คำขอย่อย "/_validate_apikey?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http โพสต์คำขอ: "/_validate_apikey?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสเขียนใหม่: 1
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตำแหน่งทดสอบ: "/warehouse/api/"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตำแหน่งทดสอบ: "/_validate_apikey"
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 โดยใช้การกำหนดค่า "=/_validate_apikey"
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 http cl:-1 สูงสุด:1048576
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสเขียนใหม่: 3
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สคริปต์ var
2021/08/04 17:43:08 [ดีบัก] nginx_pid#nginx_pid: *1 http สคริปต์ var: "o6ZlKSX24MCY/uPwCRl80WAS"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ค่าสคริปต์ http: ""
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http เท่ากับ
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http เท่ากับ: ไม่
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http ถ้า
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http ถ้า: เท็จ
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สคริปต์ var
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http แผนที่เริ่มต้น
2021/08/04 17:43:08 [ดีบัก] nginx_pid#nginx_pid: *1 http สคริปต์ var: "o6ZlKSX24MCY/uPwCRl80WAS"
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 แผนที่ http: "o6ZlKSX24MCY/uPwCRl80WAS" "client_one"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สคริปต์ var: "client_one"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ค่าสคริปต์ http: ""
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http เท่ากับ
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http เท่ากับ: ไม่
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http ถ้า
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สคริปต์ http ถ้า: เท็จ
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http จบคำขอ: 0, "/_validate_apikey?" ก:1, ค:2
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 คำขอรับรองความถูกต้องเสร็จสิ้น s:204
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http คำขอผู้ปกครองปลุก: "/warehouse/api/messages?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http โพสต์คำขอ: "/warehouse/api/messages?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสการเข้าถึง: 10
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวจัดการคำขอตรวจสอบสิทธิ์
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวแปรชุดคำขอรับรองความถูกต้อง
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสการเข้าถึงโพสต์: 11
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสทั่วไป: 12
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เฟสทั่วไป: 13
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 posix_memalign: 218512C89A2ED401:4096 @16
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http เริ่มต้นสตรีม, ตัวจับเวลาไคลเอนต์: 0
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 epoll เพิ่มเหตุการณ์: fd:3 op:3 ev:80002005
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สำเนาสคริปต์: "โฮสต์"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สคริปต์ var: "warehouse"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สำเนาสคริปต์ http: "การเชื่อมต่อ"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สำเนาสคริปต์: "ปิด"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สำเนาสคริปต์: ""
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http สำเนาสคริปต์: ""
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 ส่วนหัวของพร็อกซี http: "ยอมรับ: แอปพลิเคชัน/json, ข้อความ/ธรรมดา, */*"
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 ส่วนหัวของพร็อกซี http: "Access-Control-Allow-Origin: *"
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 http ส่วนหัวพร็อกซี: "apikey: o6ZlKSX24MCY/uPwCRl80WAS"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ส่วนหัวพร็อกซี: "User-Agent: axios/0.21.1"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ส่วนหัวพร็อกซี:
"รับ /warehouse/api/messages HTTP/1.0
โฮสต์: คลังสินค้า
การเชื่อมต่อ: ปิด
ยอมรับ: แอปพลิเคชัน/json, ข้อความ/ธรรมดา, */*
การควบคุมการเข้าถึงอนุญาตแหล่งกำเนิด: *
apikey: o6ZlKSX24MCY/uPwCRl80WAS
ตัวแทนผู้ใช้: axios/0.21.1

"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เพิ่มการล้างข้อมูล http: 90C9DA232086B6FA
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 รับ rr peer ลอง: 1
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 สตรีมซ็อกเก็ต 15
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 epoll เพิ่มการเชื่อมต่อ: fd:15 ev:80002005
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 เชื่อมต่อกับ 127.0.0.1:some_port_number, fd:15 #2
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http เชื่อมต่ออัปสตรีม: -2
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 posix_memalign: A9E50626EC2A1D36:128 @16
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เพิ่มตัวจับเวลาเหตุการณ์: 15:60000:878601635
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http จบคำขอ: -4, "/warehouse/api/messages?" ก:1, ค:2
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http จำนวนคำขอ:2 blk:0
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 คำขอเรียกใช้ http: "/warehouse/api/messages?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ไคลเอนต์ตรวจสอบอัปสตรีม, เขียนเหตุการณ์:1, "/warehouse/api/messages"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http คำขออัพสตรีม: "/warehouse/api/messages?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ตัวจัดการคำขอส่งอัปสตรีม
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http คำขอส่งอัปสตรีม
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http อัปสตรีมส่งเนื้อหาคำขอ
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวเขียนเชน buf fl:1 s:225
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวเขียนเชนใน: 4C4F626384F523C9
2021/08/04 17:43:08 [แก้ปัญหา] nginx_pid#nginx_pid: *1 writev: 225 จาก 225
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวเขียนเชนออก: 0000000000000000
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวจับเวลาเหตุการณ์ del: 15:878601635
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 เพิ่มตัวจับเวลาเหตุการณ์: 15:60000:878601636
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http คำขออัพสตรีม: "/warehouse/api/messages?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ส่วนหัวของกระบวนการอัปสตรีม
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 malloc: 1D36E73206B5EE11:4096
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 recv: eof:1, avail:-1
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 recv: fd:15 444 จาก 4096
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 http สถานะพร็อกซี 404 "ไม่พบ 404"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ส่วนหัวพร็อกซี: "X-Powered-By: Express"
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 ส่วนหัวของพร็อกซี http: "Access-Control-Allow-Origin: *"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http proxy header: "Content-Security-Policy: default-src 'none'"
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 ส่วนหัวของพร็อกซี http: "X-Content-Type-Options: nosniff"
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 ส่วนหัวของพร็อกซี http: "ประเภทเนื้อหา: ข้อความ/html; charset=utf-8"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ส่วนหัวพร็อกซี: "ความยาวเนื้อหา: 168"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http proxy header: "วันที่: พุธ 04 ส.ค. 2021 17:43:08 GMT"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http ส่วนหัวพร็อกซี: "การเชื่อมต่อ: ปิด"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http proxy header เสร็จแล้ว
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 สรุปคำขออัปสตรีม http: 404
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 จบคำขอพร็อกซี http
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ฟรี rr เพียร์ 1 0
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ปิดการเชื่อมต่อต้นทาง http: 15
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ฟรี: A9E50626EC2A1D36, ไม่ได้ใช้: 48
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตัวจับเวลาเหตุการณ์ del: 15:878601636
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 การเชื่อมต่อที่ใช้ซ้ำได้: 0
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 http จบคำขอ: 404, "/warehouse/api/messages?" ก:1, ค:1
2021/08/04 17:43:08 [แก้ไขข้อบกพร่อง] nginx_pid#nginx_pid: *1 http การตอบกลับพิเศษ: 404, "/warehouse/api/messages?"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตำแหน่งทดสอบ: "@400"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตำแหน่งทดสอบ: "@401"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตำแหน่งทดสอบ: "@403"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 ตำแหน่งทดสอบ: "@404"
2021/08/04 17:43:08 [debug] nginx_pid#nginx_pid: *1 โดยใช้ตำแหน่ง: @404 "/warehouse/api/messages?"

มันดูแปลกสำหรับฉันที่ดูเหมือนว่าจะพิจารณา คลังสินค้า เป็นชื่อโฮสต์ ในทางกลับกัน NGINX กำหนดที่อยู่บางแห่งด้วยชื่อนั้น ดังนั้นอาจเกี่ยวข้องกับที่อยู่นั้น

Score:1

ฉันถือว่าคุณเพิ่งตัดทอนกลไกที่เกี่ยวข้องกับพร็อกซีที่จะจัดการในภายหลังในไฟล์ API ของคลังสินค้าของคุณ แต่นั่นไม่ได้ผลตามที่คุณพบ

# API คลังสินค้า
#
ตำแหน่ง /คลังสินค้า/api/ {
    # การกำหนดค่านโยบายที่นี่ (การรับรองความถูกต้อง การจำกัดอัตรา การบันทึก และอื่นๆ...)
    #
    access_log /var/log/nginx/warehouse_api.log หลัก;
    auth_request /_validate_apikey;

    # การกำหนดเส้นทาง URI
    #
    proxy_pass http://คลังสินค้า;

    กลับ 404; #จับทั้งหมด
}

เปรียบเทียบหนึ่งบรรทัดที่รับผิดชอบการกำหนดเส้นทาง URI กับเวอร์ชันในตัวอย่างที่คุณเชื่อมโยง

# API คลังสินค้า
#
ตำแหน่ง /api/warehouse/ {
    # การกำหนดค่านโยบายที่นี่ (การรับรองความถูกต้อง การจำกัดอัตรา การบันทึก และอื่นๆ...)
    #
    access_log /var/log/nginx/warehouse_api.log หลัก;
    auth_request /_validate_apikey;

    # การกำหนดเส้นทาง URI
    #
    สถานที่ /api/คลังสินค้า/สินค้าคงคลัง {
        proxy_pass http://warehouse_inventory;
    }

    สถานที่ /api/โกดัง/ราคา {
        proxy_pass http://warehouse_pricing;
    }

    กลับ 404; #จับทั้งหมด
}

สาเหตุที่ตัวอย่างใช้งานได้ แต่คุณไม่ได้เกี่ยวข้องกับ "ลำดับความสำคัญ" ("ความฉับไว" อาจเป็นคำที่ดีกว่า) ของ กลับ คำสั่ง

ตามเอกสารประกอบที่ กลับ คำสั่งทันทีทำให้ Nginx หยุดการประมวลผลคำขอปัจจุบันและส่งคืนทันที1. นี่หมายถึงของคุณ proxy_pass คำสั่งไม่ได้รับโอกาสแม้แต่จะพยายามดำเนินการ

อย่างไรก็ตาม ในตัวอย่าง มีตำแหน่งที่อิงตามคำนำหน้าซ้อนกันสองตำแหน่งภายในบล็อก ซึ่งหมายความว่า Nginx จะเลือกจับคู่ที่ยาวที่สุด นี่คือสาเหตุที่คำขอตัวอย่างสำเร็จ URI ที่ร้องขอ https://api.example.com/api/warehouse/pricing/item001จับคู่บล็อกตำแหน่งที่ซ้อนกันที่สองจากสองบล็อก ดังนั้นคำขอจึงได้รับพร็อกซีตามที่คาดไว้

โดยสรุป คุณต้องเพิ่มบล็อกตำแหน่งที่ซ้อนกันสำหรับ proxy_pass คำสั่งให้ดำเนินการภายใน หากคุณต้องการทำซ้ำตัวอย่าง มิฉะนั้น ดูเหมือนว่าคุณควรจะลบไฟล์ กลับ คำสั่งและแบ็คเอนด์ต้นน้ำที่กำหนดค่าไว้ของคุณจะสามารถลองทำสิ่งนั้นได้ฟรี

GuiRitter avatar
cn flag
ขอบคุณ! อย่างไรก็ตาม ตอนนี้มันกลับล้มเหลวยิ่งกว่าเดิม ฉันได้อัปเดตโพสต์แรกพร้อมข้อมูลเพิ่มเติมแล้ว
Jose Fernando Lopez Fernandez avatar
ฉันไม่รู้จริงๆ ว่านี่คือต้นตอของปัญหาหรือไม่ แต่ Warehouse API เป็นฟีเจอร์ Plus ใช่ไหม เอาจริงๆ ฉันไม่มีประสบการณ์กับมันเลย ดังนั้นฉันอาจจะผิดก็ได้ แต่ 401 ฟังดูเหมือนเป็นอย่างนั้นใช่ไหม?
GuiRitter avatar
cn flag
ฉันไม่เห็นว่ามันจะเป็นอย่างนั้นได้อย่างไร ตามความเข้าใจของฉัน Warehouse API เป็นเพียงตัวอย่าง โดยที่ "Warehouse" เป็นแอปสมมติที่เข้าถึง API สมมุติ และตัวอย่าง NGINX แสดงวิธีเปิดเผย API นั้น

โพสต์คำตอบ

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