โอเค ฉันคิดว่าฉันเข้าใจปัญหาแล้ว
Wordpress ใช้ตัวแปรสองตัวเพื่อกำหนด:
- URL ใดที่นำไปสู่ตำแหน่งของไซต์เวิร์ดเพรสของคุณ (
WP_HOME
)
- URL ใดที่ใช้ในการโหลดทรัพยากรสำหรับเว็บไซต์ wordpress ของคุณ (
WP_SITEURL
)
สิ่งแรกที่ฉันต้องทำสำหรับคอนเทนเนอร์เวิร์ดเพรสคือต้องแน่ใจว่า URL เหล่านี้ตรงกับ URL ของคอนเทนเนอร์ภายใน เช่น $BLOG_SERVER
. เนื่องจากฉันใช้ docker-compose จึงเป็นเรื่องง่ายที่จะใส่ URL นี้โดยใช้ตัวแปรสภาพแวดล้อมผ่าน WORDPRESS_CONFIG_EXTRA
การโต้แย้ง.
เวิร์ดเพรสบล็อก:
ภาพ: wordpress:5
ขึ้นอยู่กับ:
- บล็อกฐานข้อมูล
สิ่งแวดล้อม:
WORDPRESS_DB_HOST: บล็อกฐานข้อมูล
WORDPRESS_DB_NAME: บล็อก
WORDPRESS_DB_USER: เวิร์ดเพรส
WORDPRESS_DB_PASSWORD: เวิร์ดเพรส
WORDPRESS_CONFIG_EXTRA: |
กำหนด ('WP_HOME', 'http://wordpress-blog');
กำหนด ('WP_SITEURL', 'http://wordpress-blog');
ปริมาณ:
- เวิร์ดเพรส:/var/www/html
เสร็จแล้ว ตอนนี้เราสามารถมุ่งเน้นไปที่พร็อกซี
ก่อนที่ฉันจะใช้เส้นทางของ reverse proxy แบบเต็ม ฉันอยู่ภายใต้การสันนิษฐานว่า proxy จะเข้าควบคุมทุกคำขอสำหรับ /บล็อก/
และส่งคืนหน้าจากไซต์พร็อกซีซึ่งจะดูราวกับว่าพวกเขาให้บริการโดยตรงจากเวิร์ดเพรส สิ่งหนึ่งที่ฉันไม่ได้คำนึงถึงก็คือสมมติฐานนี้ก็สันนิษฐานเช่นกัน หน้าเรนเดอร์ฝั่งเซิร์ฟเวอร์.
เริ่มต้นด้วยสิ่งใหม่ โฮสต์เสมือน
คอนฟิกูเรชัน ตอนนี้หน้าตาจะเป็นดังนี้:
<VirtualHost *:80>
ProxyPass "/blog/" "${BLOG_SERVER}/"
ProxyPass "/" "${REACT_SERVER}/"
<Location "/">
ProxyPreserveHost On
ProxyErrorOverride On
ProxyPassReverse "${DEV_SERVER}/"
</Location>
<Location "/blog/">
ProxyPreserveHost Off
ProxyPassReverse "${BLOG_SERVER}/"
ProxyPassReverseCookiePath "/" "/blog/"
ProxyErrorOverride On
ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLURLMap "${BLOG_SERVER}/"
SetOutputFilter INFLATE;proxy-html;DEFLATE
# ProxyPassReverseCookieDomain "%{HTTP_HOST:${BLOG_SERVER}}" %{HTTP_HOST}
</Location>
</VirtualHost>
สิ่งต่อไปที่ฉันต้องทำเพื่อให้พร็อกซีนี้เริ่มทำงานเหมือนพร็อกซีคือเพิ่มบรรทัดนี้:
ปิด ProxyPreserveHost
สิ่งนี้ทำให้มั่นใจได้ว่าการตอบกลับ/คำขอทั้งหมดที่เราได้รับจาก wordpress จะไม่ดูเหมือนว่ามาจากเรา (พร็อกซี) เหตุผลนี้จะชัดเจนในไม่ช้าเมื่อเราเริ่มจัดการกับ proxying html
ต่อไป พร็อกซีพาส
คำสั่งถูกย้ายออกจาก ที่ตั้ง
ภาชนะและตรงเข้า โฮสต์เสมือน
.
ProxyPass "/blog/" "${BLOG_SERVER}/"
ProxyPass "/" "${REACT_SERVER}/"
สาเหตุที่เป็นเช่นนี้เพราะว่า ที่ตั้ง
การบล็อกล่าช้ามากในการจับคู่คำขอ และบางครั้งการ /
เส้นทางชัยชนะเหนือ /บล็อก/
เส้นทาง. ฉันต้องการให้มันน่าเชื่อถือกว่านี้ฉันจึงตัดสินใจเลือกผู้รับมอบฉันทะด้วยตัวเอง (ฉันเห็นตัวอย่าง ที่นี่) จากนั้นแก้ไขพาธภายในไฟล์ ที่ตั้ง
คอนเทนเนอร์.
ณ จุดนี้พร็อกซีย้อนกลับอยู่ในขณะนี้ ทำงาน! อย่างไรก็ตาม html ในหน้านั้นมีลิงค์ที่ชี้ไปยัง url ภายในของไซต์ wordpress ที่นี่เป็นที่ที่ mod_proxy_html เข้ามาสามารถใช้เขียนลิงค์ทั้งหมดใน html ใหม่เพื่อชี้ไปที่ reverse proxy ทุกที่ที่พบลิงก์ที่ชี้ไปยังไซต์บล็อกภายใน ลิงก์นั้นจะถูกแทนที่ด้วยลิงก์ที่ใช้พร็อกซีย้อนกลับ
ProxyHTMLEnable เปิด
ProxyHTMLขยายบน
ProxyHTMLURLMap "${BLOG_SERVER}/"
SetOutputFilter INFLATE;proxy-html;DEFLATE
บรรทัดสุดท้ายอาจทำให้เกิดปัญหาคอขวด เนื่องจากบรรทัดสุดท้ายจะขยายเพย์โหลดจากเว็บไซต์บล็อก เขียน URL ใหม่ทั้งหมดเพื่อชี้ไปยังพร็อกซีย้อนกลับ จากนั้นจึงบีบอัดอีกครั้ง หากคุณไม่ต้องการสิ่งนี้ อีกวิธีที่จะทำให้สำเร็จคือใช้:
RequestHeader ยกเลิกการตั้งค่าการยอมรับการเข้ารหัส
แม้จะมีทั้งหมดนี้แล้ว โซลูชันก็ยังไม่สมบูรณ์แบบ เนื่องจากไฟล์จาวาสคริปต์ใดๆ ที่โหลดบนหน้าเว็บ ซึ่งส่งคำขอไปยังไซต์ภายในจะไม่ส่งคำขอไปยังพร็อกซี
ทางออกหนึ่งสำหรับสิ่งนี้คือการใช้วิธีแก้ปัญหาแรกที่เสนอโดย คำตอบปัจจุบัน ในคำถามนี้และการเปลี่ยนแปลง WP_SITEURL
เพื่อชี้ไปที่พร็อกซีย้อนกลับโดยตรง
อีกวิธีหนึ่งคือการใช้ พนักงานบริการ ถึง สกัดกั้นคำขอของเครือข่าย. ฉันชอบโซลูชันนี้เนื่องจากไม่ได้เชื่อมโยงไซต์บล็อกเข้ากับพร็อกซีย้อนกลับอย่างแน่นหนา ฉันสามารถจินตนาการได้ว่ามันจะไม่เป็นการดึงข้อมูลมากเกินไป (เฮ้) ความคิดที่จะใส่พนักงานบริการลงในหน้า html ใด ๆ ที่ร้องขอจากพร็อกซี และให้พนักงานบริการนั้นสกัดกั้นคำขอทั้งหมดที่ตรงกับ URL ของเว็บไซต์บล็อกภายใน และแทนที่ ด้วย URL พร็อกซีย้อนกลับ
ฉันไปกับสิ่งเหล่านี้ หลังจากการไตร่ตรองอย่างถี่ถ้วน ฉันคิดว่าการโฮสต์ wordpress ในโดเมนย่อยน่าจะเหมาะกับความต้องการของฉันมากกว่า บางอย่างเช่น blog.example.com เป็นสิ่งที่ฉันอาจทำ แต่นั่นอาจใช้ได้ผลในวันอื่น
สรุปได้ว่า reverse proxy ใช้งานกับ apache ได้ยาก ฉันไม่รู้ว่าหญ้าจะเขียวกว่าฝั่ง nginx หรือไม่ แต่สักวันหนึ่งเราจะลองดู วิธีแก้ปัญหาที่ฉันใช้คือเนื้อหาฝั่งเซิร์ฟเวอร์เท่านั้น ซึ่งจะพิสูจน์แล้วว่าเป็นตัวเลือกที่สมบูรณ์แบบสำหรับการใช้พร็อกซี แต่อนิจจา เนื้อหาที่โหลดแบบไดนามิกจะต้องใช้งานมากขึ้น
แหล่งที่มา
เปิดใช้งานโมดูล Apache สำหรับ html proxying
LoadModule deflate_module โมดูล/mod_deflate.so
LoadModule xml2enc_module โมดูล/mod_xml2enc.so
LoadModule proxy_html_module modules/mod_proxy_html.so