【问题标题】:Issue with NGINX Conrfiguration for Multiple Domains on Same Server同一服务器上多个域的 NGINX 配置问题
【发布时间】:2022-11-23 18:45:47
【问题描述】:

我正在努力让两个域通过 NGINX 在 digitalocean.com 托管(在 Ubuntu 20,04 Droplet 中)上正确提供服务。我们称它们为 domain1.com(默认)和 domain2.com。 domain1.com 工作正常并且有 SSL(来自 Let's Encrypt),此时 domain2 只是 http。

domain2.com 的主页现在加载正常,使用这个服务器块:

server {
    listen *:80;
    listen [::]:80;
    root /home/domain2/;
    index index.html;
    server_name domain2.com www.domain2.com;
    location / {
    try_files $uri $uri/ =404;
    }
}

但是,当我导航到 domain2.com 站点上的另一个页面时,它会加载默认站点 domain1.com。很奇怪在 Chrome 地址行中看到 domain2.com,同时出现 domain1.com 网页。

我认为这与默认的 domain1.com 有关,但我不知道为什么会这样。我是 NGINX 的新手......我应该怎么做才能解决这个问题?

/etc/nginx/sites-available 中的默认文件具有以下内容:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /home/domain1/server/public;
    index index.js index.html index.htm index.nginx-debian.html;

    server_name localhost;

        location / {
         proxy_pass http://localhost:5000;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection 'upgrade';
         proxy_set_header Host $host;
         proxy_cache_bypass $http_upgrade;
         }
}

server {
    root /home/domain1/server/public;
    index index.js index.html index.htm index.nginx-debian.html;
    server_name domain1.com; # managed by Certbot


        location / {
         proxy_pass http://localhost:5000;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection 'upgrade';
         proxy_set_header Host $host;
         proxy_cache_bypass $http_upgrade;
         }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/intraprem.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/intraprem.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = domain1.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 ;
    listen [::]:80 ;
    server_name domain1.com;
    return 404; # managed by Certbot


}

【问题讨论】:

    标签: nginx-reverse-proxy ubuntu-20.04


    【解决方案1】:

    你确定你使用的是http://domain2.com吗?从您的配置来看,https:/domain2.com 似乎会转到 /home/domain1/server/public Web 根目录。这可能是问题所在吗?

    【讨论】:

    • domain2.com 正确加载 domain2.com 内容,但引用 domain2.com/index.html 加载 domain1.com/index.html。所以 domain2.com 的主页按预期工作,但引用 domain2 中的子页面以纯文本加载 domain1.com 主页(顺便说一下,这需要 :5000 端口。令人困惑。
    • http://domain2.comhttps://domain2.com 与您的配置不同。不幸的是,SO“修复”了 URL,因此您的回复并没有准确揭示正在发生的事情。
    【解决方案2】:

    在多次尝试从以前的 nginx 配置开始工作后,我的配置基于对 domain1.com 运行良好的配置(即尝试添加 domain2.com 作为增量更改),我决定清理石板并开始使用仅对两个域使用端口 80 的全新配置(尚无 SSL - 见下文)。我还决定通过仅使用单个 .conf 文件来简化,而不是将服务器块拆分为站点可用目录和站点启用目录,这可能是问题的一部分。

    这是我放在 /etc/nginx/conf.d/sites.conf 中的新 .conf 文件的内容:

    # Default server configuration
    #
    server {
        listen *:80 default_server;
        listen [::]:80 default_server;
        server_name domain1.com www.domain1.com;
        index index.js index.html index.htm;
    
            location / {
             proxy_pass http://localhost:5000;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection 'upgrade';
             proxy_set_header Host $host;
             proxy_cache_bypass $http_upgrade;
             }
    }
    
    server {
        listen 80;
        server_name domain2.com www.domain2.com;
            location / {
                root /home/domain2/;
                index index.html index.htm;
            }
    
    }
    

    对于 NodeJS 在端口 5000 上提供的 VueJS 应用程序和 domain2.com 引用的简单静态站点,这都可以正常工作。通过这种简单的方法,我开始更好地理解 nginx 的工作原理。

    我的计划是在开发后期为这两个站点添加 SSL 支持,使用 Let's Encrypt。

    完成此操作后,我会在此处发布答案,因为我认为这对可能在单个服务器/端口问题上苦苦挣扎的 nginx 新手(如我)很有用。

    【讨论】:

      【解决方案3】:

      您可以使用以下配置,该配置适用于 asp.net core..... 您可以通过将“domain1.com”替换为“domain2.com”来为 domain2.com 创建相同的配置

      server {
      
          server_name domain1.com www.domain1.com;
      
         location / {
           proxy_pass http://localhost:5000;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection keep-alive;
           proxy_set_header Host $host;
           proxy_cache_bypass $http_upgrade;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
          }
      
      listen [::]:443 ssl; # managed by Certbot
      listen 443 ssl; # managed by Certbot
      ssl_certificate /etc/letsencrypt/live/domain1.com/fullchain`enter code here`.pem; # managed by Certbot
      ssl_certificate_key /etc/letsencrypt/live/domain1.com/privkey.pem; # managed by Certbot
      include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
      ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
      
      
      }
      
      server {
      if ($host = www.domain1.com) {
          return 301 https://$server_name$request_uri;
      } # managed by Certbot
      
      
      if ($host = domain1.com) {
          return 301 https://$server_name$request_uri;
      } # managed by Certbot
      
      
          listen 80;
          listen [::]:80;
          server_name domain1.com www.domain1.com;
          
      return 404; # managed by Certbot
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-10
        • 2017-05-22
        • 2021-10-17
        • 1970-01-01
        • 2019-12-26
        • 2018-03-27
        • 2019-07-22
        • 2020-10-07
        • 1970-01-01
        相关资源
        最近更新 更多