Nginx 的代理功能与负载均衡功能是最常被用到的, 关于 nginx 的基本语法常识与配置已在 Nginx 配置详解中有说明, 这篇就开门见山, 先描述一些关于代理功能的配置, 再说明负载均衡详细.
序言
Nginx 的代理功能与负载均衡功能是最常被用到的, 关于 nginx 的基本语法常识与配置已在 Nginx 配置详解中有说明, 这篇就开门见山, 先描述一些关于代理功能的配置, 再说明负载均衡详细.
Nginx 代理服务的配置说明
1, 设置 404 页面导向地址
- error_page 404 https://www.runnob.com; #错误页
- proxy_intercept_errors on; #如果被代理服务器返回的状态码为 400 或者大于 400, 设置的 error_page 配置起作用. 默认为 off.
2, 如果我们的代理只允许接受 get,post 请求方法的一种
proxy_method get; #支持客户端的请求方法. post/get;
3, 设置支持的 http 协议版本
proxy_http_version 1.0 ; #Nginx 服务器提供代理服务的 http 协议版本 1.0,1.1, 默认设置为 1.0 版本
4, 如果你的 nginx 服务器给 2 台 web 服务器做代理, 负载均衡算法采用轮询, 那么当你的一台机器 Web 程序 iis 关闭, 也就是说 Web 不能访问, 那么 nginx 服务器分发请求还是会给这台不能访问的 Web 服务器, 如果这里的响应连接时间过长, 就会导致客户端的页面一直在等待响应, 对用户来说体验就打打折扣, 这里我们怎么避免这样的情况发生呢. 这里我配张图来说明下问题.
如果负载均衡中其中 web2 发生这样的情况, nginx 首先会去 web1 请求, 但是 nginx 在配置不当的情况下会继续分发请求道 web2, 然后等待 web2 响应, 直到我们的响应时间超时, 才会把请求重新分发给 web1, 这里的响应时间如果过长, 用户等待的时间就会越长.
下面的配置是解决方案之一.
- proxy_connect_timeout 1; #nginx 服务器与被代理的服务器建立连接的超时时间, 默认 60 秒
- proxy_read_timeout 1; #nginx 服务器想被代理服务器组发出 read 请求后, 等待响应的超时间, 默认为 60 秒.
- proxy_send_timeout 1; #nginx 服务器想被代理服务器组发出 write 请求后, 等待响应的超时间, 默认为 60 秒.
- proxy_ignore_client_abort on; #客户端断网时, nginx 服务器是否终端对被代理服务器的请求. 默认为 off.
5, 如果使用 upstream 指令配置啦一组服务器作为被代理服务器, 服务器中的访问算法遵循配置的负载均衡规则, 同时可以使用该指令配置在发生哪些异常情况时, 将请求顺次交由下一组服务器处理.
proxy_next_upstream timeout; #反向代理 upstream 中设置的服务器组, 出现故障时, 被代理服务器返回的状态值.
状态值可以是: error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
error: 建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误.
timeout: 建立连接, 想被代理服务器发送请求或读取响应信息时服务器发生超时.
invalid_header: 被代理服务器返回的响应头异常.
off: 无法将请求分发给被代理的服务器.
http_400,....: 被代理服务器返回的状态码为 400,500,502, 等.
6, 如果你想通过 http 获取客户的真是 ip 而不是获取代理服务器的 ip 地址, 那么要做如下的设置.
- proxy_set_header Host $host; #只要用户在浏览器中访问的域名绑定了 VIP VIP 下面有 RS; 则就用 $host ;host 是访问 URL 中的域名和端口 www.taobao.com:80
- proxy_set_header X-Real-IP $remote_addr; #把源 IP [$remote_addr, 建立 HTTP 连接 header 里面的信息] 赋值给 X-Real-IP; 这样在代码中 $X-Real-IP 来获取 源 IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在 nginx 作为代理服务器时, 设置的 IP 列表, 会把经过的机器 ip, 代理机器 ip 都记录下来, 用 [,] 隔开; 代码中用 echo $x-forwarded-for |awk -F, '{print $1}' 来作为源 IP
- include mime.types; #文件扩展名与文件类型映射表
- default_type application/octet-stream; #默认文件类型, 默认为 text/plain
- #access_log off; #取消服务日志
- log_format myFormat '$remote_addr-$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
- access_log log/access.log myFormat; #combined 为日志格式的默认值
- sendfile on; #允许 sendfile 方式传输文件, 默认为 off, 可以在 http 块, server 块, location 块.
- sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值, 默认为 0, 即不设上限.
- keepalive_timeout 65; #连接超时时间, 默认为 75s, 可以在 http,server,location 块.
- proxy_connect_timeout 1; #nginx 服务器与被代理的服务器建立连接的超时时间, 默认 60 秒
- proxy_read_timeout 1; #nginx 服务器想被代理服务器组发出 read 请求后, 等待响应的超时间, 默认为 60 秒.
- proxy_send_timeout 1; #nginx 服务器想被代理服务器组发出 write 请求后, 等待响应的超时间, 默认为 60 秒.
- proxy_http_version 1.0 ; #Nginx 服务器提供代理服务的 http 协议版本 1.0,1.1, 默认设置为 1.0 版本.
- #proxy_method get; #支持客户端的请求方法. post/get;
- proxy_ignore_client_abort on; #客户端断网时, nginx 服务器是否终端对被代理服务器的请求. 默认为 off.
- proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx 服务器不处理设置的 http 相应投中的头域, 这里空格隔开可以设置多个.
- proxy_intercept_errors on; #如果被代理服务器返回的状态码为 400 或者大于 400, 设置的 error_page 配置起作用. 默认为 off.
- proxy_headers_hash_max_size 1024; #存放 http 报文头的哈希表容量上限, 默认为 512 个字符.
- proxy_headers_hash_bucket_size 128; #nginx 服务器申请存放 http 报文头的哈希表容量大小. 默认为 64 个字符.
- proxy_next_upstream timeout; #反向代理 upstream 中设置的服务器组, 出现故障时, 被代理服务器返回的状态值. error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
- #proxy_ssl_session_reuse on; 默认为 on, 如果我们在错误日志中发现 "SSL3_GET_FINSHED:digest check failed" 的情况时, 可以将该指令设置为 off.
- upstream mysvr {
- server 192.168.10.121:3333;
- server 192.168.10.122:3333;
- }
- server {
- ....
- location ~*^.+$ {
- proxy_pass http://mysvr; #请求转向 mysvr 定义的服务器列表
- }
- }
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333 backup; #热备
- }
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333;
- }
- upstream mysvr {
- server 127.0.0.1:7878 weight=1;
- server 192.168.10.121:3333 weight=2;
- }
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333;
- ip_hash;
- }
- upstream mysvr {
- server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
- server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
- }
来源: http://server.51cto.com/sOS-605370.htm