设置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; } }
代理服务器的URL使用'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”目录中。
为了更好地说明'location'和'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'和'Connection',并删除空的标头。
“主机”设置为“ $proxy_host”变量,“连接”设置为关闭。
要为代理连接调整或者设置标题,请使用“ 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。对于Websocket和“ keepalive”连接,我们需要使用1.1版。
- 'proxy_cache_bypass $http_upgrade'-设置条件,在该条件下将不会从缓存中获取响应。
- 'Upgrade $http_upgrade'和'Connection“ upgrade”'-如果应用程序使用Websocket,则这些标头字段是必需的。
- 'Host $host'-按以下优先顺序排列的'$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在Ubuntu 18.04,CentOS 7或者Debian服务器上获取免费的“加密SSL”证书。