# Nginx 多个虚拟主机 [TOC] ###### tags: `chatgpt` --- ## nginx 要如何像 Apache httpd 一樣建立多個 `NameVirtualHost`,每個 `NameVirtualHost` 為數個 backend 的 LB 並掛載 https 憑證,還要 http 自動重導向至 https 在 Nginx 中,您可以使用 server 块来定义虚拟主机,类似于 Apache 的 `NameVirtualHost`。以下是一些示例配置,以帮助您开始使用 Nginx: 1. 定义多个 `server` 块 每个 server 块代表一个虚拟主机,并使用 `listen` 指令指定要监听的 IP 地址和端口。例如: ```groovy server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/certificate.key; location / { proxy_pass http://backend; } } ``` 以上配置定义了两个 `server` 块,一个监听 HTTP 请求并将其重定向到 HTTPS,另一个监听 HTTPS 请求并代理到名为 `backend` 的后端服务器。 2. 使用 `include` 文件 如果您需要定义多个虚拟主机,您可以将每个 `server` 块定义放在单独的文件中,然后在主配置文件中使用 `include` 指令来加载它们。例如: ```groovy http { # 全局配置 include /etc/nginx/conf.d/*.conf; } ``` 此配置将加载 `/etc/nginx/conf.d/` 目录下所有以 `.conf` 结尾的文件。 3. 重定向 HTTP 请求到 HTTPS 如果您希望所有 HTTP 请求都自动重定向到 HTTPS,您可以使用类似于以下示例的 `server` 块: ```groovy server { listen 80 default_server; server_name _; return 301 https://$host$request_uri; } ``` 此配置将捕获所有监听的端口和域名,并将其重定向到相同域名和 HTTPS 端口。 希望这些示例可以帮助您开始在 Nginx 中设置多个虚拟主机和 HTTPS 证书。请注意,这些示例可能需要进行适当的修改才能适应您的特定需求。 ## 上面的示例似乎少了配置多個 backend servers 的負載平衡器 您是正确的,我在先前的回答中漏掉了配置负载平衡器的部分。在 Nginx 中,您可以使用 `upstream` 模块来定义一组后端服务器,并在 `server` 块中使用 `proxy_pass` 指令将请求代理到这些服务器。以下是更新后的示例配置: ```groovy http { upstream backend { server backend1.example.com; server backend2.example.com; } server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/certificate.key; location / { proxy_pass http://backend; } } } ``` 在此示例中,我们使用 `upstream` 块定义了一个名为 `backend` 的组,其中包含两个后端服务器 `backend1.example.com` 和 `backend2.example.com`。在 `server` 块中,我们使用 `proxy_pass` 指令将请求代理到该组。Nginx 将自动执行负载平衡并将请求转发到可用的后端服务器。