Điểm:0

Sử dụng Nginx proxy pass (proxy ngược) để phục vụ trang web được lưu trữ trên máy chủ Apache với SSL

lá cờ us

Tôi đã tìm kiếm trên các diễn đàn (và các nơi khác trên web) và đã tìm thấy thông tin có liên quan nhưng dường như không giống nhau. Hy vọng rằng tôi không sao chép ở đây.

Tôi có một trang web đang chạy trên máy chủ Apache. Nó đã có chứng chỉ SSL (thông qua LetsEncrypt) và chạy mà không gặp sự cố.

Gần đây tôi đã thiết lập một máy 'phía trước' máy đang chạy Nginx. Máy đó phục vụ ba miền (với một chứng chỉ từ LetsEncrypt).

Tôi muốn chuyển các yêu cầu cho miền trên máy Apache thông qua Nginx nhưng gặp sự cố khi tìm ra các cài đặt phù hợp. Trước đây tôi đã làm điều này với hai máy phục vụ Apache mà không gặp nhiều khó khăn nhưng tôi mới làm quen với Nginx và rõ ràng là chưa đủ thành thạo với nó.

Thiết lập máy chủ ảo mà tôi có trên máy truy cập mạng Nginx (thông qua bộ định tuyến) là:

người phục vụ {
    nghe domain.pointing.to.apache.com:443 ssl;
    server_name domain.pointing.to.apache.com;
    địa điểm / {
        gốc 192.168.11.14/var/www/html/;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass domain.pointing.to.apache.com;
    }
}

Nhưng, tất nhiên, Nginx không thích điều này và sẽ không tải lại sau khi thêm so với. Mọi lời khuyên, v.v. sẽ được đánh giá cao nhất.

Lưu ý - Tôi đoán điều đó là hiển nhiên nhưng 192.168.11.14 nằm sau bộ định tuyến của tôi và không được hiển thị trực tiếp trên mạng.

Jason

Chỉnh sửa/Cập nhật:

Thông tin quan trọng bị thiếu trong yêu cầu ban đầu của tôi:

  1. Máy Nginx đối diện mạng mà tôi muốn đảo ngược proxy sang Apache cũng đang phục vụ ba miền phụ của miền chính mà tôi muốn đảo ngược proxy (sub1.mydomain.com, sub2.mydomain.com, sub3.mydomain.com). Cả ba đều chia sẻ một chứng chỉ SSL từ LetsEncrypt.

  2. Máy chủ Apache trên mạng cục bộ cũng có chứng chỉ do LetsEncrypt cấp đang phục vụ mydomain.com cho đến khi tôi đặt máy Nginx trước nó.

  3. Bây giờ tôi đã xóa chứng chỉ SSL trên máy Apache, xóa máy chủ ảo https và có một máy chủ ảo đơn giản được thiết lập cho cổng 80.

  4. Cài đặt Nginx mặc định của tôi sẽ gửi yêu cầu tới http //www.mydomain.com, trang này hiện chỉ chia sẻ một trang html rất nhàm chán.

  5. Tôi đã cài đặt chứng chỉ SSL cho miền https //www.mydomain.com trên hộp Nginx và muốn sử dụng đề xuất do Tero cung cấp để đảo ngược các yêu cầu https proxy trên mydomain.com đến và từ hộp Apache cục bộ. Như sau:

người phục vụ {

    nghe 443 ssl;
    ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem;
    
    server_name www.mydomain.com;
    địa điểm / {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://192.168.11.14;
    }
}

Vấn đề là tôi đang gặp lỗi 502 Bad Gateway từ máy Nginx...vì vậy tôi đoán là có gì đó không ổn với cài đặt Nginx...Tôi đang tiến gần đến nhưng chưa hoàn toàn ở đó. Ngoài ra, tôi nhận thấy rằng những nỗ lực để truy cập www.mydomain.com không có https không còn phục vụ trang html nhàm chán...chúng được chuyển/viết lại thành https -> www.mydomain.com và đến cùng 502 cổng xấu.

Điểm:2
lá cờ us

Có bốn lỗi trong cấu hình của bạn:

  1. nghe lệnh chỉ chấp nhận địa chỉ IP, nếu bạn muốn liên kết với một giao diện cụ thể. Tuy nhiên, trong thực tế, bạn có thể ràng buộc tốt với tất cả các giao diện, vì vậy nghe 443 ssl Là đủ.

  2. nguồn gốc vị trí chỉ định đường dẫn hệ thống tệp tới các tệp mà nginx được cho là sẽ phục vụ trực tiếp. kể từ khi bạn / vị trí sẽ được ủy quyền ngược lại, chỉ định nguồn gốc hoàn toàn không cần thiết, vì nginx không cung cấp tệp nào. Vì vậy, loại bỏ nguồn gốc chỉ thị.

  3. proxy_pass yêu cầu một URL đến máy chủ ngược dòng. Trong trường hợp này, nó nên được proxy_pass https://192.168.11.4.

  4. Bạn chưa chỉ định chứng chỉ TLS/khóa cá nhân, chúng cần được chỉ định bằng ssl_certificatessl_certificate_key chỉ thị.

Vì vậy, về tổng thể, cấu hình của bạn phải là:

người phục vụ {
    nghe 443 ssl;
    ssl_certificate/đường dẫn/đến/chứng chỉ;
    ssl_certificate_key /path/to/key;
    
    server_name domain.pointing.to.apache.com;
    địa điểm / {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://192.168.11.4;
    }
}

Nếu bạn muốn sử dụng chứng chỉ Letsencrypt trên máy chủ proxy ngược, bạn cần cung cấp /.nổi tiếng thư mục từ máy chủ:

người phục vụ {
    nghe 80;

    vị trí /.well-known {
        try_files $uri =404;
    }

    địa điểm / {
        # Chuyển hướng yêu cầu http sang https
        trả lại 301 https://domain.pointing.to.apache.com;
    }
}

Với cấu hình này, bạn có thể chạy Certbot trên máy chủ proxy ngược, sau đó máy chủ này sẽ xác thực đúng quyền sở hữu miền và nhận chứng chỉ/khóa.

Tuy nhiên, với cấu hình này, bạn không thể chạy Certbot trên máy chủ chạy trên mạng cục bộ. Nếu mạng cục bộ được coi là an toàn, thì tôi khuyên bạn nên sử dụng http thay vì https giữa máy chủ proxy ngược và máy chủ mạng cục bộ.

Nếu https cần thiết giữa máy chủ proxy ngược và máy chủ mạng cục bộ, thì bạn có thể sử dụng cấu hình này:

người phục vụ {
    nghe 80;

    # Cố gắng phục vụ các tệp `.well-known` từ hệ thống tệp cục bộ. Nếu không tìm thấy, hãy gửi đến máy chủ ngược dòng
    vị trí /.well-known {
        try_files $uri @local;
    }

    địa điểm @local {
        proxy_pass http://192.168.11.4;
    }

    địa điểm / {
        trả lại 301 https://domain.pointing.to.apache.com;
    }
}
lá cờ us
Tero, cảm ơn bạn rất nhiều vì sự giúp đỡ. Thật không may, tôi vẫn phải làm điều gì đó không chính xác. Tôi đã chỉnh sửa cài đặt khả dụng của các trang web, đã bật và thử tải lại Nginx nhưng gặp lỗi sau: 'số lượng đối số không hợp lệ trong chỉ thị "ssl_certificate"'. Chứng chỉ SSL có trên máy chủ từ xa (192.168.11.4 trong ví dụ này) không phải là vấn đề...hay không?
lá cờ us
Bạn cần có chứng chỉ trên máy chủ nơi nginx được cài đặt và nhập đường dẫn đến tệp chứng chỉ / khóa trong các lệnh tương ứng.
lá cờ us
Tero, cảm ơn một lần nữa. Tôi sợ rằng đó có thể là trường hợp. Vì vậy, vấn đề của tôi là tôi không chắc rằng mình hiểu cách cài đặt chứng chỉ trên máy quay mặt vào mạng của mình cho một miền sẽ được phục vụ từ phía sau máy quay mặt vào mạng đó. Khi tôi chạy certbot, nó sẽ kiểm tra để đảm bảo rằng tôi (máy và IP của tôi) phản hồi với IP (miền) mà tôi đang cố lấy chứng chỉ nhưng máy đối mặt với mạng của tôi sẽ không phản hồi (tôi không nghĩ vậy) vì nó không không có thiết lập máy chủ ảo để nghe tên miền đó.
lá cờ us
Ngoài ra, tôi có thể có một thiết lập quá phức tạp ở đây, trong đó miền chính của tôi là miền được máy trên mạng cục bộ của tôi phục vụ thông qua một máy khác (chạy Nginx) phục vụ ba miền phụ từ miền đó. (ví dụ: one.mydomain.com, two.mydomain.com và three.mydomain.com nằm trên máy quay mặt ra mạng và domain.com của tôi nằm trên máy phía sau máy quay mặt ra mạng). Tại sao nó được thiết lập theo cách này là một câu chuyện dài... liệu điều tôi đang hướng tới ở đây có khả thi không?
lá cờ us
Tôi đã bổ sung thêm thông tin về cách bạn có thể xử lý các chứng chỉ trên mạng đối mặt với máy chủ proxy ngược.
lá cờ us
Tero, cảm ơn một lần nữa vì sự giúp đỡ và kiên nhẫn của bạn. Tôi cảm thấy như tôi gần như ở đó. Tôi đã xóa chứng chỉ ssl khỏi máy chủ mạng cục bộ, chuyển sang phục vụ trang web trên http (80), sử dụng thông tin cập nhật mà bạn cung cấp cộng với việc tôi cần thêm server_name cho certbot để nhận dạng miền mà tôi muốn có chứng chỉ. Tất cả đều hoạt động tốt nhưng hiện tại tôi đang gặp lỗi 502 bad gateway khi cố gắng truy cập vào miền. Tôi sẽ cập nhật yêu cầu của mình để có định dạng dễ dàng hơn/rõ ràng hơn để hiển thị những gì tôi có hiện tại.
lá cờ us
Xin lưu ý rằng khi máy chủ ngược dòng kết thúc `http`, bạn cần sử dụng `proxy_pass http://192.168.11.4;`. Bạn có `https://192.168.11.4` trong cấu hình của mình.
lá cờ us
Tero - cảm ơn một lần nữa. Vâng, đó là một vấn đề. Xóa 's' giúp tôi vượt qua lỗi 502 và bây giờ tôi đang gặp lỗi "quá nhiều chuyển hướng"...mà tôi nghĩ là do Apache trên máy cục bộ...Tôi cần phải tìm hiểu ngay bây giờ và xem những gì tôi đang làm sai ở bên đó.
lá cờ us
Tero - Cảm ơn rất nhiều vì tất cả sự hỗ trợ và kiên nhẫn của bạn. Lỗi 502 là do một số cài đặt liên quan đến https còn lại trong tệp máy chủ ảo của tôi trên máy Apache. Tôi hoàn toàn bỏ qua chúng ở dưới cùng của tập tin. Loại bỏ mọi thứ và nó hoạt động hoàn hảo. :-) Cần thực hiện một số điều chỉnh nhỏ trên ứng dụng của tôi chạy phía sau proxy ngược (proxy_client_headers) nhưng một khi những điều chỉnh đó đã được thực hiện thì tất cả đều hoạt động như một bùa mê. Cảm ơn một lần nữa vì sự giúp đỡ của bạn. :-)

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