设置一个Nginx反向代理

反向代理是一种服务,它接受客户端请求,将请求发送到一个或多个代理服务器,获取响应,然后将服务器的响应传递给客户端。

由于其性能和可伸缩性,NGINX通常用作HTTP和非HTTP服务器的反向代理。 典型的反向代理配置是将Nginx放在Node.js,Python或Java应用程序的前面。

使用Nginx作为反向代理可以为您带来其他好处:

  • 负载均衡 -Nginx可以执行负载平衡,以在代理服务器之间分配客户端的请求,从而提高性能,可伸缩性和可靠性。
  • 快取 -使用Nginx作为反向代理,您可以缓存页面的预渲染版本以加快页面加载时间。 它通过缓存从代理服务器的响应接收的内容,并使用它来响应客户端,而不必每次都与代理服务器联系以获取相同的内容。
  • SSL终止 -Nginx可以充当与客户端连接的SSL端点。 它将处理和解密传入的SSL连接并加密代理服务器的响应。
  • 压缩 -如果代理服务器未发送压缩的响应,则可以配置Nginx在将响应发送给客户端之前先压缩响应。
  • 缓解DDoS攻击 -您可以将传入请求和每个IP地址的连接数限制为常规用户的典型值。 Nginx还允许您基于客户端位置以及请求标头(例如“ User-Agent”和“ Referer”)的值来阻止或限制访问。

本文概述了将Nginx配置为反向代理所需的步骤。

先决条件

我们假设您在Ubuntu,CentOS或Debian服务器上安装了Nginx。

使用Nginx作为反向代理

要将Nginx配置为HTTP服务器的反向代理,请打开域的服务器块配置文件,并在其中指定位置和代理服务器:

server {
    listen 80;
    server_name www.example.com example.com;

    location /app {
       proxy_pass http://127.0.0.1:8080;
    }
}

代理服务器网址是使用 proxy_pass 指令,可以使用 HTTP 要么 HTTPS 作为协议,域名或IP地址,以及可选的端口和URI作为地址。

上面的配置告诉Nginx将所有请求传递给 /app 代理服务器的位置 http://127.0.0.1:8080

在基于Ubuntu和Debian的发行版中,服务器阻止文件存储在 /etc/nginx/sites-available 目录,而在CentOS中 /etc/nginx/conf.d 目录。

为了更好地说明 locationproxy_pass 指令有效,让我们以以下示例为例:

server {
    listen 80;
    server_name www.example.com example.com;

    location /blog {
       proxy_pass http://node1.com:8000/wordpress/;
    }
}

如果访客访问 http://example.com/blog/my-post,Nginx会将请求转发给 http://node1.com:8000/wordpress/my-post

当代理服务器的地址包含URI时,(/wordpress/),则传递到代理服务器的请求URI将替换为伪指令中指定的URI。 如果指定的代理服务器地址没有URI,则完整的请求URI将传递到代理服务器。

传递请求头

当Nginx代理一个请求时,它会在来自客户端的代理请求中自动定义两个标头字段, HostConnection,并删除空标题。 Host 设置为 $proxy_host 变量,和 Connection 设置为关闭。

要调整或设置代理连接头,请使用 proxy_set_header 指令,后跟标题值。 您可以在此处找到所有可用请求标头及其允许值的列表。 如果要防止将标头传递到代理服务器,请将其设置为空字符串 ""

在以下示例中,我们将更改 Host 标头字段 $host 并删除 Accept-Encoding 将标头字段的值设置为空字符串。

location / {
    proxy_set_header Host $host;
    proxy_set_header Accept-Encoding "";
    proxy_pass http://localhost:3000;
}

每当您修改配置文件时,都必须重新启动Nginx服务,以使更改生效。

将Nginx配置为非HTTP代理服务器的反向代理

要将Nginx配置为非HTTP代理服务器的反向代理,可以使用以下指令:

  • fastcgi_pass -反向代理到FastCGI服务器。
  • uwsgi_pass -反向代理到uwsgi服务器。
  • scgi_pass -反向代理到SCGI服务器。
  • memcached_pass -反向代理到Memcached服务器。

最常见的示例之一是使用Nginx作为PHP-FPM的反向代理:

server {

    # ... other directives

    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }
}

常见的Nginx反向代理选项

通过HTTPS提供内容已成为当今的标准。 在本节中,我们将为您提供HTTPS Nginx反向代理配置的示例,其中包括推荐的Nginx代理参数和标头。

  location/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version  1.1;
    proxy_cache_bypass  $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    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_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;
  }
  • proxy_http_version 1.1 -定义用于代理的HTTP协议版本,默认情况下将其设置为1.0。 对于Websockets和 keepalive 您需要使用1.1版进行连接。
  • proxy_cache_bypass $http_upgrade -设置不从缓存中获取响应的条件。
  • Upgrade $http_upgradeConnection "upgrade" -如果您的应用程序使用Websockets,则这些标头字段是必填字段。
  • Host $host -的 $host 变量按以下优先顺序包含:请求行中的主机名,或 Host request标头字段,或与请求匹配的服务器名称。
  • X-Real-IP $remote_addr -将真实的访客远程IP地址转发到代理服务器。
  • X-Forwarded-For $proxy_add_x_forwarded_for -包含客户端被代理的每个服务器的IP地址的列表。
  • X-Forwarded-Proto $scheme -在HTTPS服务器块中使用时,来自代理服务器的每个HTTP响应都将重写为HTTPS。
  • X-Forwarded-Host $host -定义客户端请求的原始主机。
  • X-Forwarded-Port $server_port -定义客户端请求的原始端口。

如果您没有现有的SSL / TLS证书,请使用certbot在Ubuntu 18.04,CentOS 7或Debian服务器上获取免费的“让我们加密SSL”证书。

结论#

您已经了解了如何将Nginx用作反向代理。 我们还向您展示了如何将其他参数传递给服务器,以及如何在代理请求中修改和设置不同的标头字段。

如果您有任何疑问或反馈,请随时发表评论。

Nginx的

Sidebar