Score:0

ใช้ Nginx proxy pass (reverse proxy) เพื่อให้บริการไซต์ที่โฮสต์ Apache ด้วย SSL

ธง us

ฉันได้ค้นหาฟอรัม (และที่อื่น ๆ บนเว็บ) และพบข้อมูลที่เกี่ยวข้องแต่ดูเหมือนจะไม่เหมือนกัน หวังว่าฉันจะไม่ทำซ้ำที่นี่

ฉันมีไซต์ที่ทำงานบนเซิร์ฟเวอร์ Apache มีใบรับรอง SSL แล้ว (ผ่าน LetsEncrypt) และทำงานโดยไม่มีปัญหา

ฉันเพิ่งตั้งค่าเครื่อง 'ด้านหน้า' ของเครื่องที่ใช้ Nginx เครื่องนั้นให้บริการสามโดเมน (พร้อมหนึ่งใบรับรองจาก LetsEncrypt)

ฉันต้องการส่งคำขอโดเมนบนเครื่อง Apache ผ่าน Nginx แต่มีปัญหาในการหาการตั้งค่าที่เหมาะสม ฉันเคยทำสิ่งนี้กับเครื่องที่ให้บริการ Apache สองเครื่องในอดีตโดยไม่มีปัญหามากนัก แต่ฉันยังใหม่กับ Nginx และเห็นได้ชัดว่ายังไม่เชี่ยวชาญเพียงพอ

การตั้งค่าเซิร์ฟเวอร์เสมือนที่ฉันมีในเครื่อง Nginx net (ผ่านเราเตอร์) คือ:

เซิร์ฟเวอร์ {
    ฟังโดเมน pointing.to.apache.com:443 ssl;
    server_name โดเมน pointing.to.apache.com;
    ที่ตั้ง / {
        รูท 192.168.11.14/var/www/html/;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-ส่งต่อเซิร์ฟเวอร์ $host;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_pass โดเมน pointing.to.apache.com;
    }
}

แต่แน่นอนว่า Nginx ไม่ชอบสิ่งนี้และจะไม่โหลดซ้ำหลังจากเพิ่ม vs. คำแนะนำใด ๆ ฯลฯ จะได้รับการชื่นชมมากที่สุด

หมายเหตุ - ฉันคิดว่ามันชัดเจน แต่ 192.168.11.14 อยู่หลังเราเตอร์ของฉันและไม่ได้เปิดเผยโดยตรงกับเน็ต

เจสัน

แก้ไข/ปรับปรุง:

ข้อมูลสำคัญที่ขาดหายไปจากคำถามเดิมของฉัน:

  1. เครื่อง Nginx ที่หันเข้าหาเน็ตซึ่งฉันต้องการย้อนกลับพร็อกซีไปยัง Apache ยังให้บริการโดเมนย่อยสามโดเมนของโดเมนหลักของฉันที่ฉันต้องการย้อนกลับพร็อกซี (sub1.mydomain.com, sub2.mydomain.com, sub3.mydomain.com) ทั้งสามใช้ใบรับรอง SSL เดียวจาก LetsEncrypt

  2. เซิร์ฟเวอร์ Apache บนเครือข่ายท้องถิ่นมีใบรับรองที่ออกโดย LetsEncrypt และให้บริการ mydomain.com จนกว่าฉันจะวางเครื่อง Nginx ไว้ข้างหน้า

  3. ตอนนี้ฉันได้ลบใบรับรอง SSL บนเครื่อง Apache ลบเซิร์ฟเวอร์เสมือน https และตั้งค่าเซิร์ฟเวอร์เสมือนอย่างง่ายสำหรับพอร์ต 80

  4. การตั้งค่าเริ่มต้น Nginx ของฉันส่งคำขอไปที่ http //www.mydomain.com ซึ่งเพียงแค่แบ่งปันหน้า html ที่น่าเบื่อมากในตอนนี้

  5. ฉันได้ติดตั้งใบรับรอง SSL สำหรับโดเมน https //www.mydomain.com บนกล่อง Nginx แล้ว และต้องการใช้คำแนะนำที่ Tero ให้ไว้เพื่อย้อนกลับคำขอ https ของพร็อกซีบน mydomain.com ไปและกลับจากกล่อง Apache ในเครื่อง ดังต่อไปนี้:

เซิร์ฟเวอร์ {

    ฟัง 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;
    ที่ตั้ง / {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-ส่งต่อเซิร์ฟเวอร์ $host;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_pass https://192.168.11.14;
    }
}

ปัญหาคือฉันได้รับข้อผิดพลาด 502 Bad Gateway จากเครื่อง Nginx... ฉันเดาว่าฉันมีบางอย่างผิดปกติกับการตั้งค่า Nginx... ฉันใกล้จะถึงแล้ว แต่ยังไม่ถึงตรงนั้น นอกจากนี้ ฉันสังเกตเห็นว่าความพยายามในการเข้าถึง www.mydomain.com หากไม่มี https จะไม่ให้บริการหน้า html ที่น่าเบื่ออีกต่อไป...พวกเขาจะถูกโอน/เขียนใหม่ไปที่ https -> www.mydomain.com และไปยังเกตเวย์ที่ไม่ถูกต้อง 502 อันเดียวกัน

Score:2
ธง us

มีข้อผิดพลาดสี่ประการในการกำหนดค่าของคุณ:

  1. ฟัง คำสั่งยอมรับเฉพาะที่อยู่ IP หากคุณต้องการผูกกับอินเทอร์เฟซเฉพาะ อย่างไรก็ตาม ในทางปฏิบัติ คุณจะผูกพันกับอินเทอร์เฟซทั้งหมดได้ดี ดังนั้น ฟัง 443 ssl ก็เพียงพอแล้ว

  2. ราก ตำแหน่งระบุเส้นทางระบบไฟล์ไปยังไฟล์ที่ nginx ควรให้บริการโดยตรง ตั้งแต่ของคุณ / ตำแหน่งจะถูกพร็อกซีย้อนกลับ ระบุ ราก ไม่จำเป็นเลยเนื่องจาก nginx ไม่มีไฟล์ให้บริการ งั้นเอาออก ราก คำสั่ง

  3. proxy_pass ต้องการ URL ไปยังเซิร์ฟเวอร์อัปสตรีม ในกรณีนี้ควรเป็น proxy_pass https://192.168.11.4.

  4. คุณไม่ได้ระบุใบรับรอง TLS / คีย์ส่วนตัว จำเป็นต้องระบุด้วย ssl_certificate และ ssl_certificate_key คำสั่ง

ดังนั้น โดยรวมแล้ว การกำหนดค่าของคุณควรเป็น:

เซิร์ฟเวอร์ {
    ฟัง 443 ssl;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/key;
    
    server_name โดเมน pointing.to.apache.com;
    ที่ตั้ง / {
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-ส่งต่อเซิร์ฟเวอร์ $host;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_pass https://192.168.11.4;
    }
}

หากคุณต้องการใช้ใบรับรอง Letsencrypt บนพร็อกซีเซิร์ฟเวอร์ย้อนกลับ คุณต้องให้บริการ /.มีชื่อเสียง ไดเรกทอรีจากเซิร์ฟเวอร์:

เซิร์ฟเวอร์ {
    ฟัง 80;

    ที่ตั้ง /.well-known {
        try_files $uri =404;
    }

    ที่ตั้ง / {
        # เปลี่ยนเส้นทางคำขอ http เป็น https
        ส่งคืน 301 https://domain.pointing.to.apache.com;
    }
}

ด้วยการกำหนดค่านี้ คุณสามารถเรียกใช้ Certbot บนพร็อกซีเซิร์ฟเวอร์ย้อนกลับ ซึ่งจะตรวจสอบความเป็นเจ้าของโดเมนอย่างถูกต้องและรับใบรับรอง / คีย์

อย่างไรก็ตาม ด้วยการกำหนดค่านี้ คุณไม่สามารถเรียกใช้ Certbot บนเซิร์ฟเวอร์ที่ทำงานบนเครือข่ายท้องถิ่นได้ หากเครือข่ายท้องถิ่นถือว่าปลอดภัย ฉันขอแนะนำให้ใช้ http แทน https ระหว่างเซิร์ฟเวอร์พร็อกซีย้อนกลับและเซิร์ฟเวอร์เครือข่ายท้องถิ่น

ถ้า https จำเป็นระหว่างเซิร์ฟเวอร์พร็อกซีย้อนกลับและเซิร์ฟเวอร์เครือข่ายท้องถิ่น จากนั้นคุณสามารถใช้การกำหนดค่านี้:

เซิร์ฟเวอร์ {
    ฟัง 80;

    # พยายามให้บริการไฟล์ `.well-known` จากระบบไฟล์ในเครื่อง หากไม่พบ ให้ส่งไปยังเซิร์ฟเวอร์ต้นน้ำ
    ที่ตั้ง /.well-known {
        try_files $uri @local;
    }

    สถานที่ @local {
        proxy_pass http://192.168.11.4;
    }

    ที่ตั้ง / {
        ส่งคืน 301 https://domain.pointing.to.apache.com;
    }
}
us flag
เทโร ขอบคุณมากสำหรับความช่วยเหลือ ขออภัย ฉันยังคงทำอะไรไม่ถูกต้อง ฉันแก้ไขการตั้งค่าที่มีให้สำหรับไซต์ เปิดใช้งาน และพยายามโหลด Nginx ซ้ำ แต่ได้รับข้อผิดพลาดต่อไปนี้: 'จำนวนอาร์กิวเมนต์ที่ไม่ถูกต้องในคำสั่ง "ssl_certificate" ใบรับรอง SSL อยู่บนเซิร์ฟเวอร์ระยะไกล (192.168.11.4 ในตัวอย่างนี้) ซึ่งไม่น่าจะมีปัญหา...ใช่หรือไม่
us flag
คุณต้องมีใบรับรองบนเซิร์ฟเวอร์ที่ติดตั้ง nginx และป้อนพาธไปยังไฟล์ใบรับรอง / คีย์ในคำสั่งที่เกี่ยวข้อง
us flag
เทโร ขอบคุณอีกครั้ง ฉันกลัวว่าอาจจะเป็นอย่างนั้น ดังนั้น ปัญหาของฉันคือฉันไม่แน่ใจว่าฉันเข้าใจวิธีติดตั้งใบรับรองบนเครื่องที่หันหน้าเข้าหาอินเทอร์เน็ตสำหรับโดเมนที่จะให้บริการจากด้านหลังเครื่องที่หันเข้าหาอินเทอร์เน็ต เมื่อฉันรัน certbot จะตรวจสอบเพื่อให้แน่ใจว่าฉัน (เครื่องและ IP ของฉัน) ตอบสนองต่อ IP (โดเมน) ฉันกำลังพยายามขอใบรับรอง แต่เครื่องที่หันเข้าหาเน็ตของฉันจะไม่ตอบสนอง (ฉันไม่คิดว่า) เพราะมันไม่มี 'ไม่มีการตั้งค่าเซิร์ฟเวอร์เสมือนเพื่อฟังโดเมนนั้น
us flag
นอกจากนี้ ฉันอาจมีการตั้งค่าที่ซับซ้อนมากเกินไปที่นี่ เนื่องจากโดเมนหลักของฉันคือโดเมนที่ให้บริการโดยเครื่องบนเครือข่ายท้องถิ่นของฉันผ่านเครื่องอื่น (เรียกใช้ Nginx) ที่ให้บริการโดเมนย่อยสามโดเมนจากโดเมนนั้น (เช่น one.mydomain.com, two.mydomain.com และ three.mydomain.com อยู่ในเครื่องที่เชื่อมต่อผ่านเน็ต และ domain.com ของฉันอยู่ที่เครื่องที่อยู่ด้านหลังเครื่องที่เชื่อมต่อผ่านเน็ต) เหตุใดจึงตั้งค่าในลักษณะนี้เป็นเรื่องยาว ... สิ่งที่ฉันกำลังถ่ายทำที่นี่เป็นไปได้หรือไม่
us flag
ฉันได้เพิ่มข้อมูลเพิ่มเติมว่าคุณจะจัดการใบรับรองบนเซิร์ฟเวอร์พร็อกซีย้อนกลับได้อย่างไร
us flag
เทโร ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือและความอดทนของคุณ ฉันรู้สึกเหมือนฉันเกือบจะอยู่ที่นั่นแล้ว ฉันลบใบรับรอง ssl ออกจากเซิร์ฟเวอร์เครือข่ายท้องถิ่น เปลี่ยนไปให้บริการไซต์บน http (80) ใช้ข้อมูลที่อัปเดตที่คุณให้มา รวมทั้งต้องเพิ่ม server_name สำหรับ certbot เพื่อระบุโดเมนที่ฉันต้องการใบรับรอง ทั้งหมดทำงานได้ดี แต่ตอนนี้ฉันได้รับข้อผิดพลาด 502 เกตเวย์ไม่ถูกต้องเมื่อฉันพยายามเข้าถึงโดเมน ฉันจะอัปเดตคำถามของฉันเพื่อให้จัดรูปแบบได้ง่ายขึ้น/ชัดเจนขึ้นเพื่อแสดงสิ่งที่ฉันมีอยู่
us flag
โปรดทราบว่าเมื่อเซิร์ฟเวอร์อัปสตรีมอยู่เหนือ `http` คุณจะต้องใช้ `proxy_pass http://192.168.11.4;` คุณมี `https://192.168.11.4` ในการกำหนดค่าของคุณ
us flag
เทโร - ขอบคุณอีกครั้ง ใช่ นั่นเป็นปัญหา การลบ 's' ทำให้ฉันผ่านข้อผิดพลาด 502 และตอนนี้ฉันได้รับข้อผิดพลาด "เปลี่ยนเส้นทางมากเกินไป" ... ซึ่งฉันคิดว่ามาจาก Apache บนเครื่องท้องถิ่น ... ฉันจะต้องกระตุ้นตอนนี้และดู ฉันทำอะไรผิดในด้านนั้น
us flag
เทโร - ขอบคุณมากสำหรับการสนับสนุนและความอดทนของคุณ ข้อผิดพลาด 502 เกิดจากการตั้งค่าที่เกี่ยวข้องกับ https ที่เหลืออยู่ในไฟล์เซิร์ฟเวอร์เสมือนของฉันบนเครื่อง Apache ฉันมองข้ามพวกเขาที่ด้านล่างของไฟล์โดยสิ้นเชิง ลบทุกอย่างและทำงานได้อย่างสมบูรณ์ :-) จำเป็นต้องทำการปรับเปลี่ยนเล็กน้อยในแอปของฉันซึ่งทำงานอยู่เบื้องหลัง reverse proxy (proxy_client_headers) แต่เมื่อทำการปรับแต่งแล้วทุกอย่างก็ใช้งานได้ดี ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ :-)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา