用HTTP proxy module配置一个简单反向代理服务器

预备知识

反向代理

反向代理(reverse proxy)方式是指用代理服务器来接受 Internet 上的连接请求,然后将
请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给 Internet 上请求
连接的客户端,此时代理服务器对外的表现就是一个 Web 服务器。充当反向代理服务器也是
Nginx的一种常见用法(反向代理服务器必须能够处理大量并发请求)
由于Nginx具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户提供静态文件服务。但也有一些复杂、多变的业务不适合放到Nginx服务器上,这时会用pache、Tomcat等服务器来处理。于是,Nginx通常会被配置为既是静态Web服务器也是反向理服务器,不适合Nginx处理的请求就会直接转发到上游服务器中处理。
图片:

 

当客户端发来 HTTP 请求时, Nginx 并不会立刻转发到上游服务器,而是先把用户的请求
(包括 HTTP 包体)完整地接收到 Nginx所在服务器的硬盘或者内存中,然后再向上游服务器
发起连接,把缓存的客户端请求转发到上游服务器。

 

 

Nginx 的这种工作方式为什么会降低上游服务器的负载呢?
通常,客户端与代理服务器 之间的网络环境会比较复杂,多半是“ 公网,网速平均下来可能较慢,因此,一个请求可 能要持续很久才能完成。而代理服务器与上游服务器之间一般是“ 内网,或者有专线连 接,传输速度较快

ip_hash

在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器
。例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的
任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源
的浪费,也会难以有效地管理缓存信息。 ip_hash 就是用以解决上述问题的,它首先根据客户
端的 IP 地址计算出一个 key ,将 key 按照 upstream 集群里的上游服务器数量进行取模,然后以取
模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发
到指定的上游服务器中

负载均衡的基本配置

1upstream


语法: upstream name{...}
配置块: http

 upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
      }
}

(2)server

语法: server name[parameters];
配置块: upstream
server 配置项指定了一台上游服务器的名字:
参数解析:
weight=number:设置向这台上游服务器转发的权重,默认为1。
max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向
当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游
服务器不可用。max_fails默认为1,如果设置为0,则表示不检查失败次数
fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂
时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务
器的响应超时时间等完全无关。fail_timeout默认为10秒
down: 表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。
backup:在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务
器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求

(3)ip_hash

语法: ip_hash;
配置块  upstream
ip_hash weight (权重)配置不可同时使用。如果 upstream 集群中有一台上游服务器暂
时不可用,不能直接删除该配置,而是要 down 参数标识,确保转发策略的一贯性。例如
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}

4)记录日志时支持的变量

如果需要将负载均衡时的一些信息记录到 access_log 日志中,那么在定义日志格式时可
以使用负载均衡功能提供的变量
变量名意义
$upstream_addr处理请求的上游服务器地址
$upstream_cache_statues表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、STALE、HIT
$upstream_statues上游服务器返回的响应中的HTTP响应码
$upstream_response_time上游服务器的响应时间,精度到毫秒
$upstream_http_$HEADERHTTP的头部,如upstream http host

反向代理的基本配置

1proxy_pass

语法: proxy_pass URL;
配置块: location、if
此配置项将当前请求反向代理到 URL 参数指定的服务器上, URL 可以是主机名或 IP 地址
加端口的形式,例如:
proxy_pass http://localhost:8000/uri/
也可以是 UNIX 句柄:
proxy_pass http://unix:/path/to/backend.socket:/uri/
还可以如上节负载均衡中所示,直接使用 upstream
upstream backend {
…
}
server {
location / {
proxy_pass http://backend
;
}
}

(2)proxy_method

语法: proxy_method method;
配置块: http、server、location
此配置项表示转发时的协议方法名。例如设置为:
proxy_method POST;

(3)proxy_hide_head

语法: proxy_hide_header the_header;
配置块: http、server、location

Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、ServerX-Pad和X-Accel-* 

使用 proxy_hide_header 后可以任意地指定哪些 HTTP 头部
字段不能被转发。例如:
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;

4)proxy_pass_header


语法: proxy_pass_header the_header;
配置块: http、server、location
proxy_hide_header 功能相反, proxy_pass_header 会将原来禁止转发的 header 设置为允许
转发

(5)proxy_pass_request_body proxy_pass_request_headers

语法: proxy_pass_request_body on|off;
默认: proxy_pass_request_body on;
配置块: http、server、location

语法: proxy_pass_request_headers on|off;
默认: proxy_pass_request_headers on;
配置块: http、server、location

作用为确定是否转发HTTP头部和包体

(6)proxy_redirect

语法: proxy_redirect[default|off|redirect replacement];
默认: proxy_redirect default;
配置块: http、server、location
当上游服务器返回的响应是重定向或刷新请求(如 HTTP 响应码是 301 或者 302 )时,
proxy_redirect 可以重设 HTTP 头部的 location refresh 字段
例如,如果上游服务器发出的响
应是 302 重定向请求, location 字段的 URI http://localhost:8000/two/some/uri/ ,那么在下面的
配置情况下,实际转发给客户端的 location http://frontend one some/uri/
proxy_redirect http://localhost:8000/two/
http://frontendone;
这里还可以使用 ngx-http-core-module 提供的变量来设置新的 location 字段。例如
proxy_redirect http://localhost:8000/
http://$host:$server_port/;
也可以省略 replacement 参数中的主机名部分,这时会用虚拟主机名称来填充
proxy_redirect http://localhost:8000/two/one
使用默认的 default 参数时,会按照 proxy_pass 配置项和所属的 location 配置项重组发往客
户端的 location 头部。例如,下面两种配置效果是一样的
ocation one {
proxy_pass http://upstream:port/two/
;
proxy_redirect default;

}
location one {
proxy_pass http://upstream:port/two/
;
proxy_redirect http://upstream:port/two/one
;
}

(7)proxy_next_upstream

proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
默认: proxy_next_upstream error timeout;
此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这
个请求。前面已经说过,上游服务器一旦开始发送应答, Nginx 反向代理服务器会立刻把应
答包转发给客户端。因此,一旦 Nginx 开始向客户端发送响应包,之后的过程中若出现错误
也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只
收到来自一个上游服务器的应答。 proxy_next_upstream 的参数用来说明在哪些情况下会继续
选择下一台上游服务器转发请求
·error:当向上游服务器发起连接、发送请求、读取响应时出错。
·timeout:发送请求或读取响应时发生超时。
·invalid_header:上游服务器发送的响应是不合法的。
·http_500:上游服务器返回的HTTP响应码是500。
·http_502:上游服务器返回的HTTP响应码是502。
·http_503:上游服务器返回的HTTP响应码是503。
·http_504:上游服务器返回的HTTP响应码是504。
·http_404:上游服务器返回的HTTP响应码是404。
·off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发

参考:
http://wiki.nginx.org/Modules
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个简单的 Nginx 反向代理配置: ``` server { listen 80; server_name example.com; location / { proxy_pass http://backend; } } upstream backend { server backend1.example.com; server backend2.example.com; } ``` 这段配置会监听 80 端口的请求,如果发现请求的域名是 example.com,就会将请求转发到 backend 服务器组里的服务器上。你可以在 `upstream` 块中添加多个后端服务器,Nginx 会自动将请求轮流分发到这些服务器上。 请注意,这仅仅是一个简单反向代理配置,实际应用中还可能需要更复杂的配置。比如,你可能需要对请求进行负载均衡、使用 SSL 连接、缓存静态内容等。有关 Nginx 反向代理的更多信息,你可以参考 Nginx 官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html。 ### 回答2: nginx是一款高性能的Web服务器软件,也可以作为反向代理服务器使用。反向代理服务器可以将客户端请求转发给后端的多个服务器,提高网站的访问速度和负载均衡能力。 以下是一个基本的nginx反向代理配置示例: ``` # 指定监听的端口 server { listen 80; # 定义域名或IP地址 server_name example.com; # 反向代理配置 location / { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # 定义后端服务器列表 upstream backend_server { server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; } ``` 以上配置的含义是,当有客户端发起HTTP请求时,nginx会将请求转发给后端服务器列表中的一个服务器。在例子中,后端服务器的IP地址分别是192.168.1.100、192.168.1.101和192.168.1.102,端口均为8080。 配置中的`proxy_set_header`指令用于将客户端的请求头信息传递给后端服务器,例如`Host`和`X-Real-IP`。这样后端服务器能够正确地处理请求。 通过修改上述的配置,可以根据需求进行调整,如添加SSL支持、配置缓存等。同时,也可以通过增加更多的server块和upstream块,支持多个反向代理的需求。 总之,以上给出的nginx反向代理配置一个简单可用的示例,您可以根据具体需求进行修改和扩展,以满足您的生产环境中的需求。 ### 回答3: 以下是一个可用的nginx反向代理配置: ``` server { listen 80; server_name example.com; location / { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static { alias /path/to/static/files; expires 30d; } location /uploads { alias /path/to/uploaded/files; } location /api { proxy_pass http://api_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } upstream backend_server { server backend1.example.com; server backend2.example.com backup; } upstream api_server { server api.example.com; } ``` 这个配置监听80端口,并将所有请求都代理给后端服务器。静态文件的请求(以`/static`开头的URL)将被映射到指定的静态文件目录并设置30天的缓存。上传文件的请求(以`/uploads`开头的URL)将被映射到指定的上传文件目录。API请求(以`/api`开头的URL)将被代理给另一个后端服务器,并且一些请求头会被设置,例如Host、X-Real-IP和X-Forwarded-For。通过使用`upstream`指令,我们定义了多个后端服务器以提高可靠性。其中,`backend2.example.com`被标记为备用服务器。 请根据实际情况修改配置中的服务器名称、路径和其他参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值