让服务器管理多个站点

让服务器管理多个站点

我从 DigitalOcean 购买了一台专用服务器,并配置了nginx、mysql 和 php,其 IP 地址为a.b.c.d。我从和买了两个域名GoDaddy。我创建了一个子域名,它将是一个网站。我在 中将转发到。siteone.comsitetwo.comsub.siteone.comWordPresssub.siteone.coma.b.c.dGoDaddy

依照指示这个帖子这个帖子,我把WordPress文件放在了 下/var/www/sub.siteone.com/html//etc/nginx/sites-available/sub.siteone.com包含以下内容:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/sub.siteone.com/html;
    index index.php index.html index.htm;

    server_name sub.siteone.com;

    location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
            root /usr/share/nginx/html;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
    }
}

结果,当我进入sub.siteone.com浏览器时,它会重定向到a.b.c.d并显示 WordPress 网站。

问题是我希望我的服务器 ( a.b.c.d) 包含多个站点(即域)。因此,我设想的机制是a.b.c.d/one/包含第一个域,并a.b.c.d/two/包含第二个域。结果,

  • 当我sub.siteone.com在浏览器中输入时,url 保持不变,但内容来自a.b.c.d/one/
  • 当我在浏览器中输入例如时sub.siteone.com/photos/,url 保持不变,而内容来自a.b.c.d/one/photos
  • 当我sitetwo.com在浏览器中输入时,url 保持不变,但内容来自a.b.c.d/two/
  • 当我在浏览器中输入例如时sitetwo.com/downloads/,url 保持不变,而内容来自a.b.c.d/two/downloads

有人能告诉我这种机制是否有意义吗?我该如何修改 nginx 和 GoDaddy 的设置来实现这一点?

答案1

您可以使用 Nginx 中的服务器块轻松实现此目的,以创建多个“虚拟主机”,每个虚拟主机都有不同的 HTTP 配置。这是因为 Nginx 根据您用于访问服务器的 URL 以不同的方式处理您的请求。

简单来说,要访问 siteone.com,您需要创建一个server值为server_name的块siteone.com。每个服务器块可以位于其自己的文件中,也可以位于同一个文件中,这并不重要。

siteone.com:

server {
    listen 80;
    server_name sub.siteone.com;
    root /var/www/sub.siteone.com/html;
    # ADD ADDITIONAL SITEONE CONFIGURATION HERE
}

sub.siteone.com:

server {
    listen 80;
    server_name sub.siteone.com;
    root /var/www/sub.siteone.com/html;
    # ADD ADDITIONAL SUB.SITEONE CONFIGURATION HERE
}

sitetwo.com

server {
    listen 80;
    server_name sitetwo.com;
    root /var/www/sitetwo.com/html;
    # ADD ADDITIONAL SITETWO CONFIGURATION HERE
}

这应该能提供您需要的行为。还值得注意的是,除了为每个服务器使用不同的根目录之外,您还可以做很多事情,为每个虚拟主机设置不同的日志文件、转发请求和许多其他功能也很有用。

以下是 sitetwo.com 特定日志文件的粗略示例

server {
    listen      80;
    server_name sitetwo.com;
    root        /var/www/sitetwo.com/html;
    error_log   /var/www/sitetwo.com/logs/error.log;
    access_log  /var/www/sitetwo.com/logs/access.log;
    # ADD ADDITIONAL SITETWO CONFIGURATION HERE
}

答案2

你想要的就是虚拟主机。它的效果比你描述的要好得多!

只需添加server具有不同目录的多个块server_name即可rootserver每个域名一个块。请注意,只能将其中一个标记为,default_server但除此之外,所有块看起来都可以相同。

最好的方法是为每个站点创建一个文件,然后将每个文件符号链接到/etc/nginx/sites-enabled/。完成后,使用以下命令重新启动 nginx:service nginx restart

答案3

使用 Nginx,您应该根据需要创建尽可能多的站点配置文件,并简单修改 server_name 和 root 语句以将外部域映射到其内容和代码。

答案4

Ben 的回答也很好,这里有一个替代方案,只是为了多样性:创建一个服务器并在其中添加指向您网站位置的多个位置块。

服务器{

   listen  443 ssl;
   server_name dev.domainofmysite.com;

   server_tokens off;


   location /param {
     proxy_pass http://127.0.0.1:8888;
   }
   location /tparam {

     proxy_pass http://127.0.0.1:7172;
   }
   location /dparam {
     proxy_pass http://127.0.0.1:7172;
   }

}

相关内容