view xml/he/docs/http/server_names.xml @ 2735:ff357b676c2e

Removed trailing spaces.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 10 Jun 2021 18:27:24 +0300
parents 130fad6dc1b4
children
line wrap: on
line source

<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">

<article name="שמות שרת"
         link="/he/docs/http/server_names.html"
         lang="he"
         author="Igor Sysoev"
         translator="מבזקים.נט">

<section>

<para>
שמות שרת מוגדרים על ידי המאפיין <literal>server_name</literal>
והם קובעים איזה בלוק תצורת שרת מקובץ התצורה יהיה בשימוש לכל בקשה ובקשה לשרת.
ראו גם &ldquo;<link doc="../../../en/docs/http/request_processing.xml" />&rdquo;.
ניתן להגדירם באמצעות שמות מדוייקים, שמות Wildcard, או באמצעות ביטויים רגולריים:

<programlisting>
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  ~^(?&lt;user&gt;.+)\.example\.net$;
    ...
}
</programlisting>

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

<list type="enum">

<listitem>
שמות מדוייקים;
</listitem>

<listitem>
שמות Wildcard המתחילים בכוכבית: <literal>*.example.org</literal>;
</listitem>

<listitem>
שמות Wildcard המסתיימים בכוכבית: <literal>mail.*</literal>;
</listitem>

<listitem>
ביטויים רגולריים לפי הסדר שבו הם מופיעים בקובץ התצורה.
</listitem>

</list>
ההתאמה הראשונה עוצרת את החיפוש.
</para>

</section>


<section id="wildcard_names"
        name="שמות Wildcard">

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

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

</section>


<section id="regex_names"
        name="שמות ביטויים רגולריים">

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

<programlisting>
server_name  ~^www\d+\.example\.net$;
</programlisting>

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

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

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

<programlisting>
directive "server_name" is not terminated by ";" in ...
</programlisting>

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

<programlisting>
server {
    server_name   ~^(www\.)?(<b>?&lt;domain&gt;</b>.+)$;

    location / {
        root   /sites/<b>$domain</b>;
    }
}
</programlisting>

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

<table note="yes">

<tr>
<td><literal>?&lt;<value>name</value>&gt;</literal></td>
<td>תחביר תואם פרל 5.10, נתמך החל מ PCRE-7.0</td>
</tr>

<tr>
<td><literal>?'<value>name</value>'</literal></td>
<td>תחביר תואם פרל 5.10, נתמך החל מ PCRE-7.0</td>
</tr>

<tr>
<td><literal>?P&lt;<value>name</value>&gt;</literal></td>
<td>תחביר תואם פייתון, נתמך החל מ PCRE-4.0</td>
</tr>

</table>

אם nginx נכשל בעלייה ומציג את הודעת השגיאה הבאה:

<programlisting>
pcre_compile() failed: unrecognized character after (?&lt; in ...
</programlisting>

פירוש הדבר שספריית ה PCRE היא ישנה, ועליכם לנסות את התחביר
<literal>?P&lt;<value>name</value>&gt;</literal>.

את הלכידה ניתן לבצע גם בצורה ספרתית:

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

    location / {
        root   /sites/<b>$2</b>;
    }
}
</programlisting>

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


</section>


<section id="miscellaneous_names"
        name="שמות כלליים">

<para>
אם אף <literal>server_name</literal> לא מוגדר בבלוג שרת,
אזי nginx משתמש ב <i>hostname</i> בתור שם השרת.
</para>

<para>
אם ברצונכם לעבד בקשות בלי שורת כותר &ldquo;Host&rdquo;
בבלוק שרת שאינו ברירת המחדל, עליכם לציין שם ריק:

<programlisting>
server {
    listen       80;
    server_name  example.org  www.example.org  "";
    ...
}
</programlisting>
</para>

<para>
אם מישהו מבצע בקשה באמצעות כתובת IP במקום שם שרת, שורת הכותר
&ldquo;Host&rdquo; תכיל כתובת IP, ואפשר יהיה לטפל בבקשה על ידי
שימוש בכתובת IP בשם השרת:

<programlisting>
server {
    listen       80;
    server_name  example.org
                 www.example.org
                 ""
                 <b>192.168.1.1</b>
                 ;
    ...
}
</programlisting>
</para>

<para>
בדוגמאות catch-all ייתכן ותראו את השם המוזר &ldquo;_&rdquo;:

<programlisting>
server {
    listen       80  default_server;
    server_name  _;
    return       444;
}
</programlisting>

אין שום דבר מוזר בשם הזה, הוא רק אחד משלל שמות מתחם שגויים שלעולם לא
תפגשו בהם בשם אמיתי.
ניתן להשתמש גם ב &ldquo;--&rdquo;, &ldquo;!@#&rdquo;, וכך הלאה.
</para>

<para>
nginx בגירסאות עד 0.6.25 תמך בשם המיוחד &ldquo;*&rdquo;
אשר יש שפירשו אותו בטעות כשם catch-all.
השם הזה מעולם לא תפקד כ catch-all ואף לא כשם wildcard.
בפועל, הוא סיפק את הפונקציונליות שהיום מסופקת על ידי
המאפיין <literal>server_name_in_redirect</literal>.
השם המיוחד  &ldquo;*&rdquo; הוא כעת לא מומלץ לשימוש, ויש
להשתמש במאפיין <literal>server_name_in_redirect</literal> במקומו.
שימו לב שאין דרך לציין את שם ה catch-all או את שרת <i>ברירת המחדל</i>
על ידי שימוש במאפיין <literal>server_name</literal>.
זוהי תכונה של המאפיין <literal>listen</literal> ולא של המאפיין <literal>server_name</literal>.
ראו גם &ldquo;<link doc="../../../en/docs/http/request_processing.xml" />&rdquo;.

באפשרותכם להגדיר שרתים המאזינים על פורטים <literal>*:80</literal> ו <literal>*:8080</literal>,
ולהגדיר שרת אחת שהוא ברירת המחדל עבור פורט
 <literal>*:8080</literal>, בעוד שהשני יהיה ברירת מחדל עבור פורט <literal>*:80</literal>:

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

server {
    listen       80  default_server;
    listen       8080;
    server_name  example.org;
    ...
}
</programlisting>
</para>


</section>


<section id="optimization"
        name="ייעול">

<para>

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

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

<programlisting>
server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}
</programlisting>

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

<programlisting>
server {
    listen       80;
    server_name  .example.org;
    ...
}
</programlisting>
</para>

<para>
אם הגדרתם מספר גדול של שמות שרת, או שהגדרתם שמות שרת ארוכים מהרגיל,
ייתכן ויהיה עליכם לכוונן את המאפיינים <literal>server_names_hash_max_size</literal>
ו <literal>server_names_hash_bucket_size</literal> ברמת ה <i>http</i>.
ערך ברירת המחדל של <literal>server_names_hash_bucket_size</literal>
יכול להיות שווה ל 32, ל 64, או לערך אחר, בהתאם לגודל קו המטמון של המעבד שלכם.
אם ברירת המחדל היא 32 ותגדירו
&ldquo;too.long.server.name.example.org&rdquo; בתור שם שרת,
אזי nginx ייכשל בעלייה ויציג את הודעת השגיאה הבאה:

<programlisting>
could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32
</programlisting>

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

<programlisting>
http {
    server_names_hash_bucket_size  64;
    ...
</programlisting>

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

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

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

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

</section>


<section id="compatibility"
        name="תאימות">

<para>
<list type="bullet">

<listitem>
לכידת שמות בביטויים רגולריים נתמכה החל מגירסה 0.8.25.
</listitem>

<listitem>
לכידת ביטויים רגולריים נתמכה החל מגירסה 0.7.40.

</listitem>

<listitem>
שם שרת ריק &ldquo;&rdquo; נתמך החל מגירסה 0.7.12.
</listitem>

<listitem>
שם שרת מסוג wildcard או ביטוי רגולרי נתמכו לשימוש כשם שרת ראשון החל מגירסה 0.6.25.
</listitem>

<listitem>
שמות שרת כביטוי רגולרי נתמכו החל מגירסה 0.6.7.
</listitem>

<listitem>
צורות Wildcard מסוג <literal>example.*</literal> נתמכו החל מגירסה 0.6.0.
</listitem>

<listitem>
הצורה המיוחדת <literal>.example.org</literal> נתמכה החל מגירסה 0.3.18.
</listitem>

<listitem>
הצורה <literal>*.example.org</literal> נתמכה החל מגירסה 0.1.13.
</listitem>

</list>
</para>

</section>

</article>