ไฟล์คงที่ Nginx เฉพาะสำหรับโดเมนย่อย

ฉันมีแอปพลิเคชัน NodeJs ที่ทำงานบน localhost:8000 และฉันกำลังใช้ Nginx เป็นพร็อกซีเซิร์ฟเวอร์ นี่เป็นแอปพลิเคชันเดียวที่ทำงานบน Nodejs ในขณะที่แอปพลิเคชันอื่นใช้ PHP

ฉันกำลังพยายามตั้งค่าพร็อกซีใน Nginx เพื่อเปลี่ยนเส้นทางคำขอทั้งหมดจาก "http://localhost/NodeApp/" เป็น " http://localhost:8000/" Nginx ควรดึงข้อมูลเฉพาะไฟล์ css/js/images จาก nodeapp นี้โดยตรง คำขออื่นๆ ทั้งหมดจะถูกส่งไปยังเซิร์ฟเวอร์ Apache การกำหนดค่า Nginx เป็นเช่นนี้ -

#Need to modify this code to fetch static files for NodeApp only!
location ~ ^/(uploads/|vendor/|images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
  root /var/www/NodeApp/public;
  access_log off;
}

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:8000/;
}

การกำหนดค่าข้างต้น Nginx จะทำลายแอปพลิเคชันอื่น ๆ เนื่องจากค้นหาไฟล์คงที่ในโฟลเดอร์สาธารณะ NodeApp ฉันจะแก้ไขการกำหนดค่าด้านบนให้ทำงานเฉพาะกับ "localhost/NodeApp/" ได้อย่างไร

ฉันลองกำหนดค่าด้านล่าง แต่นั่นทำให้โฟลเดอร์คงที่ NodeApp พังมีโฟลเดอร์ย่อย - /public/js/bootstrap/ /public/js/datepicker/ /public/css/bootstrap/ /public/css/datepicker/ /public/uploads/pdf / /สาธารณะ/รูปภาพ/

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://OneDesktop/;
    alias /var/www/NodeApp/public/;
}

คำแนะนำใด ๆ? ฉันลองมาหลายอย่างแล้ว แต่ก็ไม่มีโชค!

ขอบคุณ!


person Legolas    schedule 25.01.2016    source แหล่งที่มา


คำตอบ (1)


ปัญหาคือแอปพลิเคชัน Node ไม่ใช่แค่ URI เดียว แต่เป็นชุดของ URI แนวทางที่สะอาดที่สุดคือการปรับเปลี่ยนแอปพลิเคชันเองเพื่อให้อยู่ต่ำกว่า /NodeApp/ (รวมถึงตำแหน่งที่ดึงทรัพยากรคงที่ด้วย)

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

ตัวเลือกหนึ่ง (น้อยกว่าอุดมคติ) คือขอให้ nginx ให้บริการไฟล์จากรูทเอกสารหนึ่ง จากนั้นเลื่อนไปยังรูทเอกสารอื่นหากไม่มีไฟล์ต้นฉบับ

บางสิ่งเช่นนี้:

root /other/application/root;

location / {
    index ...;
    try_files $uri $uri/ =404;
}

location @other {
}

location ~ \.php$ {
    try_files $uri =404;
    ... 
}

location ~ ^/(uploads/|vendor/|images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
    root /var/www/NodeApp/public;
    access_log off;
    try_files $uri @other;
}

location /NodeApp/ {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://localhost:8000/;
}

บล็อก location @other จะให้บริการไฟล์คงที่จากรูทแอปพลิเคชันอื่น บล็อกตำแหน่ง PHP เป็น regex แรก location เพื่อให้มีลำดับความสำคัญ

person Richard Smith    schedule 25.01.2016
comment
ขอบคุณริชาร์ด ขอขอบคุณคำตอบของคุณ คืนนี้จะลองตั้งค่า nginx แล้วอัปเดตที่นี่อีกครั้ง คำถามหนึ่งเกี่ยวกับการใช้งานแอปพลิเคชันภายใต้ /NodeApp/ เอง - ฉันกำลังใช้ hackathon-starter ซึ่งแนะนำให้วางไฟล์สแตติกไว้ภายใต้ public/js, public/css เป็นต้น อย่างไรก็ตาม ในแอปพลิเคชันนั้น express จะจัดการไฟล์สแตติก . สิ่งที่คุณแนะนำคืออย่าใช้วิธีนี้? ฉันกำลังทำอะไรผิดเพราะสามารถพบสิ่งที่คล้ายกันได้ทุกที่บนอินเทอร์เน็ต - person Legolas; 28.01.2016
comment
ขออภัยที่พิมพ์ผิดในความคิดเห็นก่อนหน้า - ฉันทำอะไรผิดเพราะ ไม่ พบสิ่งที่คล้ายกันในอินเทอร์เน็ต - person Legolas; 28.01.2016
comment
ขออภัย ฉันคำนึงถึง URL ไม่ใช่ไดเรกทอรีทางกายภาพ ไฟล์ของคุณอยู่ที่ใดในขณะนี้ก็ถือว่าโอเค ปัญหาคือการแยก URL ออกจาก URL ของแอปพลิเคชัน PHP การเรียกใช้แอปพลิเคชันที่แตกต่างกันภายในโดเมนเดียวกันมักต้องใช้โซลูชันที่สร้างสรรค์ซึ่งไม่ได้ระบุไว้ในบทช่วยสอนเกี่ยวกับแอปพลิเคชันเดี่ยว - person Richard Smith; 28.01.2016