เว็บไซต์หลายแห่งบน nginx หนึ่ง IP


14

ดังนั้นฉันใช้มหาสมุทรดิจิตอลและ nginx ฉันต้องการโฮสต์เว็บไซต์หลายแห่ง (โครงการของฉัน) แต่ไม่ต้องการซื้อโดเมนสำหรับแต่ละแห่ง

มีวิธีโฮสต์หลายเว็บไซต์ใน nginx และมหาสมุทรดิจิทัลในขณะที่เข้าถึงเว็บไซต์โดยใช้หนึ่ง ip หรือไม่


ฝากไว้ในโฟลเดอร์อื่น ( X.Y.Z.W/foo, X.Y.Z.W/bar) หรือไม่ ทำไมคุณไม่สามารถรับโดเมนได้ (คุณสามารถกำหนด IP เดียวกันให้กับหลาย ๆ โดเมนได้)
muru

คุณจะต้องมีหลายโดเมนในการดำเนินการดังกล่าว มีบริการโดเมนฟรีคือ: freenom.com ให้โดเมนฟรี. tk, .ml, .ga, .cf และ. gq
TheWanderer

@muru ฉันคิดว่าพวกเขาไม่ต้องการใช้เงินในหลายโดเมน พวกเขาต้องการวิธีที่จะมีหลายเว็บไซต์ในหนึ่ง URL
TheWanderer

@ Zacharee1 พวกเขาต้องการเพียงหนึ่งโดเมนและสามารถทำโดเมนย่อยได้ หากพวกเขาปฏิเสธที่จะทำเช่นนั้นพวกเขาจะต้องทำตามวิธีการที่ใช้ IP ที่ชั่วร้ายซึ่งขึ้นอยู่กับประเภทของแอปพลิเคชัน / โครงการที่พวกเขาใช้อาจไม่สามารถรองรับวิธีการระบุตำแหน่ง 'โฟลเดอร์ย่อย'
Thomas Ward

@ThomasW ฉันคิดว่าโดเมนย่อยจะไม่เป็นตัวเลือก
TheWanderer

คำตอบ:


17

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

ฉันไม่แนะนำวิธีการที่อยู่ IP หากเพียงเพราะมันเป็นเรื่องเลวร้ายมากที่จะต้องจำที่อยู่ IP และถ้าคุณลองใช้ข้อมูลร่วมกันกับผู้อื่นคุณก็มีปัญหาเดียวกันกับที่คนอื่นต้องจำที่อยู่ IP


one-IP, โฟลเดอร์ย่อยจำนวนมากเข้ามาโดยไม่มีชื่อโดเมน

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


คำเตือน : ในการทดสอบตัวอย่างเหล่านี้อย่างต่อเนื่องพบว่าวิธีการ "หนึ่งโดเมนไดเรกทอรีย่อยจำนวนมาก" ไม่ได้ดำเนินการกรุณาย้อนกลับข้อมูลที่เป็นพร็อกซีไปยังส่วนหลังเนื่องจาก URI ที่ร้องขอจะรวมไดเรกทอรีย่อยภายใน URI สิ่งนี้อาจทำให้เซิร์ฟเวอร์ส่วนหลังมีปัญหาในการทำงานอย่างถูกต้อง

บน nginxด้านข้างเราต้องทำ 'ชั่ว' วิธีนี้ - หนึ่งที่อยู่ IP, docroots จำนวนมากและตำแหน่งย่อย นี่เป็นวิธีการที่ชั่วร้ายมากและอาจทำให้เกิดปัญหากับเฟรมเวิร์กของเว็บจำนวนมาก

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

สร้าง/etc/nginx/sites-available/my-projectsด้วยสิ่งต่อไปนี้ (ใช้สิ่งนี้เป็นเทมเพลต / คู่มือ - ถือว่าสามโครงการด้วย HTML แบบคงที่และไม่มีแอปพลิเคชันเว็บแบบไดนามิกใน PHP หรือหลามหรือคล้ายกันและคุณสามารถคัดลอกบล็อกสถานที่แต่ละแห่งและสร้างสถานที่ใหม่ ๆ IP ของเซิร์ฟเวอร์คือ1.2.3.4)

server {
    listen 80 default_server;

    server_name 1.2.3.4;

    location / {
        return 410;  # Default root of site won't exist.
    }

    location /proj1/ {
        alias /var/www/proj1;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

    location /proj2/ {
        alias /var/www/proj2;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }

    location /proj3/ {
        alias /var/www/proj3;
        try_files $uri $uri/ =404;

        # any additional configuration for non-static content
    }
}

ตอนนี้เราแทนที่การตั้งค่าเริ่มต้น (ลบออก) และเพิ่มของเรา:

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/my-projects /etc/nginx/sites-enabled

จากนั้นเริ่มnginxบริการใหม่:

# If on 14.04, use this:
sudo service nginx restart

# If on 15.10 or newer, use this:
sudo systemctl restart nginx

วิธีการหนึ่งโดเมนโดเมนย่อยหลายวิธี

ส่วนคำตอบนี้จะถือว่าคุณมีหนึ่งโดเมนและหลายโดเมนย่อยในนั้น หากคุณไม่มีสิ่งนี้โปรดชี้แจงในคำถามของคุณ

ด้วยแต่ละnginx server {}บล็อกในการกำหนดค่าคุณจะต้องกำหนดชื่อเซิร์ฟเวอร์และอาจตั้งค่าเซิร์ฟเวอร์บล็อกที่สี่เป็น 'catch all' สำหรับคำขออื่น ๆ

ตัวอย่าง:proj1ฉันมีสามโครงการ proj2, proj3, ฉันมีโดเมนชื่อevil-projects.net(หมายเหตุ: ไม่มีอยู่จริง) ฉันต้องการสามโดเมนย่อยที่แตกต่างกันหนึ่งโดเมนสำหรับแต่ละnginxการกำหนดค่าซึ่งจะชี้ไปที่หนึ่งโครงการในแต่ละ เซิร์ฟเวอร์ของฉันอยู่ที่ 1.2.3.4 และจะให้บริการทุกไซต์

จากสถานการณ์ข้างต้นเรามีสองส่วน: โดเมนและโดเมนย่อยและการกำหนดค่าเซิร์ฟเวอร์

(1): การกำหนดค่า DNS

ตั้งค่า DNS ของคุณที่โฮสต์ของคุณดังต่อไปนี้เป็นจริงกับระเบียน DNS:

evil-projects.net  IN A  1.2.3.4
proj1.evil-projects.net  IN A  1.2.3.4
proj2.evil-projects.net  IN A  1.2.3.4
proj3.evil-projects.net  IN A  1.2.3.4

(2): การกำหนดค่า NGINX ที่เซิร์ฟเวอร์ (1.2.3.4)

ตอนนี้สำหรับnginxการกำหนดค่าของคุณ ฉันสมมติว่าคุณกำลังจะมีการตั้งค่าเริ่มต้น nginx และแพ็คเกจจาก Repositories (ฉันจะใช้ 14.04 เป็นตัวอย่างพื้นฐาน) เราจะใส่ไฟล์การกำหนดค่าสี่ไฟล์ไว้/etc/nginx/sites-availableก่อน คุณอาจจำเป็นต้องใช้เมื่อมีการสร้างไฟล์เหล่านี้เป็นโฟลเดอร์ในคำถามเป็นเจ้าของโดยsudoroot

/etc/nginx/sites-available/catch-all- นี่จะเป็น 'catch all' สำหรับโดเมนที่ไม่ได้ค่าใด ๆ ฉันชอบส่งคืนรหัสข้อผิดพลาด http 410 (GONE)

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

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

/etc/nginx/sites-available/proj1.evil-projects.net:

server {
    listen 80;

    server_name proj1.evil-projects.net;

    root /var/www/proj1;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/sites-available/proj2.evil-projects.net:

server {
    listen 80;

    server_name proj2.evil-projects.net;

    root /var/www/proj2;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

/etc/nginx/sites-available/proj3.evil-projects.net:

server {
    listen 80;

    server_name proj3.evil-projects.net;

    root /var/www/proj3;
    index index.htm index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

จากนั้นเราจะต้องลบการกำหนดค่า 'เริ่มต้น' ออก/etc/nginx/sites-enabledและเพิ่มของเราเอง ต้องการอีกครั้งsudoที่นี่

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/proj1.evil-projects.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/proj2.evil-projects.net /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/proj3.evil-projects.net /etc/nginx/sites-enabled/

จากนั้นเราเริ่มnginxกระบวนการใหม่:

# If on 14.04, use this:
sudo service nginx restart

# If on 15.04 or newer, use this:
sudo systemctl restart nginx

เมื่อ DNS เผยแพร่แล้วไซต์จะทำงานตามที่ควรจะเป็น


ในการกำหนดค่านี้คุณจะวางบล็อกสำหรับ proxy_cache ไว้ที่ไหน สมมติว่า proj1, proj2, proj3 มีปลายทางเดียวกันทั้งหมดที่มีรูตต่างกันและต้องการแคชการตอบสนองในโฟลเดอร์ที่ต่างกัน
user305883

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