nginx反向代理配置详解

Nginx作为反向代理服务器反向代理服务器就是在接收到客户端请求后,将其转发给后端服务器,并将服务器的响应传递回客户端。

nginx反向代理服务器

由于Nginx在性能和可扩展性方面的优势,它经常被用作HTTP和非HTTP服务器的反向代理。一个常见的配置是将Nginx置于Node.jsPythonJava应用程序之前。

使用Nginx作为反向代理,您还可以获得以下额外优势:

  • 负载均衡 – Nginx可以进行负载均衡,将客户端请求分散到多个后端服务器,从而提高性能、可扩展性和可靠性。
  • 缓存 – 作为反向代理,Nginx可以缓存预先渲染的页面,加快页面加载速度。它通过缓存来自后端服务器的响应内容,并在需要时直接使用这些缓存内容响应客户端,而无需每次都向后端服务器请求相同内容。
  • SSL终止 – Nginx可以作为SSL连接的终点,处理和解密来自客户端的SSL连接,并对后端服务器的响应进行加密。
  • 压缩 – 如果后端服务器没有发送压缩的响应,您可以配置Nginx在发送响应给客户端之前进行压缩。
  • 缓解DDoS攻击 – 您可以限制每个IP地址的请求数量和连接数,以符合普通用户的典型行为。Nginx还允许您根据客户端的位置或请求头(如“User-Agent”和“Referer”)来阻止或限制访问。

使用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指令设置,可以采用HTTPHTTPS协议,域名或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 {
    # ... 其他指令

    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_upgradeConnection "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在您的服务器上获取免费的Let’s Encrypt SSL证书。

nginx配置文件在哪里?
PHP数组中随机获取N个元素的3种常见方法

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

27 + 23 =

ajax-loader