反向代理是一种服务,它接受客户端请求,将请求发送到一个或多个后端服务器,获取响应,然后将服务器的响应传递给客户端,客户端通常浏览器,也可以是curl。
由于其性能和可伸缩性,Nginx通常用作HTTP和非HTTP服务器的反向代理。典型的反向代理配置是将Nginx放在Node.js , Python或Java应用程序的前面。
使用Nginx作为反向代理可以为您带来的一些好处。负载均衡,Nginx可以作为载均衡器,以在代理服务器之间分配客户端的请求,从而提高性能,可伸缩性和可靠性。
缓存,使用Nginx作为反向代理,您可以缓存页面的预渲染版本以加快页面加载时间。
它通过缓存从代理服务器的响应的内容,并使用缓存来响应给客户端,而不必每次都与代理服务器连接以获取相同的内容。
SSL,Nginx可以充当与客户端连接的SSL端点。它将处理和解密传入的SSL连接并加密代理服务器的响应。
压缩,如果代理服务器未发送压缩的响应,则可以配置Nginx在发送响应之前对其进行压缩,使用gzip压缩算法。
DDoS攻击,您可以将传入请求和每个IP地址的连接数限制为普通用户的典型值。 Nginx还允许您根据客户端位置以及请求标头的值,例如User-Agent
和Referer
来阻止或限制访问。
本教程概述将Nginx配置为反向代理所需的步骤。我们假设您在Ubuntu , CentOS或 Debian服务器已安装Nginx。
要将Nginx配置为HTTP服务器的反向代理,请打开nginx虚拟服务器配置文件,并在其中location的上下文使用proxy_pass
指令设置要代理的服务器。
在Ubuntu和Debian的发行版中,服务器配置文件存储在/etc/nginx/sites-enabled
目录中,而在CentOS则存储在/etc/nginx/conf.d
目录中。
代理服务器的URL使用proxy_pass
指令设置,可以将HTTP
或HTTPS
用作协议,域名或IP地址作为主机名,并使用可选的端口和URI作为地址。
server {
listen 80;
server_name www.example.com example.com;
location /app {
proxy_pass http://127.0.0.1:8080;
}
}
上面的配置指示Nginx将所有以/app
开头的请求传递到到http://127.0.0.1:8080
服务器。
传递header
当Nginx代理请求时,它会自动删除来自客户端请求中定义两个头字段Host
和Connection
以及删除空的Header。将Host
设置为$proxy_host
变量,Connection
设置为off。
为了让应用可以获取来自客户端header,你需要使用proxy_set_header
指令,后跟header值。来设置正确Header传递应用。
在以下示例中,我们将请求头Host
字段的值更改为$host
,并将Accept-Encoding
值设置为空字符串来删除标头Accept-Encoding
请求头。
无论何时修改配置文件,都必须重新启动Nginx服务,以使更改生效。
location / {
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:3000;
}
Nginx fastcgi memcached
要将Nginx配置为非HTTP代理服务器的反向代理,可以使用指令包括,fastcgi_pass
配置FastCGI服务器代理。uwsgi_pass
配置uwsgi服务器代理。
scgi_pass
配置SCGI服务器。memcached_pass
配置Memcached服务器代理。
最常见的例子之一就是配置PHP-FPM的FastCGI代理。
server {
# ... other directives
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
proxy_pass代理配置
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
设置websocket不从缓存中获取响应,而是直接通过应用。
Upgrade $http_upgrade
和Connection "upgrade"
如果您的应用程序使用Websockets,则这些字段是必填字段。
X-Real-IP $remote_addr
将真实的客户端地址转发到应用,如果没有设置,你应用获取到将会是Nginx服务器IP地址。
X-Forwarded-For $proxy_add_x_forwarded_for
转发客户端请求头的X-Forwarded-For
字段到应用。
如果客户端请求头中不存在X-Forwarded-For
字段,则$proxy_add_x_forwarded_for
变量等同于$remote_addr
变量
X-Forwarded-Proto $scheme
这将会转发客户端所使用的HTTP协议或者是HTTPS协议。
X-Forwarded-Host $host
转发客户端请求的原始主机到应用。X-Forwarded-Port $server_port
定义客户端请求的原始端口。
如果您没有现有的SSL/TLS证书,请使用Certbot获取免费的Let’s Encrypt SSL
证书。
结论
您已经了解了如何将Nginx用作反向代理。我们还向您展示了如何将其他参数传递给服务器,以及如何在代理请求中修改和设置不同的请求头字段。
如果您有任何问题或反馈,请随时发表评论。