एनजीआईएनएक्स सबसे अच्छा अभ्यास


46

NGinx का उपयोग करते समय आप किन सर्वोत्तम प्रथाओं का उपयोग करते हैं?


बस ध्यान दें कि यह Magento सेटअप के लिए काम नहीं करता है। अभी भी कारणों की जांच कर रहा है, लेकिन मुझे लगता है कि क्वेरी स्ट्रिंग के साथ इसका कुछ करना है।
Jauder Ho

जब आपके पास उपनिर्देशिका में "wordpress" नाम का वर्डप्रेस हो तो स्थान / वर्डप्रेस उपयोगी होना चाहिए। जब हमारे पास वेब रूट "/" में वर्डप्रेस है तो क्या होगा?
rahul286

जवाबों:


21

HTTP और HTTPS ब्लॉक को कैसे संयोजित करें।

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

यह एक अलग प्रश्न के उत्तर के रूप में पोस्ट किया गया था। यहाँ देखें



15

आम तौर पर, "अगर" का उपयोग करना एक बुरा अभ्यास है (नगीनेक्स के लेखक के अनुसार)। यदि संभव हो तो, "if (-f ...)" के बजाय error_page निर्देशों के try_file का उपयोग करना बेहतर होगा

Maintenence.html फ़ाइल के साथ टिप टिप और हमें मिलने वाली try_files के साथ टिप:

स्थान / {
    try_files /mainurance.html $ uri $ uri / @wordpress;
}

जब रखरखाव समाप्त होता है, तो केवल $ $ जड़ से रखरखाव html।


16
यह आदर्श नहीं है क्योंकि /mainurance.html 200 प्रतिक्रिया के रूप में परोसा जाएगा। आप शायद चाहते हैं कि खोज इंजन यह पहचान सके कि रखरखाव पृष्ठ आपकी वास्तविक वेबसाइट नहीं है। आप शायद 503 (सेवा अस्थायी रूप से अनुपलब्ध) वापस करना चाहते हैं। एक ही रास्ता मैं पता लगा सकते हैं कि यह कैसे करने के लिए एक साथ है if (-f ...) { return 503; }और error_page 503 /maintenance.html। तुम क्या सोचते हो?
आरोन जिब्राल्टर

11

SSL को मजबूत करने के लिए nginx कॉन्फ़िगर करें। डिफ़ॉल्ट रूप से, SSLv2 सक्षम है (जिसे आपको संभव हो तो अक्षम करना चाहिए)।

ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;

http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl


8

mapमिलान को उप-डोमेन के लिए रूट स्विच करते समय नियमित अभिव्यक्तियों के स्थान पर निर्देश का उपयोग करने के लिए इसका अक्सर अधिक कुशल :

server {

    server_name mysite.tld ~^.+\.mysite\.tld$;

    map $host $files {
        default            common;
        mysite.tld         common;
        www.mysite.tld     common;
        admin.mysite.tld   admin;
        system.mysite.tld  system;
        *.mysite.tld       users;
    }

    root /var/www/mysite/$files;

}

5
क्या आप जानते हैं कि आप server_name mysite.tld * .mysite.tld कर सकते हैं
अज्ञात

8

empty_gifमॉड्यूल भी है बहुत उपयोगी है, खासकर यदि आप (Nagios / monit / आदि का प्रयोग करके) वेबसर्वर से नजर रखने के लिए प्रतिक्रियाओं की जरूरत है:

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 

1
क्या आप इसके लिए एक वास्तविक विश्व उदाहरण प्रदान कर सकते हैं? मुझे अभी भी पूरी तरह से समझ नहीं आया कि यह कैसे उपयोगी है।
पिक्सेल डेवलपर

1
@ पिक्सेल डेवलपर, यह केवल गति के लिए वास्तव में उपयोगी है। Nginx एक खाली GIF के लिए डेटा को मेमोरी में रखता है ताकि उसे डिस्क से लोड न करना पड़े।
अज्ञात

5
access_log off;उन स्थानों के लिए भी आम बात है
SaveTheRbtz

6

हमने इस कुकबुक का उपयोग करते हुए शेफ के साथ नग्नेक्स की स्थापना की, जिसमें डेबियन अपाचे 2 के समान नग्नेक्स कॉन्फ़िगरेशन को संभालने के लिए स्क्रिप्ट शामिल है, और कुछ चूक के साथ नमूना नमूने भी हैं।


5

यहाँ एक रखरखाव पृष्ठ वापस करने के लिए एक अच्छी विधि है। सभी अनुरोधों को फिर से लिखा गया है और सही http कोड लौटाया गया है। (503 सेवा उपलब्ध नहीं)

error_page 503 /maintenance.html;

location /
{
    if (-f $document_root/maintenance.html)
    {
        return 503;
    }

    try_files $uri /index.php?$args;
}

location = /maintenance.html
{
    rewrite ^ /maintenance.html break;
}

1
दरअसल, मैं असहमत हूं - मैंने serverfault.com/questions/18994/nginx-best-practices/… में एक टिप्पणी जोड़ी । असल में, आप एक 503 त्रुटि वापस करना चाहते हैं या फिर बॉट और इंडेक्सर्स सोचेंगे कि आपका रखरखाव पृष्ठ आपकी वास्तविक साइट का हिस्सा है ... ifयदि आप इसे सही तरीके से उपयोग करते हैं तो एक बयान में कुछ भी गलत नहीं है - डॉक्स का कहना है कि ifयदि आप सुरक्षित हैं 'बस कर रहे हैं return xxx;
हारून जिब्राल्टर

इसके अलावा, location = /maintenance.html { break; }आवश्यक है?
एरॉन जिब्राल्टर

4

Nginx 0.7.12 और बाद में, "होस्ट" हेडर के बिना अनुरोधों को पकड़ने के लिए सर्वर_नाम में एक "" प्रयोग करने योग्य है।

आप अपरिभाषित आभासी मेजबानों के लिए एक catchall के रूप में निम्नलिखित का उपयोग कर सकते हैं।

server {
  server_name _ "";
}

क्या आपकी छूट केवल एक अपरिभाषित vhost के साथ अनुरोधों के लिए काम करती है या क्या यह अज्ञात (गलत) vhost के अनुरोधों के साथ भी काम करेगी?
बेनोइट

@ किसी भी चीज़ के लिए यह काम करता है जो परिभाषित नहीं है।
अज्ञात

क्या "server_name _ *" nginx 0.7 पर समर्थित नहीं है?
rahul286

1
कृपया ध्यान दें कि यह केवल आंशिक रूप से सच है। "" एक MISSING होस्ट हेडर को पकड़ लेगा, लेकिन यह एक होस्ट हेडर के साथ एक अनुरोध को नहीं पकड़ेगा जो किसी भी चीज से मेल नहीं खाता है। यदि आप एक कैच-ऑल सर्वर ब्लॉक चाहते हैं तो डिसलाइज़ निर्देश के तहत default_server फ़्लैग देखें।
मार्टिन फॉर्डोर्ड्वाल्ड

3

मैंने कुछ समय पहले यह भी पोस्ट किया था कि कैसे nginx के साथ gzip कम्प्रेशन को ठीक से हैंडल किया जाए क्योंकि पुराने ब्राउज़र में सिर्फ एक कंबल gzip स्टेटमेंट के साथ समस्याएँ हो सकती हैं। HTH।

http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx


3

मुझे नहीं पता कि यह सबसे अच्छा अभ्यास है, लेकिन निश्चित रूप से नेग्नेक्स में नेस्टेड स्थिति प्राप्त करने के लिए एक साफ हैक। यहाँ nginx विकी से एक नमूना है

location /xxxx/ {
  set $test "";

  if ($request_method = POST) {
    set $test  P;
  }

  if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
    set $test  "${test}C";
  }

  if ($test = PC) {
    #rewrite rule goes here.
  } 
}

3
मैं इसे "बदसूरत लेकिन कभी-कभी आवश्यक अभ्यास" की श्रेणी में डाल देता हूं - निश्चित रूप से प्रोत्साहित करने के लिए कुछ नहीं।
Womble

2

यदि आपको उसी सर्वर ब्लॉक द्वारा नियंत्रित उप डोमेन के लिए http और https के बीच प्रासंगिक रूप से फ्लिप करने की आवश्यकता है, तो आप ऐसा करने के लिए चर का उपयोग कर सकते हैं। चीजों को करने का सबसे कुशल तरीका नहीं हो सकता है, लेकिन यह काम करता है:

server {
  server mysite.tld ~^.+\.mysite\.tld$;

  set $req_ssl = 0;

  map $host $files {
      default            common;
      mysite.tld         common;
      www.mysite.tld     common;
      admin.mysite.tld   admin;
      system.mysite.tld  system;
      *.mysite.tld       users;
  }

  root /var/www/mysite/$files;

  if ( $files = "admin" ){
    set $req_ssl 1;
  }

  if ( $files = "common" ){
    set $req_ssl 2;
  }

  if ( $scheme = http )
  {
    set $req_ssl $req_ssl.1;
  }

  if ( $scheme = https )
  {
    set $req_ssl $req_ssl.2;
  }

  if ($req_ssl = 1.1){
    rewrite ^ https://$host$uri;
  }

  if ($req_ssl = 2.2){
    rewrite ^ http://$host$uri;
  }

}

2

मैं हमेशा rootसर्वर ब्लॉक के शीर्ष में निर्देश का उपयोग करने की कोशिश करता हूं ताकि मैं $document_rootचर का लाभ उठा सकूं और कभी नहीं, लेकिन कभी भी, rootनिर्देश को किसी स्थान ब्लॉक के अंदर शामिल न करें ।

नुकसान पृष्ठ Nginx विकी है सर्वोत्तम प्रथाओं के बारे में कुछ बेहतरीन युक्तियां है।


1

यदि आप nginx को एक प्रॉक्सी के रूप में उपयोग कर रहे हैं, तो टाइमआउट सेटिंग्स समायोजित करने के लिए यह सुनिश्चित करना महत्वपूर्ण हो सकता है कि आपके आवेदन से पहले उनके द्वारा किए जाने वाले nginx ड्रॉप कनेक्शन नहीं हैं, खासकर यदि आप एक उच्च ट्रैफ़िक एप्लिकेशन के साथ काम कर रहे हैं:

proxy_connect_timeout
proxy_send_timeout

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.