反向代理是一种接受客户端请求、将请求发送到一个或多个代理服务器、获取响应并将服务器的响应传递给客户端的服务。
由于其性能和可扩展性,NGINX 通常用作 HTTP 和非 HTTP 服务器的反向代理。典型的反向代理配置是将Nginx放在前面Node.js
, Python
, or Java应用程序。
使用 Nginx 作为反向代理可以给你带来一些额外的好处:
-
负载均衡- Nginx 可以执行负载平衡,将客户端的请求分配到代理服务器上,从而提高性能、可扩展性和可靠性。
-
Caching- 使用 Nginx 作为反向代理,您可以缓存页面的预渲染版本,以加快页面加载时间。它的工作原理是缓存从代理服务器响应收到的内容,并使用它来响应客户端,而不必每次都联系代理服务器获取相同的内容。
-
SSL 终止- Nginx 可以充当与客户端连接的 SSL 端点。它将处理和解密传入的 SSL 连接并加密代理服务器的响应。
-
压缩- 如果代理服务器不发送压缩响应,您可以配置 Nginx 在将响应发送到客户端之前压缩响应。
-
减轻 DDoS 攻击- 您可以将每个 IP 地址的传入请求和连接数量限制为普通用户的典型值。 Nginx 还允许您根据客户端位置以及请求标头(例如“User-Agent”和“Referer”)的值来阻止或限制访问。
本文概述了将 Nginx 配置为反向代理所需的步骤。
先决条件#
我们假设您已经安装了 NginxUbuntu
, CentOS
, or Debian
server.
使用 Nginx 作为反向代理#
要将 Nginx 配置为 HTTP 服务器的反向代理,请打开域的服务器块配置文件并指定其中的位置和代理服务器:
server {
listen 80;
server_name www.example.com example.com;
location /app {
proxy_pass http://127.0.0.1:8080;
}
}
代理服务器 URL 设置为proxy_pass
指令并可以使用HTTP
or HTTPS
作为协议、域名或 IP 地址,以及可选端口和 URI 作为地址。
上面的配置告诉 Nginx 将所有请求传递给/app
代理服务器的位置http://127.0.0.1:8080
.
在基于 Ubuntu 和 Debian 的发行版上,服务器块文件存储在/etc/nginx/sites-available
目录,而在 CentOS 上/etc/nginx/conf.d
目录。
为了更好地说明如何location
and proxy_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 代理请求时,它会自动在来自客户端的代理请求中定义两个标头字段,Host
and Connection
,并删除空标头。Host
被设置为$proxy_host
变量,以及Connection
已设置为关闭。
要调整或设置代理连接的标头,请使用proxy_set_header
指令,后跟标头值。您可以找到所有可用请求标头及其允许值的列表here。如果要阻止标头传递到代理服务器,请将其设置为空字符串""
.
在下面的示例中,我们将更改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
- 反向代理到内存缓存
server.
最常见的示例之一是使用 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。对于 Websocket 和keepalive
连接需要使用1.1版本。
-
proxy_cache_bypass $http_upgrade
- 设置不从缓存中获取响应的条件。
-
Upgrade $http_upgrade
and Connection "upgrade"
- 如果您的应用程序使用 Websockets,则需要这些标头字段。
-
Host $host
- The $host
变量按以下优先顺序包含:来自请求行的主机名,或来自请求行的主机名Host
请求标头字段,或与请求匹配的服务器名称。
-
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 在您的设备上获取免费的 Let’s Encrypt SSL 证书乌班图18.04
, CentOS 7
, or Debian
server.
结论#
您已经学习了如何使用 Nginx 作为反向代理。我们还向您展示了如何将附加参数传递到服务器以及如何修改和设置代理请求中的不同标头字段。
如果您有任何问题或反馈,请随时发表评论。