任何时候你都可以开始做自己想做的事

搜索|
nginx配置反向代理方案
发布时间:2024-08-08 00:39:28

当你有多个站点运行在目标服务器上,并且希望 Nginx 正确地将请求转发到正确的站点时,一种常见的做法是在每个站点的 IIS 配置中设置不同的主机头名称(Host header)。这样,Nginx 可以根据请求中的 Host 头来决定将请求转发给哪个站点。

在 Nginx 的配置中,你可以使用 if 语句来检查 Host 头,并根据不同的域名值将请求转发到不同的后端服务器或不同的位置。以下是一个示例配置:

server {    listen 80;    server_name ~^(www\.)?xxx\.com$;    location / {        if ($host = "www.xxx.com" or $host = "xxx.com") {            proxy_pass http://168.20.1.23:8080; # 假设第一个站点监听在8080端口        } else {            return 404;        }        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_redirect off;    } } server {    listen 80;    server_name ~^(www\.)?yyy\.com$;    location / {        if ($host = "www.yyy.com" or $host = "yyy.com") {            proxy_pass http://168.20.1.23:8081; # 假设第二个站点监听在8081端口        } else {            return 404;        }        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_redirect off;    } }

在这个例子中,xxx.comyyy.com 是两个不同的域名,它们分别对应 IIS 上的两个不同站点。每个站点都在不同的端口上监听(例如,xxx.com 在 8080 端口,yyy.com 在 8081 端口)。

请注意,上述配置使用了正则表达式来匹配域名,并且使用 if 语句来确定 Host 头的值。然而,更常见和简洁的做法是使用多个 server 块,每个块对应一个域名,并在每个块中指定 proxy_pass 到正确的后端站点。

确保你的 IIS 配置中每个站点都有正确的主机头名称,并且这些站点监听在不同的端口上(如果它们都在同一台服务器上)。如果站点在不同的物理服务器上,则应将 proxy_pass 更改为指向正确的服务器和端口。

完成配置后,不要忘记重启 Nginx 服务以应用更改。

源服务器的站点端口都是使用同一个80端口,这种也是一样配置么

如果源服务器的所有站点都监听在同一个端口(比如80或443),那么仅依赖端口号来区分不同的站点将不再可行。在这种情况下,IIS 会使用 Host HTTP 请求头来识别不同的虚拟主机,即每个站点的域名。

对于 Nginx,你可以继续使用 server_name 指令来区分不同的域名,并将所有请求转发到相同的后端服务器和端口。关键在于确保后端服务器能够根据 Host 头来正确处理请求。Nginx 配置可以简化如下:server {    listen 80;    server_name xxx.com www.xxx.com;    location / {        proxy_pass http://168.20.1.23:80;        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_redirect off;    } } server {    listen 80;    server_name yyy.com www.yyy.com;    location / {        proxy_pass http://168.20.1.23:80;        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_redirect off;    } }server {    listen 80;    server_name xxx.com www.xxx.com;    location / {        proxy_pass http://168.20.1.23:80;        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_redirect off;    } } server {    listen 80;    server_name yyy.com www.yyy.com;    location / {        proxy_pass http://168.20.1.23:80;        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_redirect off;    } }在iis中,主机名就是域名吧,意思是源服务器只要再绑定域名就可以,只要NGINX反向到同一个IP的同一个端口,只要每个站点绑定自己的域名即可?或者每个站点设置一个特定的主机名(域名或者某个名字)即可?

在 IIS 中,主机名确实是用来指代域名的,但这里的“主机名”是指在 IIS 的网站绑定设置中所指定的名称,它用于区分在同一 IP 地址和端口上运行的不同网站。当 IIS 接收到一个 HTTP 请求时,它会检查请求中的 Host 头字段,该字段通常包含客户端请求的域名。基于这个 Host 头字段中的域名,IIS 将把请求路由到正确的网站。

因此,为了确保 IIS 能够正确地识别和处理来自 Nginx 的请求,你需要在 IIS 中为每个网站绑定其对应的域名作为主机名。这意味着,即使所有的网站都在同一 IP 地址的相同端口(通常是 80 或 443)上监听,IIS 也能够通过 Host 头信息来区分不同的网站。

在 IIS 的网站绑定设置中,你可以为每个网站添加一个或多个主机名(域名)。例如,对于 xxx.comwww.xxx.com,你应该在 IIS 的绑定设置中分别为这两个域名添加绑定。

当在 Nginx 中配置反向代理时,只需要将所有域名的请求转发到 IIS 服务器的同一 IP 地址和端口即可,因为 IIS 会根据请求中的 Host 头信息来决定如何处理这些请求。

总结一下,为了使这套配置工作,你应当:

  1. 在 Nginx 中为每个域名配置一个 server 块,并使用 server_name 指令指定域名。

  2. 在每个 location 块中使用 proxy_pass 指令将请求转发到 IIS 服务器的同一 IP 地址和端口。

  3. 确保 proxy_set_header Host $host; 保持不变,以保留原始请求中的 Host 头信息。

  4. 在 IIS 中为每个网站配置正确的域名绑定,即在网站绑定设置中添加每个网站对应的主机名(域名)。

通过这样的设置,无论多少个网站运行在 IIS 上的同一 IP 地址和端口,Nginx 都能正确地将请求转发到正确的网站。

这段 Nginx 的配置代码是用来设置一个反向代理服务器,将对 yyy.comwww.yyy.com 的 HTTP 请求转发到另一台服务器(IP 地址为 168.20.1.23,端口为 80)。下面是每一行的解释:

  1. server {

    • 这是 Nginx 配置的一个 server 块的开始。server 块包含了处理特定网络请求的指令集。

  2. listen 80;

    • 这行指令表示此 server 块将监听标准的 HTTP 端口 80,等待接收 HTTP 请求。

  3. server_name yyy.com www.yyy.com;

    • 这行定义了此 server 块将响应哪些域名的请求。这里指定的域名是 yyy.com 和 www.yyy.com。当客户端发送请求,并且请求中的 Host 头字段匹配这些域名之一时,Nginx 将使用这个 server 块中的配置来处理请求。

  4. location / {

    • location 块定义了如何处理针对特定 URL 的请求。这里的 / 表示所有以 / 开始的 URL(实际上就是所有 URL),也就是说这个 location 块会应用于针对此服务器的所有请求。

  5. proxy_pass http://168.20.1.23:80;

    • 这行指令配置了一个反向代理,将所有接收到的请求转发到 http://168.20.1.23:80。这意味着 Nginx 将充当中间人,接收来自客户端的请求,然后将其转发到指定的服务器,最后将响应返回给客户端。

  6. proxy_set_header Host $host;

    • 当 Nginx 转发请求时,它会用 $host 变量替换请求中的 Host 头。这通常很重要,因为它确保了后端服务器(这里是 168.20.1.23)接收到的 Host 头是客户端最初发送的那个,而不是 Nginx 的内部 IP 或端口。

  7. proxy_set_header X-Real-IP $remote_addr;

    • 这行指令设置了一个额外的 HTTP 头 X-Real-IP,其中包含了客户端的真实 IP 地址。这在后端服务器需要知道客户端实际 IP 地址时很有用,特别是在涉及安全、日志记录或地理定位等场景。

  8. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    • 这行指令设置了一个 X-Forwarded-For 头,它用于跟踪客户端 IP 地址和 Nginx 自身的 IP 地址。这在跨越多个代理服务器的环境中特别有用,因为它可以帮助后端服务器追踪请求的原始来源。

  9. proxy_set_header X-Forwarded-Proto $scheme;

    • 这行指令设置了一个 X-Forwarded-Proto 头,指示了客户端请求的协议类型(HTTP 或 HTTPS)。这在 Nginx 重写 HTTPS 请求为 HTTP 请求时尤为重要,确保后端服务器能够了解原始请求的协议。

  10. proxy_redirect off;

    • 这行指令关闭了 Nginx 的自动重定向功能。默认情况下,如果 Nginx 发现后端服务器的响应中有 Location 头,它会自动进行重定向。关闭这一功能可以避免某些不期望的行为或循环重定向。

  11. }

    • 这是 location 块的结束括号。

  12. }

    • 这是 server 块的结束括号,标志着此 server 块配置的结束。

通过这个配置,Nginx 能够有效地将对 yyy.comwww.yyy.com 的所有请求转发到 IP 地址为 168.20.1.23 的服务器上,并且在转发时保留必要的请求头信息。


proxy_set_header Host $host; 当 Nginx 转发请求时,它会用 $host 变量替换请求中的 Host 头。这通常很重要,因为它确保了后端服务器(这里是 168.20.1.23)接收到的 Host 头是客户端最初发送的那个,而不是 Nginx 的内部 IP 或端口。 这 $host 是 NGINX默认的名称么,还是说需要自定义一个变量

`$host` 是 Nginx 内置的变量,它代表了客户端请求中 `Host` 头的值。当你在 `proxy_set_header Host $host;` 这样的上下文中使用 `$host`,Nginx 会自动使用请求中原本的 `Host` 头信息来设置新的请求头,从而确保后端服务器接收到的 `Host` 头与客户端请求时发送的一致。


这个变量不需要你自定义,它是 Nginx 自带的,用于在处理请求时引用客户端请求中的 `Host` 字段。Nginx 提供了一系列内置的变量,用于处理各种请求和响应相关的数据,如 `$remote_addr`(客户端的 IP 地址)、`$request_uri`(请求的 URI)等,这些变量可以直接在配置文件中使用。


在 Nginx 的代理配置中,使用 `$host` 变量是非常重要的,因为后端服务器可能会依赖 `Host` 头来确定应该为哪个网站或应用提供服务。例如,在 IIS 中,不同的网站可能绑定了不同的域名,后端服务器会根据 `Host` 头来识别请求是针对哪个站点的。


总的来说,`$host` 是 Nginx 提供的标准变量,用于在代理请求中保持 `Host` 头的原始值,无需你自定义,直接使用即可。

如果源服务器也是NGINX的,那NGINX的主机头是哪个配置定义

如果源服务器也运行着 Nginx,并且需要根据不同的 Host 头来区分不同的站点,那么主机头(即域名)是在 Nginx 的配置文件中通过 server 块内的 server_name 指令来定义的。

在源服务器(也就是后端服务器)的 Nginx 配置中,每个 server 块通常代表一个独立的虚拟主机或站点。server_name 指令用于指定这个 server 块将响应哪些域名的请求。例如:


server {    listen 80;    server_name example.com www.example.com;    # 其他配置... }

在这个例子中,Nginx 将会监听 80 端口上的 HTTP 请求,并且只有当请求中的 Host 头是 example.com 或者 www.example.com 时,才会使用这个 server 块中的配置来处理请求。

如果源服务器上运行着多个站点,每个站点都需要有自己的 server 块,并且每个块中的 server_name 指令都应该包含该站点的域名。这样,Nginx 就可以根据请求中的 Host 头来确定应该使用哪个 server 块的配置来处理请求。

当前端的 Nginx(反向代理服务器)将请求转发到源服务器时,它会通过 proxy_set_header Host $host; 指令保留原始请求中的 Host 头信息。这样,源服务器上的 Nginx 就能够正确地识别请求是针对哪个站点的,并使用相应的 server 块配置来处理请求。