Beberapa situs web di nginx, satu IP

14

Jadi saya menggunakan digital ocean dan nginx. Saya ingin meng-host beberapa situs web (proyek saya) tetapi tidak ingin membeli domain untuk masing-masing situs.

Apakah ada cara untuk meng-host beberapa situs web di nginx dan laut digital saat mengaksesnya menggunakan satu ip itu?

Kode Bros
sumber
Host mereka di folder yang berbeda ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Mengapa Anda tidak bisa mendapatkan domain untuk mereka? (Anda dapat menetapkan IP yang sama untuk banyak domain)?
muru
Anda perlu beberapa domain untuk melakukan itu. Namun, ada layanan domain gratis: freenom.com memberi Anda domain .tk, .ml, .ga, .cf, dan .gq gratis.
TheWanderer
@muru Saya pikir mereka tidak ingin menghabiskan uang di banyak domain. Mereka ingin beberapa cara memiliki beberapa situs web di satu URL.
TheWanderer
@ Zacharee1 mereka hanya membutuhkan satu domain, dan dapat melakukan subdomain. Jika mereka menolak untuk melakukan itu, mereka harus melakukan metode jahat berbasis IP, yang tergantung pada jenis aplikasi / proyek yang mereka gunakan mungkin tidak dapat mendukung metode lokasi 'subfolder'.
Thomas Ward
@ Thomas. Saya berpikir sub domain tidak akan menjadi pilihan
TheWanderer

Jawaban:

17

Ada dua cara untuk mencapai ini. Entah Anda melakukan semuanya berdasarkan alamat IP, dengan lokasi subfolder, atau Anda perlu membeli satu domain dan kemudian memiliki beberapa subdomain pada domain itu (subdomain tidak boleh dikenakan biaya apa pun, jika Anda membeli domain, tetapi periksa dengan registrar Anda).

Saya tidak menyarankan metode alamat IP jika hanya karena sangat jahat harus mengingat alamat IP, dan jika Anda mencoba berbagi informasi kepada orang lain, Anda juga memiliki masalah yang sama dengan orang lain yang harus mengingat alamat IP.


Pendekatan satu-IP, banyak subfolder, tanpa nama domain

MEMPERHATIKAN! Kami tidak memiliki informasi tentang proyek yang sedang Anda kerjakan. Kami perlu tahu lebih banyak untuk menentukan apakah Anda dapat melakukan pendekatan ini, karena banyak kerangka kerja web tidak akan berfungsi tanpa nama domain yang benar terkait dengannya.


PERINGATAN : Dalam pengujian berkelanjutan terhadap contoh-contoh ini, ditemukan bahwa pendekatan "Satu domain, banyak subdirektori" tidak dengan baik hati melakukan reverse-proxy data ke backend, karena URI yang diminta akan menyertakan subdirektori dalam URI; ini mungkin membuat server backend memiliki masalah dalam berperilaku dengan benar.

Di nginxsisi, kita perlu melakukan pendekatan 'jahat' untuk ini - satu alamat IP, banyak lokasi dokumen dan subfolder. Ini adalah pendekatan yang sangat sangat jahat dan dapat menyebabkan banyak masalah dengan beberapa kerangka kerja web.

Dengan anggapan nginxinstalasi default sebagai basis dari repositori, maka kita harus membuat konfigurasi situs untuk menangani setiap permintaan subdirektori proyek. Maka kita harus menghubungkannya di lokasi yang tepat.

Buat /etc/nginx/sites-available/my-projectsdengan yang berikut (gunakan ini sebagai templat / panduan - ini mengasumsikan tiga proyek dengan HTML statis dan tidak ada aplikasi web dinamis dalam PHP atau python atau yang serupa, dan Anda dapat menyalin masing-masing blok lokasi dan membuat lokasi baru sesuai; itu juga mengasumsikan Anda IP server adalah 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
    }
}

Sekarang kita ganti konfigurasi default (hapus) dan tambahkan milik kita:

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

Dan kemudian restart nginxlayanan:

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

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

Pendekatan satu domain, banyak subdomain.

Bagian jawaban ini menganggap Anda memiliki satu domain dan beberapa subdomain di dalamnya. Jika Anda tidak memiliki ini, harap klarifikasi dalam pertanyaan Anda

Dengan setiap nginx server {}blok dalam konfigurasi, Anda perlu menentukan nama server, dan kemungkinan mengatur blok server keempat sebagai 'tangkap semua' untuk permintaan lainnya.

Contoh: Saya memiliki tiga proyek, proj1, proj2, proj3. Saya memiliki domain bernama evil-projects.net(CATATAN: Tidak ada benar-benar). Saya ingin tiga subdomain yang berbeda, satu untuk setiap nginxkonfigurasi yang akan menunjuk ke satu proyek masing-masing. Server saya berada di 1.2.3.4, dan akan melayani semua situs.

Dengan skenario di atas, kami memiliki dua bagian: domain dan subdomain, dan konfigurasi server.

(1): Konfigurasi DNS

Siapkan DNS Anda di host Anda sedemikian rupa sehingga yang berikut ini benar dengan catatan 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): Konfigurasi NGINX di server (1.2.3.4)

Sekarang untuk nginxkonfigurasi Anda . Saya berasumsi Anda akan memiliki setup nginx default dan paket-paket dari Repositori (saya akan menggunakan 14,04 sebagai contoh dasar). Kami akan memiliki empat file konfigurasi /etc/nginx/sites-available, pertama. Anda mungkin perlu menggunakan sudosaat membuat file-file ini, karena folder tersebut dimiliki oleh root.

/etc/nginx/sites-available/catch-all- ini akan menjadi 'tangkap semua' untuk domain yang tidak valid. Saya suka mengembalikan kode kesalahan http 410 (PERGI).

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

Selanjutnya, kami mengatur konfigurasi untuk situs / proyek Anda. Saya akan menganggap mereka semua file statis. Masing-masing menyiratkan bahwa Anda memiliki direktori web yang berbeda untuk setiap proyek di server juga ('akar dokumen' berbeda)

/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;
    }
}

Kami kemudian harus menghapus konfigurasi 'default' dari /etc/nginx/sites-enabled, dan menambahkan milik kami. Lagi-lagi sudodiperlukan di sini.

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/

Dan kemudian kita memulai kembali nginxproses:

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

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

Setelah DNS menjalar, situs akan berfungsi sebagaimana mestinya.

Thomas Ward
sumber
dalam konfigurasi ini di mana Anda menempatkan blok untuk proxy_cache? Misalkan proj1, proj2, proj3 memiliki semua titik akhir yang sama, dengan akar yang berbeda, dan ingin menyimpan respons cache pada folder yang berbeda.
user305883
@ user305883 Kedengarannya seperti itu pertanyaan baru.
Thomas Ward