ดังนั้นฉันใช้มหาสมุทรดิจิตอลและ nginx ฉันต้องการโฮสต์เว็บไซต์หลายแห่ง (โครงการของฉัน) แต่ไม่ต้องการซื้อโดเมนสำหรับแต่ละแห่ง
มีวิธีโฮสต์หลายเว็บไซต์ใน nginx และมหาสมุทรดิจิทัลในขณะที่เข้าถึงเว็บไซต์โดยใช้หนึ่ง ip หรือไม่
ดังนั้นฉันใช้มหาสมุทรดิจิตอลและ nginx ฉันต้องการโฮสต์เว็บไซต์หลายแห่ง (โครงการของฉัน) แต่ไม่ต้องการซื้อโดเมนสำหรับแต่ละแห่ง
มีวิธีโฮสต์หลายเว็บไซต์ใน nginx และมหาสมุทรดิจิทัลในขณะที่เข้าถึงเว็บไซต์โดยใช้หนึ่ง ip หรือไม่
คำตอบ:
มีสองวิธีในการบรรลุเป้าหมายนี้ ไม่ว่าคุณจะทำทุกอย่างตามที่อยู่ IP ที่มีสถานที่โฟลเดอร์ย่อยหรือคุณจะต้องซื้ออย่างใดอย่างหนึ่งโดเมนและมีโดเมนย่อยหลายโดเมนในโดเมนนั้น (โดเมนย่อยไม่ควรมีค่าใช้จ่ายใด ๆ หากคุณซื้อโดเมน แต่ตรวจสอบกับผู้รับจดทะเบียนของคุณ)
ฉันไม่แนะนำวิธีการที่อยู่ IP หากเพียงเพราะมันเป็นเรื่องเลวร้ายมากที่จะต้องจำที่อยู่ IP และถ้าคุณลองใช้ข้อมูลร่วมกันกับผู้อื่นคุณก็มีปัญหาเดียวกันกับที่คนอื่นต้องจำที่อยู่ 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 และจะให้บริการทุกไซต์
จากสถานการณ์ข้างต้นเรามีสองส่วน: โดเมนและโดเมนย่อยและการกำหนดค่าเซิร์ฟเวอร์
ตั้งค่า 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
ตอนนี้สำหรับnginx
การกำหนดค่าของคุณ ฉันสมมติว่าคุณกำลังจะมีการตั้งค่าเริ่มต้น nginx และแพ็คเกจจาก Repositories (ฉันจะใช้ 14.04 เป็นตัวอย่างพื้นฐาน) เราจะใส่ไฟล์การกำหนดค่าสี่ไฟล์ไว้/etc/nginx/sites-available
ก่อน คุณอาจจำเป็นต้องใช้เมื่อมีการสร้างไฟล์เหล่านี้เป็นโฟลเดอร์ในคำถามเป็นเจ้าของโดยsudo
root
/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 เผยแพร่แล้วไซต์จะทำงานตามที่ควรจะเป็น
X.Y.Z.W/foo
,X.Y.Z.W/bar
) หรือไม่ ทำไมคุณไม่สามารถรับโดเมนได้ (คุณสามารถกำหนด IP เดียวกันให้กับหลาย ๆ โดเมนได้)