问题描述
在一个单独的服务器上有两个应用,分别是 app1.domain.com
和 app2.domain.com
。他希望能够对请求进行代理,使得来自 app1
的请求能够服务静态文件,而来自 app2
的请求能够通过 proxy_pass
转发到 localhost:8000
。此外,他已经使用Let’s Encrypt获得了两个应用的SSL证书,现在他想知道如何在单个服务器上为这两个应用提供服务。
解决方案
请注意以下操作可能涉及服务器配置,建议在操作前备份服务器设置。
使用不同的 server_name
为了在单个服务器上为两个应用提供服务,您可以使用不同的 server_name
来区分请求的目标应用。根据用户提供的NGINX配置,您可以使用以下步骤:
- 打开您的NGINX配置文件,通常位于
/etc/nginx/nginx.conf
或/etc/nginx/sites-available/default
。 - 为每个应用添加一个
server
块,类似于您已经设置的server
块。 - 在每个
server
块中,将server_name
设置为相应的域名,即app1.domain.com
和app2.domain.com
。 针对
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;
}
}
``
sudo service nginx reload`。
6. 保存并关闭配置文件,然后重新加载NGINX配置:
修复 listen
选项
用户提到了在设置中出现了 “duplicate listen options for..” 的错误。根据用户提供的最佳答案,您需要确保在每个 server
块中只有一条 listen
指令。对于IPv6的监听,您只需要保留其中一条。
修复 if ($host)
使用
用户尝试在 location
块中使用 if ($host = domain)
,但遇到了问题。请注意,使用 if
来判断 $host
可能会引发一些问题,因为 if
的使用可能会有一些陷阱和限制。为了避免潜在的问题,最好使用 server_name
来分发请求。
通过按照上述步骤设置,您应该能够成功地在单个SSL 443服务器上为两个应用提供服务。记得在进行任何配置更改之前备份您的服务器设置,以防万一出现问题。