所以我正在使用数字海洋和 nginx。我想托管多个网站(我的项目),但不想为每个网站购买一个域。
有没有办法在使用一个 ip 访问它们的同时在 nginx 和数字海洋上托管多个网站?
Tho*_*ard 20
有两种方法可以实现这一点。要么您通过 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
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们替换默认配置(删除它)并添加我们的:
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/my-projects /etc/nginx/sites-enabled
Run Code Online (Sandbox Code Playgroud)
然后重启nginx服务:
# If on 14.04, use this:
sudo service nginx restart
# If on 15.10 or newer, use this:
sudo systemctl restart nginx
Run Code Online (Sandbox Code Playgroud)
本回答部分假设您有一个域和多个子域。如果你没有这个,请在你的问题中澄清这一点
对于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
Run Code Online (Sandbox Code Playgroud)
现在为您的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;
}
Run Code Online (Sandbox Code Playgroud)
接下来,我们为您的站点/项目设置配置。不过,我将假设它们都是静态文件。每一个都意味着服务器上的每个项目都有不同的 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;
}
}
Run Code Online (Sandbox Code Playgroud)
/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;
}
}
Run Code Online (Sandbox Code Playgroud)
/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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们必须从 中删除“默认”配置/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/
Run Code Online (Sandbox Code Playgroud)
然后我们重新启动这个nginx过程:
# If on 14.04, use this:
sudo service nginx restart
# If on 15.04 or newer, use this:
sudo systemctl restart nginx
Run Code Online (Sandbox Code Playgroud)
一旦 DNS 传播,这些站点就会正常工作。
| 归档时间: |
|
| 查看次数: |
40237 次 |
| 最近记录: |