ฉันมีเซิร์ฟเวอร์จริงสองตัวที่ทำงานบน LAN เดียวกัน ทั้งสองกำลังใช้งานเว็บเซิร์ฟเวอร์ อันหนึ่งรัน apache2 อีกอันรัน nginx แต่ละคนมีชื่อโดเมนต่างกัน แต่มีที่อยู่ IP ของ WAN ภายนอกเดียวกัน สมมติว่าเค้าโครงเครือข่ายมีลักษณะดังนี้:
วาน
10.20.30.40
|----------|----------|
| |
โดเมน 1 โดเมน 2
exampleABC.com (ย่อย)exampleXYZ.com
| |
|----------|----------|
|
แลนเดียว
|
|----------|----------|
| |
ไอพีแอดเดรส 1 ไอพีแอดเดรส 2
192.168.0.10 192.168.0.20
| |
| |
เซิร์ฟเวอร์ 1 เซิร์ฟเวอร์ 2
apache2 nginx
เซิร์ฟเวอร์ apache2 เป็นของฉันในขณะที่เซิร์ฟเวอร์ nginx ไม่ใช่ เซิร์ฟเวอร์ทั้งสองมีโดเมนย่อยเฉพาะสำหรับแต่ละบริการที่มีให้ เช่น (www.)exampleABC.com สำหรับหน้าเว็บหลัก cloud.exampleXYZ.com สำหรับบริการคลาวด์แบบรีเวิร์สพร็อกซี media.exampleXYZ.com สำหรับสื่อ เป็นต้น
ด้วยเหตุผลที่ไม่ทราบสาเหตุ เซิร์ฟเวอร์ nginx เป็นสิ่งที่มีความสำคัญเมื่อเชื่อมต่อกับที่อยู่ IP ของ WAN - ในขั้นต้น ทั้งสองโดเมนจะนำไปยังหน้าเว็บหลักที่โฮสต์โดย nginx แต่ด้วยการกำหนดค่า nginx (ปัจจุบัน) ต่อไปนี้ exampleABC.com จะนำไปสู่อย่างถูกต้อง เซิร์ฟเวอร์ apache2 ในขณะที่ exampleXYZ.com ยังคงนำไปสู่เซิร์ฟเวอร์ nginx
เซิร์ฟเวอร์ {
ฟัง 80;
# ฟังในโดเมนย่อยทั้งหมด
ชื่อเซิร์ฟเวอร์ exampleABC.com *.exampleABC.com;
ที่ตั้ง / {
# พร็อกซีโปร่งใสไปยังเซิร์ฟเวอร์อื่น (พอร์ต 443)
proxy_pass http://192.168.0.10:80;
# ตั้งค่าส่วนหัว "โฮสต์" ที่ส่งผ่านไปยังเซิร์ฟเวอร์อื่นไปยัง FQDN ที่ไคลเอนต์ร้องขอ เพื่อให้เซิร์ฟเวอร์อื่นรู้ว่ามีการร้องขอโดเมนย่อยใด
proxy_set_header โฮสต์ $http_host;
}
}
เซิร์ฟเวอร์ {
ฟัง 443 ssl;
ชื่อเซิร์ฟเวอร์ exampleABC.com *.exampleABC.com;
ที่ตั้ง / {
proxy_pass https://192.168.0.10:443;
proxy_set_header โฮสต์ $http_host;
}
}
อย่างไรก็ตาม โดเมนย่อยที่โฮสต์โดยเซิร์ฟเวอร์ apache2 (docs.exampleABC.com เป็นต้น) ยังคงเชื่อมต่อกับ nginx ต่อไป (โดเมนย่อย nginx ทำงานได้ดี)
นี่คือหนึ่งในการกำหนดค่าโดเมนย่อยที่ฉันตั้งค่าผ่าน apache2:
<โฮสต์เสมือน *:80>
ชื่อเซิร์ฟเวอร์ ft.exampleABC.com
เปลี่ยนเส้นทางถาวร / https://ft.exampleABC.com/
RewriteEngine เปิดอยู่
RewriteCond %{SERVER_NAME} =ft.exampleABC.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=ถาวร]
</เวอร์ชวลโฮสต์>
<IfModule mod_ssl.c>
<โฮสต์เสมือน _default_:443>
# คำสั่ง ServerName ตั้งค่ารูปแบบคำขอ ชื่อโฮสต์ และพอร์ตที่
# เซิร์ฟเวอร์ใช้เพื่อระบุตัวเอง สิ่งนี้ใช้เมื่อสร้าง
# URL การเปลี่ยนเส้นทาง ในบริบทของโฮสต์เสมือน ชื่อเซิร์ฟเวอร์
# ระบุชื่อโฮสต์ที่ต้องปรากฏในส่วนหัวของคำขอ Host:
# ตรงกับโฮสต์เสมือนนี้ สำหรับโฮสต์เสมือนเริ่มต้น (ไฟล์นี้) สิ่งนี้
# ค่าไม่ได้ชี้ขาดเนื่องจากใช้เป็นทางเลือกสุดท้ายโฮสต์โดยไม่คำนึงถึง
# อย่างไรก็ตาม คุณต้องตั้งค่าสำหรับโฮสต์เสมือนเพิ่มเติมอย่างชัดเจน
ชื่อเซิร์ฟเวอร์ ft.exampleABC.com
#ServerAlias *.exampleABC.com
ServerAdmin webmaster@localhost
DocumentRoot /mnt/external/เว็บเซิร์ฟเวอร์/ft
# loglevels ที่มีอยู่: trace8, ..., trace1, debug, ข้อมูล, ประกาศ, เตือน,
# ข้อผิดพลาด วิกฤต การแจ้งเตือน เกิดขึ้น
# นอกจากนี้ยังสามารถกำหนดค่าล็อกระดับโดยเฉพาะได้
# โมดูล เช่น
#ข้อมูล LogLevel ssl:warning
บันทึกข้อผิดพลาด ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log รวมกัน
# สำหรับไฟล์การกำหนดค่าส่วนใหญ่จาก conf-available/ ซึ่งได้แก่
# เปิดใช้งานหรือปิดใช้งานในระดับโลกก็เป็นไปได้
# รวมบรรทัดสำหรับโฮสต์เสมือนหนึ่งรายการเท่านั้น ตัวอย่างเช่น
# บรรทัดต่อไปนี้เปิดใช้งานการกำหนดค่า CGI สำหรับโฮสต์นี้เท่านั้น
# หลังจากถูกปิดใช้งานทั่วโลกด้วย "a2disconf"
#รวม conf-available/serve-cgi-bin.conf
<ไดเร็กทอรี /mnt/external/webserver/ft>
ดัชนีตัวเลือก FollowSymLinks
AllowOverride ไม่มี
ต้องได้รับอนุญาตทั้งหมด
</ไดเรกทอรี>
# สวิตช์เครื่องยนต์ SSL:
# เปิด / ปิด SSL สำหรับโฮสต์เสมือนนี้
SSLEngine เปิดอยู่
< สนิป: บรรทัดที่เพิ่มโดย certbot >
</เวอร์ชวลโฮสต์>
</หากโมดูล>
# เป็นกลุ่ม: ไวยากรณ์=apache ts=4 sw=4 sts=4 sr noet
ฉันต้องการทำให้ไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ apache2 อย่างถูกต้องเมื่อเชื่อมต่อกับ exampleABC.com, ft.exampleABC.com เป็นต้น exampleXYZ.com และโดเมนย่อยควรเชื่อมต่อกับเซิร์ฟเวอร์ nginx แน่นอน
ข้อมูลอื่น ๆ:
เดิมที ไคลเอ็นต์ (เช่น เว็บเบราว์เซอร์) ไม่สามารถตรวจสอบความถูกต้องของใบรับรอง TLS ของ exampleABC.com ได้(โปรดทราบว่าฉันได้ตั้งค่าใบรับรอง TLS อย่างถูกต้องภายใต้ apache2) สิ่งนี้ได้รับการแก้ไขโดยการเพิ่มโดเมน apache2 ของฉันในใบรับรองของเซิร์ฟเวอร์ nginx
แม้ว่าฉันไม่เชื่อว่าสิ่งนี้จำเป็น - ใบรับรองของฉัน (ภายใต้ apache2) ควรส่งผ่านพร็อกซีย้อนกลับใช่ไหม
หากฉันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ apache2 ผ่าน curl ในขณะที่ระบุส่วนหัวของโฮสต์ด้วยตนเอง (ผ่าน curl -vL -H "โฮสต์: ft.exampleABC.com" https://192.168.0.10
) ฉันจะถูกเปลี่ยนเส้นทางไปยังหน้าเว็บหลักของเซิร์ฟเวอร์ nginx ฉันไม่แน่ใจว่าสิ่งนี้หมายความว่าอย่างไร
แก้ไข:
นี่คือผลลัพธ์ของ nginx -T
ตามที่ผู้ดูแลระบบของระบบ nginx:
- สนิป -
นอกจากนี้ เซิร์ฟเวอร์ nginx ยังทำงานในคอนเทนเนอร์ผ่าน "SWAG" ของ LinuxServer.io.
แก้ไข:
SWAG ของ LinuxServer.io โหลดการกำหนดค่า nginx ที่แตกต่างจากค่าดีฟอลต์ คำสั่งต่อไปนี้ได้รับ confs ที่ถูกต้อง:
นักเทียบท่า exec -it ย้อย /usr/sbin/nginx -c /config/nginx/nginx.conf -T
สามารถดูผลคำสั่งดังกล่าวได้ที่ วางนี้. (อักขระมากเกินไปสำหรับ StackExchange)