วิธีให้บริการไฟล์คงที่ที่มีอยู่ทั้งหมดโดยตรงกับ NGINX แต่พร็อกซีส่วนที่เหลือไปยังเซิร์ฟเวอร์แบ็กเอนด์


88
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    if (-f $request_filename) {
        access_log off;
        expires 30d;
        break;
        }

    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8080; # backend server listening
        break;
        }
    }

ด้านบนจะให้บริการไฟล์ที่มีอยู่ทั้งหมดโดยตรงโดยใช้ Nginx (เช่น Nginx แสดงซอร์สโค้ด PHP) หรือส่งต่อคำขอไปยัง Apache ฉันจำเป็นต้องแยกไฟล์ * .php ออกจากกฎเพื่อให้คำขอสำหรับ * .php ถูกส่งไปยัง Apache และประมวลผล

ฉันต้องการให้ Nginx จัดการไฟล์แบบคงที่ทั้งหมดและ Apache เพื่อประมวลผลสิ่งที่เป็นไดนามิกทั้งหมด

แก้ไข: มีวิธีการทำรายการสีขาว แต่ไม่สวยหรูมากดูส่วนขยายเหล่านั้นทั้งหมดฉันไม่ต้องการสิ่งนี้

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
    access_log off;
    expires 30d;
    }
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    }

แก้ไข 2: ใน Nginx เวอร์ชันใหม่ให้ใช้http://wiki.nginx.org/HttpCoreModule#try_filestry_filesแทน


เพียงเพื่อล้างสิ่งต่าง ๆ : โค้ดด้านบนจะให้บริการไฟล์แบบคงที่หากมีอยู่ในดิสก์หากไฟล์ไม่มีอยู่คำขอจะถูกส่งไปยัง Apache วิธีนี้ใช้ได้ผลเกือบตลอดเวลาเนื่องจาก URL ทั้งหมดในแอปพลิเคชันของฉันใช้ mod_rewrite (หรือการกำหนดเส้นทาง) และไม่มีอยู่จริงบนดิสก์ เฉพาะการเข้าถึงโดยตรงไปยังชื่อไฟล์ * .php เท่านั้นที่เป็นข้อยกเว้นและต้องแยกวิเคราะห์โดย Apache
fmalina

คำตอบ:


153

ใช้try_filesและตั้งชื่อบล็อกตำแหน่ง ('@apachesite') การดำเนินการนี้จะลบการจับคู่ regex ที่ไม่จำเป็นและถ้าบล็อก มีประสิทธิภาพมากกว่า.

location / {
    root /path/to/root/of/static/files;
    try_files $uri $uri/ @apachesite;

    expires max;
    access_log off;
}

location @apachesite {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

ปรับปรุง:สมมติฐานของการกำหนดค่านี้ก็คือว่ามีไม่ได้อยู่สคริปต์ PHP ใด ๆ /path/to/root/of/static/filesภายใต้ ซึ่งเป็นเรื่องปกติในกรอบ php ที่ทันสมัยที่สุด ในกรณีที่โปรเจ็กต์ php ดั้งเดิมของคุณมีทั้งสคริปต์ php และไฟล์สแตติกผสมกันในโฟลเดอร์เดียวกันคุณอาจต้องอนุญาตพิเศษของไฟล์ทุกประเภทที่คุณต้องการให้ nginx แสดง


ฉันใช้ wordpress ดังนั้นฉันควรใส่โฟลเดอร์อัพโหลดบนเซิร์ฟเวอร์ nginx หรือไม่
Chameron

7
ปัญหาของฉันกับวิธีแก้ปัญหานี้: nginx ไม่ได้ใช้ตำแหน่งอื่น (พร็อกซี) และพยายามแสดงรายการไดเรกทอรี ดังนั้นจึงพ่น 403 เนื่องจากไม่ได้เปิดใช้งานรายการไดเรกทอรี แก้ไข:ตกลงถ้าคุณลบ$uri/มันก็ใช้ได้
ChristophLSA

1
สิ่งนี้จะใช้ proxy / example ไปยัง apache แต่อนุญาตให้ดาวน์โหลด /example.php
Terence Johnson

1
@TerenceJohnson การวางไฟล์ php ไว้ในโฟลเดอร์ไฟล์คงที่ไม่ปลอดภัย โปรดทราบว่าฉันตั้งค่าroot /path/to/root/of/*static*/files;. ไฟล์ php ควรอยู่ในโฟลเดอร์อื่นไม่สามารถเข้าถึงได้โดยตรงจากอินเทอร์เน็ต
ชวนมา

2
ฉันรู้ว่านั่นเป็นวิธีที่ควรจะเป็น แต่ถ้ามีคนวาง Nginx ไว้หน้าแอปพลิเคชั่น PHP ที่ไม่ได้วางจำหน่ายทั่วไปที่มีทุกอย่างอยู่ในรูทเว็บและอาศัยไฟล์. htaccess พวกเขาไม่ควรคัดลอกและ วางการกำหนดค่าของคุณ
เทอเรนซ์จอห์นสัน

18

ลองสิ่งนี้:

location / {
    root /path/to/root;
    expires 30d;
    access_log off;
}

location ~* ^.*\.php$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

หวังว่าจะได้ผล นิพจน์ทั่วไปมีลำดับความสำคัญสูงกว่าสตริงธรรมดาดังนั้นคำขอทั้งหมดที่ลงท้ายด้วย.phpควรถูกทิ้งไว้ที่ Apache หากมีเพียง.phpไฟล์ที่เกี่ยวข้อง ส่วนที่เหลือจะถูกจัดการเป็นไฟล์คงที่ อัลกอริทึมที่แท้จริงของสถานที่การประเมินเป็นที่นี่


6

หากคุณใช้ mod_rewrite เพื่อซ่อนส่วนขยายของสคริปต์ของคุณหรือถ้าคุณชอบ URL สวย ๆ ที่ลงท้ายด้วย / คุณอาจต้องการเข้าหาสิ่งนี้จากทิศทางอื่น บอก nginx ให้ปล่อยให้อะไรก็ตามที่มีส่วนขยายที่ไม่คงที่ผ่านไปยัง apache ตัวอย่างเช่น:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
    root   /path/to/static-content;
}

location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

ฉันพบส่วนแรกของตัวอย่างข้อมูลนี้ที่: http://code.google.com/p/scalr/wiki/NginxStatic


วิธีนี้ใช้งานได้ดีแม้ว่าฉันจะยังคงได้รับข้อผิดพลาดสำหรับไฟล์ที่ย่อขนาด (เช่น site.min.css และ main.min.js เป็นต้น) ฉันจะจับสิ่งเหล่านั้นในนิพจน์ทั่วไปได้อย่างไร @lo_fye
Garth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.