ฉันกำลังทำงานกับคอมโบบริการ + เว็บแอป + แอปมือถือ
- แอพมือถือใช้เพื่อบริโภคเนื้อหา
- สร้างโดยชุมชนผู้เขียนแบบเปิดบนเว็บแอป
- ด้วยบริการทั้งหมดโดยเซิร์ฟเวอร์ที่ใช้ Nginx บน Ubuntu (มีบางคำขอที่ส่งพร็อกซีไปยังเซิร์ฟเวอร์ส่วนหลังของ Nginx) แต่นั่นเป็นรายละเอียด
ปัญหาที่ฉันต้องการจัดการอย่างมีประสิทธิภาพคือปัญหาที่เกิดจากการที่เนื้อหาสามารถสร้างโดย ชุมชนเปิด - แทบทุกคนสามารถคลิกปุ่มไม่กี่ปุ่มและเริ่มกระบวนการสร้างเนื้อหาตามการที่เซิร์ฟเวอร์สร้างเนื้อหาต้นขั้วในรูปแบบของไฟล์ JSON เพื่อให้ผู้เขียนเนื้อหาปรับแต่งได้
ต่อไปนี้คือปัญหา - ฉันต้องการหลีกเลี่ยงการเสียเวลาของเซิร์ฟเวอร์และที่เก็บข้อมูลดิสก์ในการสร้างเนื้อหา JSON ที่ไม่เสถียรสำหรับผู้เขียนที่เริ่มต้นกระบวนการแต่ไม่เคยดำเนินการกับมันจริงๆ (การแปล = ลงชื่อสมัครใช้เพื่อสร้างเนื้อหาแต่ไม่เคยทำเลย)
กล่าวอีกนัยหนึ่ง ฉันต้องการสร้างเนื้อหา JSON แบบต้นขั้วสำหรับผู้แต่ง เฉพาะเมื่อฉันแน่ใจว่าพวกเขากำลังจะเริ่มกระบวนการปรับแต่งเนื้อหาจริง ในเวลาเดียวกัน ฉันต้องการให้แน่ใจว่าแอปบนอุปกรณ์เคลื่อนที่ได้รับข้อผิดพลาด 404 ที่สละสลวยสำหรับเนื้อหาที่ดึงมาจาก CDN ที่พยายามดึงผ่าน CDN
กล่าวอีกนัยหนึ่ง มี "ผู้บริโภค" สองชุดสำหรับเนื้อหา
- ผู้เขียนเนื้อหาซึ่งมักจะขอเนื้อหาโดยตรงจากเซิร์ฟเวอร์ของฉันผ่านเว็บแอป backoffice ซึ่งจะเปิด NGINX เป็น `$http_reffer = https://example.com/backoffice'
- CDN ซึ่งจะพยายามดึงเนื้อหาเดียวกันนั้นจากตำแหน่งเดียวกันเพื่อตอบสนองคำขอจากแอพมือถือ
การตอบสนองเริ่มต้นสำหรับเนื้อหาที่ขาดหายไปคือ
- ผู้เขียนเนื้อหา: สร้าง Stub JSON และส่งกลับ
- ซีดีเอ็น: ไม่มีไฟล์เนื้อหา JSON ดังนั้นส่วนหัว 404 จึงถูกส่งกลับ
วิธีแก้ปัญหาที่ฉันคิดไว้คือตามบล็อกการกำหนดค่า Nginx ต่อไปนี้
ตำแหน่ง /cdn/appdata/content
{
add_header Access-Control-Allow-Origin *;
ถ้า ($http_referer ~* ^https://example.com/backoffice)
{
ถ้า (!-e $request_filename) {เขียนใหม่ ^/(.*)$ /pathto/stub-json-generator.php?$1 สุดท้าย;}
}
} อื่น ??? /* บีบ JSON ที่มีอยู่กลับหรือตอบกลับด้วย 404 ทั้งต่อผู้ร้องขอ CDN
ฉันเล่นกับการกำหนดค่า Nginx เป็นครั้งคราว แต่ฉันไม่มีผู้เชี่ยวชาญ คำถามของฉัน - คือสิ่งที่ฉันได้ร่างแนวทางที่ดีในการทำงานนี้หรือฉันต้องเจาะลึกลงไปในการเขียนสคริปต์ Nginx ผ่าน JS หรือ Lua หรือไม่ การเขียนสคริปต์ Lua จำเป็นต้องติดตั้ง Open Resty ซึ่งเป็นสิ่งที่ฉันต้องการหลีกเลี่ยง เนื่องจากฉันได้กำหนดค่า Nginx ให้ทำงานร่วมกับ NChan และ Dart แล้ว ซึ่งฉันจะต้องทำใหม่อีกครั้งสำหรับ Open Resty นอกเหนือจากนั้น การพยายามเข้าถึง Redis และ Postgres จากภายในสคริปต์ Lua จะพาฉันไปสู่ดินแดนที่ไม่คุ้นเคย
ฉันสามารถลบคำถามนี้ได้ค่อนข้างง่าย แต่ฉันทิ้งคำถามไว้ที่นี่พร้อมวิธีแก้ปัญหาเพื่อประโยชน์ของใครก็ตามที่ต้องการทำสิ่งที่คล้ายกัน
วิธีแก้ปัญหานั้นง่ายมากและไม่ใช่ปัญหาการกำหนดค่า Nginx ทั้งหมด สิ่งสำคัญที่ต้องตระหนักคือ Nginx กำลังทำงานบน Ubuntu และตอนนี้มีวิธีแยกแยะความแตกต่างระหว่าง a จริง โฟลเดอร์ และ ก ลิงค์สัญลักษณ์. สมมติว่าเราทำสิ่งต่อไปนี้
- กำหนดโฟลเดอร์
/path/to/authordata
ลิงก์สัญลักษณ์ /path/to/readercontent
ดังนั้น
ln -s /path/to/authordata /path/to/readercontent
ตอนนี้ตั้งค่าบล็อกการกำหนดค่า Nginx ต่อไปนี้
ตำแหน่ง /path/to/authordata
{
add_header Access-Control-Allow-Origin *;
เขียนใหม่ ^(.*)$ /path/to/authordata/index.php?$1 สุดท้าย;
}
ตำแหน่ง /path/to/readercontent
{
add_header Access-Control-Allow-Origin *;
}
ไม่รู้จักกันทั้งสองบล็อคนี้กำลังระบุโฟลเดอร์ Ubuntu เดียวกัน
เราใช้อดีตเพื่อเข้าถึงข้อมูลผู้แต่งเพื่อแก้ไข เนื่องจากเนื้อหาถูกจัดส่งโดยสคริปต์ PHP เราจึงมีความสามารถในการสร้างเนื้อหาที่เป็นโครงในขณะเดินทาง ด้วยวิธีนี้จะไม่มีเนื้อหาต้นขั้วของผู้เขียนเริ่มต้นที่ไม่เคยถูกใช้งานไปอุดตันเซิร์ฟเวอร์
เราใช้อย่างหลังเพื่อรับเรื่องที่อ่านเข้าสู่แอพมือถือผ่านคำขอดึง CDN ทรัพยากรข้อมูลผู้เขียนที่ขาดหายไปจะส่งผลให้เกิดการตอบกลับมาตรฐาน 404 ส่วนหัว CORS ซึ่งอาจเจาะจงมากขึ้น หยุด CDN ไม่ให้พยายามดึงข้อมูลเด้งออก