nginx ไม่มี server_name และใช้ที่อยู่ IP แบบคงที่เท่านั้น


34

นี่คือการปรับใช้เว็บแอปแรกของฉันและฉันพบปัญหาทุกประเภท

ฉันกำลังจะใช้งาน nginx + gunicorn สำหรับแอป Django แต่ส่วนใหญ่คำถามนี้เกี่ยวข้องกับการกำหนดค่า nginx สำหรับบริบทบางอย่าง - nginx จะได้รับการเชื่อมต่อและพร็อกซีไปยังเซิร์ฟเวอร์ภายในของ gunicorn

ในการกำหนดค่า nginx server_nameฉันจะต้องระบุที่ใด ฉันไม่ได้วางแผนที่จะใช้ชื่อโดเมนใด ๆ เพียงแค่ใช้ ip ภายนอกของเครือข่าย (เป็นแบบคงที่) และหมายเลขพอร์ตเพื่อรับฟัง

ความปรารถนาของฉันคือเมื่อฉันเข้าถึงบางสิ่งบางอย่างเช่นhttp://xxx.xxx.xxx.xxx:9050ฉันจะได้รับเว็บไซต์

ต่อไปนี้เป็นตัวอย่างรหัสที่ฉันจะตั้งค่าฐานสำหรับการอ้างอิง

   server {
        listen   80;
        server_name WHAT TO PUT HERE?;

    root /path/to/test/hello;

    location /media/ {
        # if asset versioning is used
        if ($query_string) {
            expires max;
        }
    }
    location /admin/media/ {
        # this changes depending on your python version
        root /path/to/test/lib/python2.6/site-packages/django/contrib;
    }
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8000/;
    }
        # what to serve if upstream is not available or crashes
        error_page 500 502 503 504 /media/50x.html;
     }

คำตอบ:


31

server_nameเริ่มต้นเป็นสตริงว่างเปล่าซึ่งเป็นเรื่องปกติ; คุณสามารถยกเว้นได้อย่างสมบูรณ์

วิธีการทั่วไปอื่นสำหรับความต้องการ "ฉันไม่ต้องการใส่ชื่อนี้" คือการใช้ server_name _;

http://xxx.xxx.xxx.xxx:9050แม้ว่า URL ของคุณจะไม่ทำงานกับการกำหนดค่านี้ แต่; คุณกำลังฟังบนพอร์ต 80 เท่านั้นคุณจะต้องเพิ่มlisten 9050;เช่นกัน


เฮ้คุณสามารถดูserverfault.com/questions/678521/
Muhammad Umer

ค่อนข้างเกี่ยวข้อง
Muhammad Umer

5

ชื่อเซิร์ฟเวอร์ _; ไม่ใช่ wildcard ดูที่นี่:

http://blog.gahooa.com/2013/08/21/nginx-how-to-specify-a-default-server

เพียงระบุคำสั่ง default_server สำหรับการเข้าถึงแบบ ip เท่านั้น (ดูhttp://nginx.org/en/docs/http/request_processing.html )

server {
    listen 1.2.3.4:80 default_server;
    ... 
    }

2
เราไม่แนะนำให้ลิงก์ไปยังส่วนข้อมูลที่มีประโยชน์และไม่รวมไว้ในคำตอบของคุณ - ในกรณีนี้ว่าserver_name _;ไม่ใช่ข้อมูลที่ตรงกัน
BE77Y

1
"ไม่ใช่ wildcard" == "ไม่ใช่การจับคู่" ฉันแน่ใจว่าพวกเขาจะได้รับ
โจ

2
ทั้งสองไม่เท่ากัน ไม่ใช่การจับคู่คือสิ่งที่ให้บริการเมื่อไม่มีสิ่งใดที่ตรงกันในขณะที่ไวด์การ์ดตรงกับทุกสิ่ง จุดที่นี่คือว่าข้อมูลที่มีประโยชน์ควรอยู่ในคำตอบไม่ได้เชื่อมโยงกับเว็บไซต์อื่น ๆ (แต่นำเสนอได้ดีบนไซต์นั้น) ตามรายละเอียดที่นี่
BE77Y

และประเด็นก็คือว่านี่ไม่ใช่คำตอบที่ดี แต่เป็นคำตอบ ขอโทษที่ไม่มีเวลา หากคุณต้องการแก้ไข / เขียนใหม่ฉันให้สิทธิ์เต็มที่แก่คุณ มิฉะนั้นพวกเขาจะรู้ว่าต้องทำอะไรและมีประโยชน์ อย่าลังเลที่จะเขียนซ้ำมิฉะนั้นคำตอบจะอยู่ที่
โจ

3
หากคุณไม่มีเวลาที่จะรวมบรรทัดเพิ่มเติมกับข้อมูลที่เกี่ยวข้องฉันไม่ทราบว่าทำไมคุณใส่ใจที่จะตอบโพสต์เก่า 3 ปีพร้อมคำตอบที่ยอมรับ!
BE77Y

4

หากคุณต้องการให้แอปของคุณตอบสนองบนพอร์ต 9050 โดยไม่มีชื่อโฮสต์ที่เฉพาะเจาะจงคุณสามารถข้าม server_name ได้โดยไม่จำเป็นเนื่องจาก Nginx แก้ไขรายการฟังก่อนแล้วจึงจะมีชื่อเซิร์ฟเวอร์ถ้ามี:

server {
   listen 9050;

   .....
}

รายละเอียดเพิ่มเติมได้ที่นี่: Nginx server_name และวิธีการทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.