nginx

שמות שרת


english
русский

简体中文
עברית
日本語
türkçe

חדשות [אנגלית]
אודות
הורדה [אנגלית]
דיווחי אבטחה [אנגלית]
תיעוד
שאלות נפוצות [אנגלית]
קישורים [אנגלית]
תמיכה [אנגלית]

trac
wiki
twitter
nginx.com
This translation may be out of date. Check the English version for recent changes.
שמות Wildcard
שמות ביטויים רגולריים
שמות כלליים
ייעול
תאימות

שמות שרת מוגדרים על ידי המאפיין server_name והם קובעים איזה בלוק תצורת שרת מקובץ התצורה יהיה בשימוש לכל בקשה ובקשה לשרת. ראו גם “How nginx processes a request”. ניתן להגדירם באמצעות שמות מדוייקים, שמות Wildcard, או באמצעות ביטויים רגולריים:

server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

השמות נבדקים בסדר הבא:

  1. שמות מדוייקים;
  2. שמות Wildcard המתחילים בכוכבית: *.example.org;
  3. שמות Wildcard המסתיימים בכוכבית: mail.*;
  4. ביטויים רגולריים לפי הסדר שבו הם מופיעים בקובץ התצורה.

ההתאמה הראשונה עוצרת את החיפוש.

שמות Wildcard

שם wildcard יכול להכיל כוכבית רק בתחילת או בסוף השם, וחייב להיות בגבול של נקודה. השמות www.*.example.org ו w*.example.org הם שגויים. למרות זאת, ניתן לציין שמות כאלה באמצעות ביטויים רגולריים, לדוגמא, ~^www\..+\.example\.org$ ו ~^w.*\.example\.org$. סימן הכוכבית יכול להחליף מספר חלקי שם. השם *.example.org מתאים לא רק ל www.example.org אלא גם ל www.sub.example.org.

ניתן להשתמש ב wildcard מיוחד בצורה של .example.org כדי להתאים גם לשם המדוייק example.org וגם לשם ה wildcard הבא: *.example.org.

שמות ביטויים רגולריים

הביטויים הרגולריים ש nginx משתמש בהם, תואמים לאלה אשר נמצאים בשימוש בשפת פרל (PCRE). כדי להשתמש בביטוי רגולרי, על שם השרת להתחיל עם סימן הטילדה (~), כך:

server_name  ~^www\d+\.example\.net$;

אחרת nginx יתייחס אליו כשם מדוייק, או אם הביטוי מכיל כוכבית, כשם wildcard (וסביר להניח שיהיה שגוי). אל תשכחו להגדיר עוגני “^” ו “$”. הם לא דרושים תחבירית, אם כי לוגית. כמו כן שימו לב שהנקודות של שם המתלם צריכות להיות מוברחות (escaped) על ידי לוכסן הפוך (\). ביטוי רגולרי המכיל את התווים “{” ו “}” צריך להיות במרכאות:

server_name  "~^(?<name>\w\d{1,3}+)\.example\.net$";

אחרת nginx יכשל בעלייה, ויציג את הודעת השגיאה הבאה:

directive "server_name" is not terminated by ";" in ...

ביטוי רגולרי שניתן לו שם ונלכד, ניתן לשימוש מאוחר יותר כמשתנה:

server {
    server_name   ~^(www\.)?(?<domain>.+)$;

    location / {
        root   /sites/$domain;
    }
}

ספריית PCRE תומכת בלכידות מבוססות שם לפי התחביר הבא:

?<name> תחביר תואם פרל 5.10, נתמך החל מ PCRE-7.0
?'name' תחביר תואם פרל 5.10, נתמך החל מ PCRE-7.0
?P<name> תחביר תואם פייתון, נתמך החל מ PCRE-4.0
אם nginx נכשל בעלייה ומציג את הודעת השגיאה הבאה:

pcre_compile() failed: unrecognized character after (?< in ...

פירוש הדבר שספריית ה PCRE היא ישנה, ועליכם לנסות את התחביר ?P<name>. את הלכידה ניתן לבצע גם בצורה ספרתית:

server {
    server_name   ~^(www\.)?(.+)$;

    location / {
        root   /sites/$2;
    }
}

אך יש להשתמש בצורה זו במקרים פשוטים (כמו לעיל), כיוון שהייחוסים הספרתיים יכולים להידרס בקלות

שמות כלליים

אם אף server_name לא מוגדר בבלוג שרת, אזי nginx משתמש ב hostname בתור שם השרת.

אם ברצונכם לעבד בקשות בלי שורת כותר “Host” בבלוק שרת שאינו ברירת המחדל, עליכם לציין שם ריק:

server {
    listen       80;
    server_name  example.org  www.example.org  "";
    ...
}

אם מישהו מבצע בקשה באמצעות כתובת IP במקום שם שרת, שורת הכותר “Host” תכיל כתובת IP, ואפשר יהיה לטפל בבקשה על ידי שימוש בכתובת IP בשם השרת:

server {
    listen       80;
    server_name  example.org
                 www.example.org
                 ""
                 192.168.1.1
                 ;
    ...
}

בדוגמאות catch-all ייתכן ותראו את השם המוזר “_”:

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

אין שום דבר מוזר בשם הזה, הוא רק אחד משלל שמות מתחם שגויים שלעולם לא תפגשו בהם בשם אמיתי. ניתן להשתמש גם ב “--”, “!@#”, וכך הלאה.

nginx בגירסאות עד 0.6.25 תמך בשם המיוחד “*” אשר יש שפירשו אותו בטעות כשם catch-all. השם הזה מעולם לא תפקד כ catch-all ואף לא כשם wildcard. בפועל, הוא סיפק את הפונקציונליות שהיום מסופקת על ידי המאפיין server_name_in_redirect. השם המיוחד “*” הוא כעת לא מומלץ לשימוש, ויש להשתמש במאפיין server_name_in_redirect במקומו. שימו לב שאין דרך לציין את שם ה catch-all או את שרת ברירת המחדל על ידי שימוש במאפיין server_name. זוהי תכונה של המאפיין listen ולא של המאפיין server_name. ראו גם “How nginx processes a request”. באפשרותכם להגדיר שרתים המאזינים על פורטים *:80 ו *:8080, ולהגדיר שרת אחת שהוא ברירת המחדל עבור פורט *:8080, בעוד שהשני יהיה ברירת מחדל עבור פורט *:80:

server {
    listen       80;
    listen       8080  default_server;
    server_name  example.net;
    ...
}

server {
    listen       80  default_server;
    listen       8080;
    server_name  example.org;
    ...
}

ייעול

שמות מדוייקים ושמות wildcard מאוחסנים בגיבוב (hash). הגיבובים מקושרים להאזנות לפורטים, ולכן פורט האזנה יכולים להיות עד שלושה גיבויים: גיבוב שם מדוייק, גיבוי שמות wildcard שמתחילים בכוכבית, וגיבוב שמות wildcard שמסתיימים בכוכבית. הגודל של הגיבובים מיועל בשלב התצורה כך שניתן יהיה למצוא שם עם הכי מעט פספוסי מטמון מעבד. גיבוב השמות המדוייקים עובר חיפוש ראשון. אם שם לא נמצא בגיבוב השמות המדוייק, מתחיל חיפוש בגיבוב השמות המתחילים בכוכבית. אם הוא לא נמצא גם שם, מתחיל חיפוש בגיבוב השמות המסתיימים בכוכבית. חיפוש בגיבובי שמות wildcard הוא איטי יותר מחיפוש שם בגיבוב השמות המדוייקים כיוון ששמות עוברים חיפוש על פי חלקי שם המתחם. שימו לב שצורת ה wildcard המיוחדת .example.org שמורה גם היא בגיבוב שמות ה wildcard ולא בגיבוב השמות המדוייקים. ביטויים רגולריים נבדקים באופן סדרתי, ועל כן הם השיטה האיטית ביותר ואינם סקאלאביליים.

בהתחשב בנסיבות אלה, הכי טוב להשתמש בשמות מדוייקים בכל מקום שהדבר אפשרי. לדוגמה, אם השמות הנפוצים ביותר לשרת הם example.org ו www.example.org, יותר יעיל להגדיר אותם באופן מפורש:

server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}

מאשר להשתמש בשיטה המופשטת:

server {
    listen       80;
    server_name  .example.org;
    ...
}

אם הגדרתם מספר גדול של שמות שרת, או שהגדרתם שמות שרת ארוכים מהרגיל, ייתכן ויהיה עליכם לכוונן את המאפיינים server_names_hash_max_size ו server_names_hash_bucket_size ברמת ה http. ערך ברירת המחדל של server_names_hash_bucket_size יכול להיות שווה ל 32, ל 64, או לערך אחר, בהתאם לגודל קו המטמון של המעבד שלכם. אם ברירת המחדל היא 32 ותגדירו “too.long.server.name.example.org” בתור שם שרת, אזי nginx ייכשל בעלייה ויציג את הודעת השגיאה הבאה:

could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32

במקרה זה, עליכם להגדיר את ערך המאפיין לחזקה הבאה של 2:

http {
    server_names_hash_bucket_size  64;
    ...

אם הגדרתם כמות גדולה של שמות שרת, אתם עלולים לקבל את הודעת השגיאה הבאה:

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32

עליכם לנסות קודם להגדיל את server_names_hash_max_size למספר קרוב למספר השרתים. רק אם זה לא עזר, או שזמן העלייה של nginx הוא ארוך בצורה מוגזמת, נסו להגדיל את server_names_hash_bucket_size.

אם שרת הוא השרת היחיד עבור פורט האזנה, אזי nginx לא יבדוק שמות שרת בכלל (ולא יבנה גיבובים עבור פורט ההאזנה). אך, יש יוצא דופן אחד. אם server_name הוא ביטוי רגולרי עם לכידות, nginx חייב לבצע את הביטוי כדי לקבל את מה שנלכד בהן.

תאימות

  • לכידת שמות בביטויים רגולריים נתמכה החל מגירסה 0.8.25.
  • לכידת ביטויים רגולריים נתמכה החל מגירסה 0.7.40.
  • שם שרת ריק “” נתמך החל מגירסה 0.7.12.
  • שם שרת מסוג wildcard או ביטוי רגולרי נתמכו לשימוש כשם שרת ראשון החל מגירסה 0.6.25.
  • שמות שרת כביטוי רגולרי נתמכו החל מגירסה 0.6.7.
  • צורות Wildcard מסוג example.* נתמכו החל מגירסה 0.6.0.
  • הצורה המיוחדת .example.org נתמכה החל מגירסה 0.3.18.
  • הצורה *.example.org נתמכה החל מגירסה 0.1.13.

נכתב על ידי Igor Sysoev
תורגם על ידי מבזקים.נט