Nginx: Làm cách nào để chuyển tiếp yêu cầu http đến một cổng khác?


65

Những gì tôi muốn làm là,

Khi ai đó truy cập http://localhost/route/abcvào phản hồi của máy chủ giống hệt nhưhttp://localhost:9000/abc

Bây giờ tôi định cấu hình Nginx của mình như thế này:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

Yêu cầu http được gửi cổng 9000chính xác, nhưng đường dẫn mà nó nhận được thì http://localhost:9000/route/abckhông http://localhost:9000/abc.

Bất cứ đề nghị nào ?

Câu trả lời:


65

Tôi ghét sự tinh tế ở đây, nhưng hãy thử thêm một / vào cuối 9000 như bên dưới. Nó sẽ không còn nối "tuyến đường" với yêu cầu chuyển tiếp bây giờ.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}

4
Đây phải là câu trả lời được chấp nhận. Đơn giản chỉ cần thêm /là tài liệu tốt như là cách để loại bỏ tiền tố được liệt kê trong vị trí.
Bernard

40

Tôi tin rằng bạn có thể sử dụng viết lại để xóa phần bổ sung của URL. Trong trường hợp của bạn, tôi nghĩ rằng bạn có thể sử dụng:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Tuy nhiên, nếu ứng dụng của bạn có các liên kết nội bộ trong đó, họ vẫn có thể trỏ đến / abc / foo và nếu bạn làm điều này, họ cần phải trỏ đến / route / abc / foo để yêu cầu thô được gửi chính xác. Bạn có thể nên rời khỏi cấu hình nginx như hiện tại và thay vào đó, định cấu hình ứng dụng của bạn để nhận biết nó tồn tại ở thư mục con, nếu bạn có thể.

Tôi biết đây là một câu hỏi cũ, nhưng nó là thứ tôi thích nhất khi tôi cố gắng giải quyết vấn đề tương tự!


Cảm ơn ! trong liên kết này, chúng tôi có thể xem lại danh sách các biến: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal

17

Hãy thử như sau

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Giải pháp này làm việc tốt nhất cho tôi, vì nó bảo tồn tên máy chủ.
Shafique Jamal

Sạch sẽ và đơn giản.
Rav Sơn Samandarov

7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

Mã này nghe trên 8080 và chuyển hướng đến cổng 8787 trên máy tính-1-36. Bạn có thể chọn đường dẫn khác trong vị trí /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.