Nhiều trang web trên nginx, một IP


14

Vì vậy, tôi đang sử dụng đại dương kỹ thuật số và nginx. Tôi muốn lưu trữ nhiều trang web (dự án của tôi) nhưng không muốn mua tên miền cho mỗi trang.

Có cách nào để lưu trữ nhiều trang web trên nginx và đại dương kỹ thuật số trong khi truy cập chúng bằng một ip đó không?


Lưu trữ chúng trên các thư mục khác nhau ( X.Y.Z.W/foo, X.Y.Z.W/bar)? Tại sao bạn không thể có được tên miền cho họ? (Bạn có thể gán cùng một IP cho nhiều tên miền)?
muru

Bạn sẽ cần nhiều tên miền để làm điều đó. Tuy nhiên, có một dịch vụ tên miền miễn phí: freenom.com cung cấp cho bạn các tên miền .tk, .ml, .ga, .cf và .gq miễn phí.
TheWanderer

@muru Tôi nghĩ họ không muốn chi tiền cho nhiều tên miền. Họ muốn một số cách để có nhiều trang web trên một URL.
TheWanderer

@ Zacharee1 họ chỉ cần một tên miền và có thể thực hiện các tên miền phụ. Nếu họ từ chối làm điều đó, họ sẽ phải thực hiện phương pháp dựa trên IP xấu, tùy thuộc vào loại ứng dụng / dự án mà họ đang sử dụng có thể không hỗ trợ các phương thức định vị của 'thư mục con'.
Thomas Ward

@ThomasW. Tôi đã nghĩ rằng các tên miền phụ sẽ không phải là một lựa chọn
TheWanderer

Câu trả lời:


17

Có hai cách để đạt được điều này. Bạn có thể làm mọi thứ theo địa chỉ IP, với các vị trí thư mục con hoặc bạn sẽ cần mua một tên miền và sau đó có nhiều tên miền phụ trên tên miền đó (tên miền phụ không nên tốn bất kỳ chi phí nào, nếu bạn mua tên miền, nhưng hãy kiểm tra với nhà đăng ký của bạn).

Tôi không khuyên phương thức địa chỉ IP nếu chỉ vì nhớ địa chỉ IP rất tệ và nếu bạn cố gắng chia sẻ thông tin cho người khác, bạn cũng gặp vấn đề tương tự người khác phải nhớ địa chỉ IP.


Cách tiếp cận một IP, nhiều thư mục con, không có tên miền

ĐỂ Ý! Chúng tôi không có bất kỳ thông tin nào về các dự án của bạn mà bạn đang thực hiện. Chúng tôi cần biết thêm để xác định xem bạn có thể thực hiện phương pháp này hay không, vì nhiều khung web sẽ không hoạt động nếu không có tên miền thực được gắn với nó.


CẢNH BÁO : Trong quá trình thử nghiệm liên tục các ví dụ này, người ta đã phát hiện ra rằng phương pháp "Một tên miền, nhiều thư mục con" không lấy dữ liệu ủy quyền ngược cho phụ trợ, vì URI được yêu cầu sẽ bao gồm các thư mục con trong URI; điều này có thể làm cho các máy chủ phụ trợ có vấn đề hành xử đúng.

Về nginxphía chúng ta, chúng ta cần thực hiện một cách tiếp cận 'ác' đối với điều này - một địa chỉ IP, nhiều địa điểm thư mục và thư mục con. Đây là một cách tiếp cận rất xấu xa và có thể gây ra nhiều vấn đề với một số khung web.

Giả sử nginxcài đặt mặc định làm cơ sở từ kho lưu trữ, thì chúng ta phải tạo cấu hình trang để xử lý từng yêu cầu thư mục con dự án. Sau đó, chúng ta phải liên kết nó ở đúng vị trí.

Tạo /etc/nginx/sites-available/my-projectsbằng cách sau (sử dụng làm mẫu / hướng dẫn - nó giả định ba dự án với HTML tĩnh và không có ứng dụng web động trong PHP hoặc python hoặc tương tự, và bạn có thể sao chép các khối vị trí riêng lẻ và tạo vị trí mới phù hợp; IP máy chủ là 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
    }
}

Bây giờ chúng tôi thay thế cấu hình mặc định (loại bỏ nó) và thêm chúng tôi:

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

Và sau đó khởi động lại nginxdịch vụ:

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

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

Cách tiếp cận một tên miền, nhiều tên miền phụ.

Phần câu trả lời này giả sử bạn có một tên miền và nhiều tên miền phụ trong đó. Nếu bạn không có điều này, xin vui lòng làm rõ điều này trong câu hỏi của bạn

Với mỗi nginx server {}khối trong cấu hình, bạn sẽ cần xác định tên máy chủ và có thể đặt khối máy chủ thứ tư là 'bắt tất cả' cho các yêu cầu khác.

Ví dụ: Tôi có ba dự án, proj1, proj2, proj3. Tôi có một tên miền được gọi evil-projects.net(LƯU Ý: Không thực sự tồn tại). Tôi muốn ba tên miền phụ khác nhau, một tên miền cho mỗi nginxcấu hình sẽ trỏ đến một dự án mỗi tên miền . Máy chủ của tôi cư trú tại 1.2.3.4 và nó sẽ phục vụ tất cả các trang web.

Với kịch bản trên, chúng tôi có hai phần: tên miền và tên miền phụ và cấu hình máy chủ.

(1): Cấu hình DNS

Thiết lập DNS của bạn tại máy chủ của bạn sao cho đúng như sau với các bản ghi 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): Cấu hình NGINX tại máy chủ (1.2.3.4)

Bây giờ cho nginxcấu hình của bạn . Tôi giả sử rằng bạn sẽ có các thiết lập nginx mặc định và các gói từ Kho lưu trữ (Tôi sẽ sử dụng 14.04 làm ví dụ cơ bản). Đầu tiên chúng ta sẽ có bốn tệp cấu hình /etc/nginx/sites-available. Bạn có thể cần sử dụng sudokhi tạo các tệp này, vì thư mục trong câu hỏi được sở hữu bởi root.

/etc/nginx/sites-available/catch-all- đây sẽ là 'bắt tất cả' cho bất kỳ miền không có giá trị nào. Tôi thích trả lại mã lỗi http 410 (Gone).

server {
    listen 80 default_server;

    server_name _;

    return 410;
}

Tiếp theo, chúng tôi thiết lập cấu hình cho các trang web / dự án của bạn. Mặc dù vậy, tôi sẽ cho rằng chúng là tất cả các tệp tĩnh. Mỗi trong số này ngụ ý rằng bạn cũng có các thư mục web khác nhau cho từng dự án trên máy chủ (các 'tài liệu gốc' khác nhau).

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

Sau đó, chúng tôi phải xóa cấu hình 'mặc định' khỏi /etc/nginx/sites-enabledvà thêm cấu hình của chúng tôi. Một lần nữa, sudolà cần thiết ở đây.

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/

Và sau đó chúng tôi khởi động lại nginxquá trình:

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

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

Khi DNS lan truyền, các trang web sẽ hoạt động như bình thường.


trong cấu hình này, nơi bạn sẽ đặt các khối cho proxy_cache? Giả sử proj1, proj2, proj3 có tất cả các điểm cuối giống nhau, với các gốc khác nhau và muốn phản hồi bộ đệm trên các thư mục riêng biệt.
dùng305883

@ user305883 Nghe có vẻ như đó là một câu hỏi mới.
Thomas Ward
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.