所以我正在使用数字海洋和nginx。我想托管多个网站(我的项目),但不想为每个网站购买一个域名。
有没有一种方法可以在一个IP上访问同时在nginx和数字海洋上托管多个网站?
所以我正在使用数字海洋和nginx。我想托管多个网站(我的项目),但不想为每个网站购买一个域名。
有没有一种方法可以在一个IP上访问同时在nginx和数字海洋上托管多个网站?
Answers:
有两种方法可以实现此目的。您可以通过IP地址,子文件夹位置来完成所有操作,或者您需要购买一个域,然后在该域上拥有多个子域(如果您购买了该域,则子域应该不花任何费用,但请向注册服务商咨询)。
我不建议仅使用IP地址方法是因为必须记住IP地址是非常邪恶的,并且如果您尝试与他人共享信息,也会遇到其他问题,即必须记住IP地址。
注意! 我们没有您正在从事的项目的任何信息。我们需要更多的信息来确定您是否可以采用这种方法,因为如果没有一个真正的域名,许多 Web框架将无法工作。
警告:在对这些示例进行不断的测试中,发现“一个域,许多子目录”方法并不能很好地将数据反向代理到后端,因为请求的URI将包括URI中的子目录。这可能会使后端服务器出现行为异常。
在 nginx
侧面,我们需要做的“邪恶”的方法来此-一个IP地址,许多文档根目录和子文件夹的位置。这是一种非常邪恶的方法,可能会导致某些Web框架出现很多问题。
假设默认 nginx
安装是存储库的基础,那么我们必须创建一个站点配置来处理每个项目子目录请求。然后,我们必须在正确的位置进行符号链接。
/etc/nginx/sites-available/my-projects
使用以下内容进行创建(将其用作模板/指南-假定三个项目具有静态HTML,并且没有PHP,python或类似形式的动态Web应用程序,并且您可以复制各个位置块并相应地创建新位置;它还假设您的服务器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 {}
配置中的每个块,您将需要定义服务器名称,并可能将第四个服务器块设置为对其他请求的“全部捕获”。
例如:我有三个项目
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设置和存储库中的软件包(我将使用14.04作为基本示例)。首先,我们将放入四个配置文件/etc/nginx/sites-available
。 创建这些文件时,您可能需要使用sudo
,因为相关文件夹归拥有root
。
/etc/nginx/sites-available/catch-all
-这将是所有无效域的“全部捕获”。我喜欢返回http错误代码410(GONE)。
server {
listen 80 default_server;
server_name _;
return 410;
}
接下来,我们为您的站点/项目设置配置。我将假设它们都是静态文件。所有这些都意味着服务器上每个项目的Web目录也不同(“文档根目录”不同)。
/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分配给多个域)?