Điểm:0

Thiết lập NGINX cho API REST trả về cấu hình mặc định

lá cờ cn

Tôi có thuê một VPS để chơi với một số dự án cá nhân. Để bắt đầu, tôi đang cố gắng thiết lập nó để lưu trữ API REST bằng Node.js, vì tôi chỉ mới sử dụng Spring Boot cho việc đó.

Tôi đã triển khai các giải pháp bằng cách điều chỉnh từ các hướng dẫn sau:

https://www.robinwieruch.de/node-express-server-rest-api (hầu hết mã API trông như thế này)

https://itnext.io/building-restful-api-with-node-js-express-js-and-postgresql-the-right-way-b2e718ad1c66 (nhưng tôi đang dần chuyển đổi để sử dụng các tiêu chuẩn từ đây)

Để triển khai thực tế, tôi đã thay đổi gói API với Babel và tôi đang triển khai nó với PM2.

https://www.nginx.com/blog/deploying-nginx-plus-as-an-api-gateway-part-1/ (không phải Plus mặc dù)

(Tất cả những liên kết có sẵn thông qua http://web.archive.org/ vì vậy họ sẽ không đi đâu cả sớm)

Tôi đã tạo một dự án Node.js khác bằng cách sử dụng trục để kiểm tra các yêu cầu REST. Chạy nó trong cùng một VPS hoạt động, nhưng tôi phải thay đổi mã API để liên kết với máy chủ cục bộ. Trước đây, với địa chỉ liên kết không được chỉ định, nó được liên kết với IPv6 máy chủ cục bộ (nếu tôi hiểu đúng) và vì miền của tôi không hoạt động với IPv6 nên tôi sẽ gắn bó với IPv4.

Về phía NGINX, tôi đã thực hiện nhiều thay đổi nhất vì hiện tại tôi chỉ có 1 API và tôi sẽ không sử dụng cân bằng tải. Ngoài ra, tôi đã thay đổi chính sách đặt tên. tôi sẽ sử dụng example.com/app_or_project_name/api_or_web_or_other_kind_of_interface/project_specific_routes.

Đây là cách thiết lập NGINX của tôi trông như thế nào. Tôi đã ẩn danh nó và thay đổi để sử dụng cùng tên với ví dụ NGINX:

api_backends.conf

kho thượng lưu {
    vùng api 64k;
    máy chủ 127.0.0.1: some_port_number;
}

Đó là số cổng và máy chủ API REST.

api_conf.d/warehouse_api.conf

# Kho API
#
địa điểm /kho/api/ {
    # Cấu hình chính sách tại đây (xác thực, giới hạn tốc độ, ghi nhật ký, v.v.)
    #
    truy cập_log /var/log/nginx/warehouse_api.log chính;
    auth_request /_validate_apikey;

    # định tuyến URI
    #
    proxy_pass http://kho;

    trả lại 404; # Bắt hết
}

api_gateway.conf

bao gồm api_backends.conf;
bao gồm api_keys.conf;

người phục vụ {
    access_log /var/log/nginx/api_access.log chính; # Mỗi API cũng có thể đăng nhập vào một tệp riêng

    nghe 443 ssl;
    server_name my-domain.net;

    # Cấu hình TLS
    ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem; # được quản lý bởi Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem; # được quản lý bởi Certbot
    ssl_session_cache được chia sẻ:SSL:10m;
    ssl_session_timeout 5 phút;
    ssl_ciphers CAO:!aNULL:!MD5;
    ssl_protocols TLSv1.2 TLSv1.3;

    # Định nghĩa API, mỗi định nghĩa một tệp
    bao gồm api_conf.d/*.conf;

    # Phản hồi lỗi
    # lỗi_trang 404 = @400; # Đường dẫn không hợp lệ được coi là yêu cầu không hợp lệ
    bật proxy_intercept_errors; # Không gửi lỗi phụ trợ cho khách hàng
    bao gồm api_json_errors.conf; # Phản hồi lỗi JSON thân thiện với ứng dụng khách API
    ứng dụng default_type/json; # Nếu không có kiểu nội dung thì giả sử JSON

    # Xác thực khóa API
    vị trí = /_validate_apikey {
        nội bộ;

        nếu ($http_apikey = "") {
            trả lại 401; # Không được phép
        }
        nếu ($api_client_name = "") {
            trả lại 403; # Cấm
        }

        trả lại 204; # OK (không có nội dung)
    }

}

tôi có thể thiết lập proxy_intercept_errors đến tắt một khi nó hoạt động. Tôi sẽ phải thực hiện một số thử nghiệm để xem những gì thay đổi trong các câu trả lời.

api_json_errors.conf

Tương tự như ví dụ.

mặc định.conf

người phục vụ {
    server_name www.my-domain.net;

    #access_log /var/log/nginx/host.access.log chính;

    địa điểm / {
        gốc /usr/share/nginx/html;
        chỉ mục index.html index.htm;
    }

    #lỗi_trang 404 /404.html;

    # chuyển hướng trang lỗi máy chủ sang trang tĩnh /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    vị trí = /50x.html {
        gốc /usr/share/nginx/html;
    }

    # ủy quyền tập lệnh PHP để nghe Apache trên 127.0.0.1:80
    #
    #vị trí ~ \.php$ {
    # proxy_pass http://127.0.0.1;
    #}

    # chuyển tập lệnh PHP tới máy chủ FastCGI đang nghe trên 127.0.0.1:9000
    #
    #vị trí ~ \.php$ {
    # html gốc;
    # fastcgi_pass 127.0.0.1:9000;
    # fastcgi_index index.php;
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # bao gồm fastcgi_params;
    #}

    # từ chối quyền truy cập vào tệp .htaccess, nếu tài liệu gốc của Apache
    # đồng tình với nginx
    #
    #vị trí ~ /\.ht {
    #    Phủ nhận tất cả;
    #}

    nghe 443 ssl; # được quản lý bởi Certbot
    ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem; # được quản lý bởi Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem; # được quản lý bởi Certbot
    bao gồm /etc/letsencrypt/options-ssl-nginx.conf; # được quản lý bởi Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # được quản lý bởi Certbot

}

người phục vụ {
    nếu ($host = www.my-domain.net) {
        trả lại 301 https://$host$request_uri;
    } # được quản lý bởi Certbot

    nếu ($host = my-domain.net) {
        trả lại 301 https://$host$request_uri;
    } # được quản lý bởi Certbot

    nghe 80;
    server_name my-domain.net www.my-domain.net;
    trả lại 404; # được quản lý bởi Certbot

}

Tôi đã phải thực hiện một số thay đổi ở đây vì có sự kết hợp giữa địa chỉ và cổng bị trùng lặp người phục vụ cấu hình.

nginx.conf

người dùng nginx;
worker_processes tự động;

error_log /var/log/nginx/error.log thông tin;
pid /var/run/nginx.pid;

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

sự kiện {
    công_nhân kết_nối 1024 ;
}

http {
    bao gồm /etc/nginx/mime.types;
    ứng dụng default_type/octet-stream;

    log_format chính '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log chính;

    gửi tệp trên;
    #tcp_nopush bật;

    keepalive_timeout 65;

    bao gồm /etc/nginx/api_gateway.conf; # Tất cả cấu hình cổng API
    bao gồm /etc/nginx/conf.d/*.conf; # Lưu lượng truy cập web thường xuyên
}

Khi tôi chạy dự án thử nghiệm tương tự bên ngoài VPS, tôi nhận được kết quả như sau:

{
  thông báo: 'Yêu cầu không thành công với mã trạng thái 404',
  tên: 'Lỗi',
  mô tả: không xác định,
  số: không xác định,
  tên tệp: không xác định,
  số dòng: không xác định,
  số cột: không xác định,
  cây rơm: '...',
  cấu hình: {
    url: 'https://my-domain.net/warehouse/api/messages',
    phương pháp: 'lấy',
    tiêu đề: {
      Chấp nhận: 'application/json, text/plain, */*',
      'Kiểm soát truy cập-Cho phép-Xuất xứ': '*',
      'Tác nhân người dùng': 'axios/0.21.1'
    },
    TransformRequest: [ [Chức năng: TransformRequest] ],
    TransformResponse: [ [Chức năng: TransformResponse] ],
    thời gian chờ: 0,
    bộ điều hợp: [Chức năng: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    chiều dài cơ thể tối đa: -1,
    xác thựcStatus: [Chức năng: xác thựcStatus],
    Mã API: '...',
    dữ liệu: không xác định
  },
  mã: không xác định
}

Một điều tôi đã tìm ra là lỗi 404 được trả về bởi kho_api.conf bởi vì, nếu tôi thay đổi trả lại 404; sang một mã khác, đó là mã tôi sẽ nhận được.

Tôi đã kích hoạt tính năng gỡ lỗi trong NGINX nhưng tôi không thể hiểu đầu ra, ngay cả sau khi tìm kiếm một chút:

22/07/2021 11:54:17 [gỡ lỗi] nginx_pid#nginx_pid: *757 sử dụng vị trí: @404 "/warehouse/api/messages?"
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 http cl:-1 max:1048576
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 giai đoạn viết lại: 3
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 http hoàn tất yêu cầu: 404, "/warehouse/api/messages?" a:1, c:1
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 http phản hồi đặc biệt: 404, "/warehouse/api/messages?"
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 vị trí thử nghiệm: "@400"
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 vị trí thử nghiệm: "@401"
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 vị trí thử nghiệm: "@403"
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 vị trí thử nghiệm: "@404"
22/07/2021 11:54:31 [gỡ lỗi] nginx_pid#nginx_pid: *758 sử dụng vị trí: @404 "/warehouse/api/messages?"

Tôi đã thử một vài cách tiếp cận khác nhau để tìm kiếm về tất cả những điều này nhưng không thể tìm thấy bất kỳ đầu mối nào.

Vì vậy, những gì đang xảy ra, những gì sai và làm thế nào để tôi khắc phục nó?

Cảm ơn trước.

Cập nhật 2021-08-04

Theo câu trả lời của @ jose-fernando-lopez-fernandez, tôi đã thay đổi api_conf.d/warehouse_api.conf theo sau:

# Kho API
#
địa điểm /kho/api/ {
    # Cấu hình chính sách tại đây (xác thực, giới hạn tốc độ, ghi nhật ký, v.v.)
    #
    truy cập_log /var/log/nginx/warehouse_api.log chính;
    auth_request /_validate_apikey;

    # định tuyến URI
    #
    địa điểm /kho/api/ {
        proxy_pass http://kho;
    }

    trả lại 404; # Bắt hết
}

để giữ cho nó phù hợp với các ví dụ mà tôi đang theo dõi. Tôi đã kiểm tra lại và thay vào đó gặp lỗi 401. Tôi đã kiểm tra và tôi đã vượt qua Mã API không chính xác.

Tôi đã sửa nó, kiểm tra lại và nhận được 404 một lần nữa. Nhưng bây giờ tôi đang nhận được nhiều đầu ra hơn từ gỡ lỗi nginx.

Tôi đã ẩn danh nó. tôi đã thay thế Mã API bởi một cái khác tôi đã tạo và sẽ không được sử dụng cho bất cứ điều gì.

Tôi cũng đã thay thế posix_memalign, thêm dọn dẹp http, miễn phí, chuỗi nhà văn trongmalloc bởi các chuỗi có cùng độ dài với các byte ngẫu nhiên.Tôi không biết có nên ẩn danh hay không. Nếu cần thiết cho giải pháp của câu hỏi này, vui lòng hỏi và tôi sẽ thêm lại chúng trên cơ sở cần biết.

Đây đi:

04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http cl:-1 max:1048576
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn viết lại: 3
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn viết lại bài đăng: 4
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn chung: 5
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn chung: 6
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn chung: 7
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn truy cập: 8
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn truy cập: 9
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn truy cập: 10
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 trình xử lý yêu cầu xác thực
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 yêu cầu phụ http "/_validate_apikey?"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http đã đăng yêu cầu: "/_validate_apikey?"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn viết lại: 1
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 vị trí thử nghiệm: "/warehouse/api/"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 vị trí thử nghiệm: "/_validate_apikey"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 sử dụng cấu hình "=/_validate_apikey"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http cl:-1 max:1048576
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn viết lại: 3
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http var
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http var: "o6ZlKSX24MCY/uPwCRl80WAS"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giá trị tập lệnh http: ""
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http bằng nhau
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http bằng nhau: không
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http nếu
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http nếu: sai
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http var
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 bản đồ http bắt đầu
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http var: "o6ZlKSX24MCY/uPwCRl80WAS"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 bản đồ http: "o6ZlKSX24MCY/uPwCRl80WAS" "client_one"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http var: "client_one"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giá trị tập lệnh http: ""
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http bằng nhau
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http bằng nhau: không
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http nếu
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http nếu: sai
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http hoàn tất yêu cầu: 0, "/_validate_apikey?" a:1, c:2
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 yêu cầu xác thực được thực hiện s:204
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http đánh thức yêu cầu gốc: "/warehouse/api/messages?"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http đã đăng yêu cầu: "/warehouse/api/messages?"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn truy cập: 10
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 trình xử lý yêu cầu xác thực
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 yêu cầu xác thực đặt biến
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn truy cập bài đăng: 11
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn chung: 12
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 giai đoạn chung: 13
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 posix_memalign: 218512C89A2ED401:4096 @16
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http init ngược dòng, bộ hẹn giờ máy khách: 0
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 epoll thêm sự kiện: fd:3 op:3 ev:80002005
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Bản sao tập lệnh http: "Máy chủ"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tập lệnh http var: "kho"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Bản sao tập lệnh http: "Kết nối"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Bản sao tập lệnh http: "đóng"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Bản sao tập lệnh http: ""
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Bản sao tập lệnh http: ""
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Chấp nhận: application/json, text/plain, */*"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Kiểm soát truy cập-Cho phép-Xuất xứ: *"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tiêu đề proxy http: "apikey: o6ZlKSX24MCY/uPwCRl80WAS"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Tác nhân người dùng: axios/0.21.1"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tiêu đề proxy http:
"NHẬN/kho/api/tin nhắn HTTP/1.0
Máy chủ: nhà kho
Kết nối: đóng
Chấp nhận: ứng dụng/json, văn bản/đơn giản, */*
Kiểm soát truy cập-Cho phép-Xuất xứ: *
apikey: o6ZlKSX24MCY/uPwCRl80WAS
Tác nhân người dùng: axios/0.21.1

"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 thêm dọn dẹp http: 90C9DA232086B6FA
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 lấy rr ngang hàng, thử: 1
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 ổ cắm luồng 15
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 epoll thêm kết nối: fd:15 ev:80002005
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 kết nối với 127.0.0.1:some_port_number, fd:15 #2
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http kết nối ngược dòng: -2
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 posix_memalign: A9E50626EC2A1D36:128 @16
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 bộ hẹn giờ sự kiện thêm: 15: 60000:878601635
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 yêu cầu hoàn tất http: -4, "/warehouse/api/messages?" a:1, c:2
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 số lượng yêu cầu http:2 blk:0
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 yêu cầu chạy http: "/warehouse/api/messages?"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http client kiểm tra ngược dòng, viết sự kiện:1, "/warehouse/api/messages"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http yêu cầu ngược dòng: "/warehouse/api/messages?"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 trình xử lý yêu cầu gửi ngược dòng http
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http ngược dòng gửi yêu cầu
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http ngược dòng gửi nội dung yêu cầu
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 trình ghi chuỗi buf fl:1 s:225
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 trình ghi chuỗi trong: 4C4F626384F523C9
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 writev: 225 trên 225
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 trình ghi chuỗi ra: 0000000000000000
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 bộ đếm thời gian sự kiện del: 15: 878601635
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 bộ hẹn giờ sự kiện thêm: 15: 60000:878601636
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http yêu cầu ngược dòng: "/warehouse/api/messages?"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tiêu đề quy trình ngược dòng http
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 malloc: 1D36E73206B5EE11:4096
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 recv: eof:1, avail:-1
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 recv: fd:15 444 trên 4096
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Trạng thái proxy http 404 "Không tìm thấy 404"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tiêu đề proxy http: "X-Powered-By: Express"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Kiểm soát truy cập-Cho phép-Xuất xứ: *"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Chính sách bảo mật-nội dung: default-src 'none'"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 tiêu đề proxy http: "X-Content-Type-Options: nosniff"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Loại nội dung: văn bản/html; bộ ký tự=utf-8"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Độ dài nội dung: 168"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Ngày: Thứ tư, 04 tháng 8 năm 2021 17:43:08 GMT"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 Tiêu đề proxy http: "Kết nối: đóng"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 đã hoàn thành tiêu đề proxy http
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 hoàn thiện yêu cầu ngược dòng http: 404
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 hoàn tất yêu cầu proxy http
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 rr miễn phí ngang hàng 1 0
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 đóng kết nối thượng nguồn http: 15
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 miễn phí: A9E50626EC2A1D36, chưa sử dụng: 48
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 bộ đếm thời gian sự kiện del: 15: 878601636
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 kết nối tái sử dụng: 0
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http hoàn tất yêu cầu: 404, "/warehouse/api/messages?" a:1, c:1
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 http phản hồi đặc biệt: 404, "/warehouse/api/messages?"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 vị trí thử nghiệm: "@400"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 vị trí thử nghiệm: "@401"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 vị trí thử nghiệm: "@403"
04/08/2021 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 vị trí thử nghiệm: "@404"
2021/08/04 17:43:08 [gỡ lỗi] nginx_pid#nginx_pid: *1 sử dụng vị trí: @404 "/warehouse/api/messages?"

Nó có vẻ kỳ lạ với tôi rằng nó dường như đang xem xét Kho như một tên máy chủ. Mặt khác, NGINX xác định một số địa chỉ có tên đó nên có thể liên quan đến địa chỉ đó.

Điểm:1
lá cờ sz

Tôi cho rằng bạn vừa loại bỏ các âm mưu liên quan đến proxy sẽ được xử lý sau trong tệp API kho của mình, nhưng điều đó thực sự sẽ không hoạt động, như bạn đã phát hiện ra.

# Kho API
#
địa điểm /kho/api/ {
    # Cấu hình chính sách tại đây (xác thực, giới hạn tốc độ, ghi nhật ký, v.v.)
    #
    truy cập_log /var/log/nginx/warehouse_api.log chính;
    auth_request /_validate_apikey;

    # định tuyến URI
    #
    proxy_pass http://kho;

    trả lại 404; # Bắt hết
}

So sánh một dòng phụ trách định tuyến URI với phiên bản trong ví dụ bạn đã liên kết.

# Kho API
#
địa điểm /api/kho/ {
    # Cấu hình chính sách tại đây (xác thực, giới hạn tốc độ, ghi nhật ký, v.v.)
    #
    truy cập_log /var/log/nginx/warehouse_api.log chính;
    auth_request /_validate_apikey;

    # định tuyến URI
    #
    địa điểm /api/kho/kho {
        proxy_pass http://warehouse_inventory;
    }

    vị trí /api/kho/giá {
        proxy_pass http://warehouse_pricing;
    }

    trả lại 404; # Bắt hết
}

Lý do tại sao ví dụ này hoạt động nhưng ví dụ của bạn không liên quan đến "ưu tiên" ("ngay lập tức" có thể là một thuật ngữ tốt hơn) của trở lại chỉ thị.

Theo các tài liệu, các trở lại lệnh ngay lập tức khiến Nginx ngừng xử lý yêu cầu hiện tại và quay lại ngay lập tức1. Điều này có nghĩa là của bạn proxy_pass chỉ thị thậm chí không có cơ hội để cố gắng thực thi.

Tuy nhiên, trong ví dụ này, có hai vị trí dựa trên tiền tố lồng nhau trong khối, điều đó có nghĩa là Nginx sẽ chọn đối sánh dài nhất. Đây là lý do tại sao yêu cầu ví dụ thành công; URI được yêu cầu, https://api.example.com/api/warehouse/pricing/item001, khớp với khối thứ hai trong số hai khối vị trí lồng nhau và do đó, yêu cầu đã được ủy quyền như mong đợi.

Tóm lại, bạn cần thêm một khối vị trí lồng nhau cho proxy_pass chỉ thị để thực thi bên trong, nếu bạn muốn sao chép ví dụ. Nếu không, có vẻ như bạn có thể chỉ cần xóa trở lại chỉ thị và chương trình phụ trợ ngược dòng được định cấu hình của bạn sẽ được tự do cố gắng thực hiện công việc của mình.

GuiRitter avatar
lá cờ cn
Cảm ơn! Tuy nhiên, bây giờ nó không thành công hơn nữa. Tôi đã cập nhật bài viết đầu tiên với nhiều thông tin hơn.
Jose Fernando Lopez Fernandez avatar
lá cờ sz
Tôi thực sự không biết liệu đây có phải là nguồn gốc của vấn đề hay không, nhưng API Kho là một tính năng Plus phải không? Thành thật mà nói, tôi không có kinh nghiệm với nó, vì vậy tôi có thể sai, nhưng 401 nghe có vẻ như vậy, phải không?
GuiRitter avatar
lá cờ cn
Tôi không thấy làm thế nào mà có thể là trường hợp. Theo hiểu biết của tôi, API Kho hàng chỉ là một ví dụ, trong đó "Nhà kho" là một ứng dụng giả định truy cập API giả định và ví dụ NGINX cho biết cách hiển thị API đó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.