Điểm:0

Nginx proxy ngược cho hai ứng dụng web

lá cờ in

Tôi có hai ứng dụng.

  • Ứng dụng Laravel - Là một trang web động. Không có dữ liệu-kiến thức. Tất cả dữ liệu được lấy từ ứng dụng thứ hai sử dụng các yêu cầu AJAX. chạy trên 127.0.0.1:8000.
  • ứng dụng rỉ sét - Một ứng dụng web có chứa tất cả các doanh nghiệp logic và truy cập dữ liệu. chạy trên 127.0.0.1:8080.

Cả hai ứng dụng cần phải được truy cập từ URL ví dụ.com. Đối với điều này, tôi muốn sử dụng Nginx Reverse Proxy. Tôi đã có thể định tuyến lại tất cả các yêu cầu đến Ứng dụng Laravel của mình.

sự kiện {}
http {
    người phục vụ {
        nghe 80;

        # Trang mạng
        địa điểm / {
            proxy_pass http://127.0.0.1:8000;
        }
        
    }
}

Trong khi Ứng dụng Laravel hoạt động, tôi thực sự cần cấu hình Nginx sau:

  • Các trang cụ thể như /Tin tức, /, /xung quanh,/liên hệ,... nên được chuyển hướng đến 127.0.0.1:8000.
  • Lưu ý: Các trang trên có thể chứa các tham số GET như ví dụ: /news?article=abc.
  • TẤT CẢ các yêu cầu khác cần được chuyển hướng đến 127.0.0.1:8080.
  • Lưu ý: 127.0.0.1:8080 thường có thể chứa tên miền phụ. Nhưng tên miền phụ này cần hoạt động như một ký tự đại diện và không xác định tại thời điểm định cấu hình. Ví dụ: kinh doanh1.example.com, kinh doanh2.example.com, businnesX.example.com,...

Tên miền phụ trả về một trang được cá nhân hóa mà số lượng doanh nghiệp không giới hạn có thể yêu cầu trên example.com.

Làm thế nào tôi có thể đạt được cấu hình này? Tôi đã suy nghĩ một cái gì đó như thế này?

#PSEUDO
sự kiện {}
http {
    người phục vụ {
        nghe 80;

        # Trang mạng
        địa điểm / {
            proxy_pass http://127.0.0.1:8000;
        }
        vị trí / tin tức {
            proxy_pass http://127.0.0.1:8000;
        }
        địa điểm/giới thiệu {
            proxy_pass http://127.0.0.1:8000;
        }

        # Đăng kí
        địa điểm * {
            proxy_pass http://127.0.0.1:8080;
        }

    }
}

Chỉnh sửa về câu trả lời của Tero: Tôi cần một loại ký tự đại diện cho tên miền phụ.

 # Ứng dụng bắt tất cả
    địa điểm / {
        proxy_pass http://$subdomain.$application;
    }

abc.example.com cần truy cập abc.127.0.0.1:8080 def.example.com cần truy cập def.127.0.0.1:8080 ...

Tôi biết một IP không thể có tên miền phụ nhưng đừng lo lắng về điều đó. Tôi đã giải quyết điều đó với máy chủ ảo.

Chỉnh sửa 2 - Chuyển tên miền phụ của yêu cầu tới proxy_pass:

người phục vụ {
        nghe 80;
        server_name *.website.com;
        server_name ~^(?<tên miền phụ>.+)\.website\.com$;

        địa điểm / {
            proxy_pass http://$subdomain.vhost.local:8080;
        }
    }

Đây có phải là cách chính xác để chuyển hướng dynamicxxx.website.com sang dynamicxxx.vhost.local:8080 không?

djdomi avatar
lá cờ za
tôi nghĩ bạn phải thay dấu sao bằng dấu ngã
Điểm:2
lá cờ us

Thiết kế của bạn hơi phức tạp và do đó dễ vỡ. Tuy nhiên, bạn có thể thử như sau. Tôi đã thêm Thượng nguồn khối sao cho khác nhau proxy_pass điểm đến dễ đọc hơn.

trang web ngược dòng {
    máy chủ 127.0.0.1:8000;
}

ứng dụng ngược dòng {
    máy chủ 127.0.0.1:8080;
}

người phục vụ {
    server_name example.com *.example.com;

    nghe 80;

    # Ứng dụng bắt tất cả
    địa điểm / {
        proxy_pass http://ứng dụng;
    }

    # Trang mạng
    vị trí = / {
        proxy_pass http://trang web;
    }

    vị trí / tin tức {
        proxy_pass http://trang web;
    }

    địa điểm/giới thiệu {
        proxy_pass http://trang web;
    }
}

Các = ký tự có nghĩa là khớp chính xác trên URI và là ưu tiên hàng đầu trong quy trình tra cứu nginx như được mô tả trong tài liệu nginx

Một cách tiếp cận khác là sử dụng biểu thức chính quy:

người phục vụ {
    server_name example.com *.example.com;

    nghe 80;

    địa điểm / {
        proxy_pass http://ứng dụng;
    }

    vị trí ~ ^(?:/|/tin tức|/về) {
        proxy_pass http://trang web;
    }
}

Các server_name example.com *.example.com yêu cầu nginx xử lý tất cả các yêu cầu đối với tên miền chính và bất kỳ tên miền phụ nào với các quy tắc này.

Nếu quy tắc yêu cầu trang web chỉ cần áp dụng cho ví dụ.com, sau đó bạn cần xác định khác người phục vụ khối với server_name *.example.com và các quy tắc ứng dụng mà thôi.

Chỉnh sửa

Có, tên miền phụ có thể được ghi vào một biến như vậy và được sử dụng trong proxy_pass điểm đến.Bạn cần phải có tất cả các tên miền trong một tên máy chủ dòng:

server_name example.com ~^(?<tên miền phụ>[^.]+)\.example\.com;
O'Niel avatar
lá cờ in
Cảm ơn rất nhiều cho trả lời của bạn! Điều này đang đến gần. Tuy nhiên, Catch-all cho ứng dụng cũng cần xử lý các tên miền phụ. Là một loại ký tự đại diện có thể? Xem bài chỉnh sửa.
lá cờ us
Sau đó, bạn cần thực hiện khối `server` thứ hai cho các miền phụ có `server_name *.example.com`.
O'Niel avatar
lá cờ in
Cảm ơn vì sự giúp đỡ! Giải thích nó rất nhiều. Nếu bạn chỉ có thể xem lại lần chỉnh sửa thứ hai của tôi? Về ký tự đại diện tên miền phụ.
O'Niel avatar
lá cờ in
Tôi thực sự là người bạn đời thân thiết. Chỉ còn lại ký tự đại diện tên miền phụ.
lá cờ us
Tôi đã thêm một ví dụ `server_name`.

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