nginx proxy_pass sử dụng thư mục con


11

ok, nhiệm vụ này đơn giản nhưng tôi không thể làm việc được. Tôi muốn có một thư mục con sau tên miền của tôi (thực ra là sau IP của tên miền đó), nó chuyển hướng đến một cổng cụ thể trên cùng một máy chủ. Về cơ bản, tôi muốn thoát khỏi việc phải sử dụng nhiều cổng.

Đây là cấu hình nginx của tôi cho điều đó

server {
    listen 80;

    index index.html index.htm index.nginx-debian.html index.php;

    server_name aaa.bbb.ccc.ddd;

    location ^~ /app2 {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://aaa.bbb.ccc.ddd:8001;
    }
}

Vì vậy, khi truy cập aaa.bbb.ccc.ddd / app2, tôi muốn giải quyết vấn đề này thành http: //aaa.bbb.ccc.ddd: 8001 .

Điều này có thể lưu ý có thể rất phức tạp. Tôi đang thiếu gì ở đây?

Cảm ơn bạn


Bạn có nghĩa là "chuyển hướng đến một cổng" hoặc "proxy đến một cổng"? Chúng khá khác nhau. Câu hỏi của bạn không rõ ràng, có lẽ bạn có thể mở rộng về trường hợp sử dụng của mình bao gồm cả máy khách.
Tim

Câu trả lời:


12

Vì bạn đã gắn thẻ câu hỏi này dưới dạng câu hỏi proxy ngược, tôi giả sử bạn muốn nói rằng bạn muốn proxy yêu cầu để người dùng chỉ nhìn thấy http://aaa.bbb.ccc.ddd/app2URL trong trình duyệt của cô ấy.

Bạn có thể thay đổi locationkhối của bạn thành này:

location ~/app2(.*)$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://aaa.bbb.ccc.ddd:8001$1;
}

Ở đây chúng ta nắm bắt được phần URI sau /app2để $1thay đổi, và sử dụng nó trong các proxy_passchỉ thị.


Cảm ơn bạn. Đó là một mẹo nhỏ. aaa.bbb.ccc.ddd: 8001 chỉ được hiển thị một phần. Có websockets trên trang đó và rất nhiều tập lệnh java. Tôi đoán đó là vì tôi ủy quyền cổng và không chuyển tiếp nó như Tim đã đề cập ở trên. Điều này thực sự có thể đạt được chỉ bằng cách sử dụng nginx?
pAt84

Các URL của tài nguyên trông như thế nào trên aaa.bbb.ccc.ddd:8001trang? Nhiều khả năng bạn cần sửa các URL để chứa /app2phần đó.
Tero Kilkanen

Nó thực sự chỉ là một websocket ở đó (hiển thị một số dữ liệu radar, ô tô ...). Không có dấu hiệu của "app2" trong mã nguồn.
pAt84

Hừm, vâng. Để gọi websocket, JS sử dụng "var ws = new WebSocket ('ws: //' + location.host + '/ ws');". location.host hiện bỏ lỡ số cổng, điều này làm cho toàn bộ hoạt động không còn hoạt động nữa.
pAt84

Ok, có vẻ như một khi tôi gọi aaa.bbb.ccc.ddd / app2 tôi yêu cầu nó phải sử dụng nội bộ aaa.bbb.ccc.ddd: 8001. Một tùy chọn khác là thay đổi tất cả các tập lệnh java. Lý do là tôi muốn sử dụng nginx để cung cấp cho tôi "giải pháp một cổng" nhưng sau khi tôi đã truy cập (ví dụ: qua http // aaa.bbb.ccc.ddd / app2), trong nội bộ, tôi sẽ cần nó đi trở lại aaa.bbb.ccc.ddd: 8001. Điều đó có thể không?
pAt84
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.