在单个SSL 443服务器上使用NGINX代理多个应用

44次阅读
没有评论

问题描述

在一个单独的服务器上有两个应用,分别是 app1.domain.comapp2.domain.com。他希望能够对请求进行代理,使得来自 app1 的请求能够服务静态文件,而来自 app2 的请求能够通过 proxy_pass 转发到 localhost:8000。此外,他已经使用Let’s Encrypt获得了两个应用的SSL证书,现在他想知道如何在单个服务器上为这两个应用提供服务。

解决方案

请注意以下操作可能涉及服务器配置,建议在操作前备份服务器设置。

使用不同的 server_name

为了在单个服务器上为两个应用提供服务,您可以使用不同的 server_name 来区分请求的目标应用。根据用户提供的NGINX配置,您可以使用以下步骤:

  1. 打开您的NGINX配置文件,通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/default
  2. 为每个应用添加一个 server 块,类似于您已经设置的 server 块。
  3. 在每个 server 块中,将 server_name 设置为相应的域名,即 app1.domain.comapp2.domain.com
  4. 针对 app1 的配置中,您可以继续使用现有的静态文件处理配置,类似于:
    “`nginx
    server {
    server_name app1.domain.com;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/app1.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app1.domain.com/privkey.pem;

    # 其他配置,例如静态文件处理
    }
    5. 针对 `app2` 的配置中,您需要将请求代理到 `localhost:8000`,类似于:nginx
    server {
    server_name app2.domain.com;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/app2.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app2.domain.com/privkey.pem;

    location / {
    proxy_pass http://localhost:8000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_read_timeout 90;
    }
    }
    ``
    6. 保存并关闭配置文件,然后重新加载NGINX配置:
    sudo service nginx reload`。

修复 listen 选项

用户提到了在设置中出现了 “duplicate listen options for..” 的错误。根据用户提供的最佳答案,您需要确保在每个 server 块中只有一条 listen 指令。对于IPv6的监听,您只需要保留其中一条。

修复 if ($host) 使用

用户尝试在 location 块中使用 if ($host = domain),但遇到了问题。请注意,使用 if 来判断 $host 可能会引发一些问题,因为 if 的使用可能会有一些陷阱和限制。为了避免潜在的问题,最好使用 server_name 来分发请求。

通过按照上述步骤设置,您应该能够成功地在单个SSL 443服务器上为两个应用提供服务。记得在进行任何配置更改之前备份您的服务器设置,以防万一出现问题。

正文完