Điểm:0

proxy ngược nginx không hoạt động khi nhiều cổng được xác định cho REST api

lá cờ bd

Tôi có một ứng dụng js tiếp theo mà tôi đã triển khai trên cổng 3000 và đặt proxy 3000 trên nginx.

Bây giờ tôi có máy chủ phụ trợ Node js tùy chỉnh mà tôi muốn chạy trên cùng một máy chủ trên cổng 5000 khác nhau.

Tôi thiết lập nginx như thế này

địa điểm / {
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Nâng cấp $http_upgrade;
        'nâng cấp' kết nối proxy_set_header;
        proxy_set_header Máy chủ lưu trữ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:3000;
    }
vị trí ^~ /api {
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Nâng cấp $http_upgrade;
        'nâng cấp' kết nối proxy_set_header;
        proxy_set_header Máy chủ lưu trữ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:5000;
            
        }

Tôi không gặp vấn đề gì khi truy cập ứng dụng trên example.com. Tôi thiết lập vị trí /api để kết nối tìm nạp server.js /api.

khi tôi tìm nạp như thế này

axios.get(example.com/api)

lỗi trả về của nó -- Cannot GET /api/

nhưng khi tôi đặt proxy vị trí nginx như thế này

proxy_pass http://localhost:5000/;

với một dấu gạch chéo về phía trước, nó đang hoạt động và các axios đang tìm nạp dữ liệu thành công.

Nhưng bất cứ khi nào tôi đang cố tìm nạp một tuyến đường khác từ tệp server.js như

axios.get(example.com/api/credential)

Nó lại hiện lỗi như thế này

Không thể NHẬN // thông tin xác thực

Quay lại với dấu gạch chéo kép // thông tin xác thực

tuyến '/' duy nhất hoạt động từ server.js bằng cách tìm nạp example.com/api

không có dấu gạch chéo về phía trước trên proxy, lỗi trả về của nó. không thể NHẬN/api hoặc không thể NHẬN api/thông tin xác thực

Hãy giúp tôi. Cảm ơn trước.

Cập nhật

tôi đã sửa với của Ivan câu trả lời. Bây giờ tôi có vấn đề mới với cấu hình đó. Tôi đang sử dụng socket.io bên cạnh axios. Vì vậy, bất cứ khi nào tôi cố gắng kết nối qua socket.io mã ổ cắm máy khách của tôi là ..

nhập io từ "socket.io-client";
const socket = io("https://example.com/api");

và cấu hình ổ cắm máy chủ là ..

const io = require("socket.io")(máy chủ, {
  bạn: {
    nguồn gốc: "*",
  },
});

Bây giờ khi tải trang, bảng điều khiển đang ghi nhật ký..

NHẬN https://example.com/socket.io?EIO=4&transport=polling&t=O4UTf4l 404 (Không tìm thấy)

Hãy giúp tôi.

Điểm:0
lá cờ gr

Nói chung, bạn nên luôn luôn thích

vị trí /tiền tố/ {
    ...
}

qua

vị trí/tiền tố {
    ...
}

trừ khi bạn đang ủy quyền một điểm cuối API duy nhất thay vì toàn bộ API (hoặc một ứng dụng web khác). Khi bạn sử dụng tiền tố URI với proxy_pass chỉ thị (nghĩa là proxy_pass http://localhost:5000/; còn hơn là proxy_pass http://localhost:5000;, dấu gạch chéo ở cuối được tính là tiền tố URI ở đây), nginx sẽ loại bỏ tiền tố được chỉ định trong địa điểm chỉ thị từ URI yêu cầu của bạn và thêm tiền tố vào trước được chỉ định trong proxy_pass. Sử dụng

vị trí ^~ /api/ {
    ...
    proxy_pass http://localhost:5000/;
}

và của bạn /api/thông tin đăng nhập URI yêu cầu sẽ được chuyển chính xác tới thượng nguồn của bạn dưới dạng /chứng chỉ.

Irfan Habib avatar
lá cờ bd
Chào Ivan. Cảm ơn câu trả lời của bạn. Tôi đã giúp tôi và bạn đã cứu ngày của tôi. Bây giờ tôi có vấn đề mới với socket.io. Vui lòng xem câu hỏi được cập nhật.
Ivan Shatsky avatar
lá cờ gr
Tôi nghĩ bạn nên sử dụng một số tiền tố khác cho giao tiếp websocket, ví dụ: `/ws` thay vì kết hợp nó với lệnh gọi `/api`. Bạn cũng nên ủy quyền các kết nối WebSocket theo [cách đặc biệt](http://nginx.org/en/docs/http/websocket.html), tuy nhiên bạn đã thực hiện việc đó trong cấu hình của mình. Thật không may, `socket.io` không phải là lĩnh vực tôi có thẩm quyền, hãy xem xét việc đặt câu hỏi này như một câu hỏi riêng biệt, có thể StackOverflow sẽ là một trang web thích hợp hơn để thực hiện điều đó.

Đă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.