كيفية خدمة جميع الملفات الثابتة الموجودة مباشرةً باستخدام NGINX، مع توكيل الباقي إلى خادم خلفي.

StackOverflow https://stackoverflow.com/questions/869001

سؤال

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 try_files بدلاً من http://wiki.nginx.org/HttpCoreModule#try_files

هل كانت مفيدة؟

المحلول

يستخدم Try_files وكتلة الموقع المسماة ('@Apachesite').سيؤدي هذا إلى إزالة تطابق التعبير العادي غير الضروري وحظره.أكثر فعالية.

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 إلى القائمة البيضاء.

نصائح أخرى

وجرب هذا:

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;
}

ونأمل أن يعمل. التعابير العادية لها أولوية أعلى من سلاسل عادي، لذلك ينبغي أن forwared جميع الطلبات المنتهية في .php اباتشي في حالة وجود فقط ملف .php المقابلة. وسيتم التعامل مع بقية كملفات ثابتة. الخوارزمية الفعلية للتقييم الموقع هو href="http://wiki.nginx.org/NginxHttpCoreModule#location" هنا .

إذا كنت تستخدم mod_rewrite ولإخفاء تمديد البرامج النصية، أو إذا كنت ترغب فقط عناوين جميلة التي تنتهي في /، فإنك قد ترغب في الاقتراب من هذا الاتجاه الآخر. أخبر إنجن إكس لترك أي شيء بملحق غير ثابت من خلال الذهاب إلى اباتشي. على سبيل المثال:

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 كوم / ع / scalr / ويكي / NginxStatic

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top