nginx 反向代理说明

1 在大型项目开发中,可能会有多个应用部署在不同机器上,如果想让用户访问单个域名或IP访问到这些应用,可以使用 nginx 的反向代理,将应用的地址通过 nginx 代理,用户通过访问 nginx 地址即可访问到所有应用。

也可以在 nginx 机器上做权限控制。

由于自己资源有限,下面例子是在一台机器上部署多个应用,每个应用占用不同端口,通过 nginx 反向代理,将应用的不同端口代理到主机的 80 端口。nginx 配置如下

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


#使用 epoll 模型提高并发效率 events { use epoll; worker_connections 65535; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; gzip on; client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户 client_body_buffer_size 10m; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时) proxy_send_timeout 300s; proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘 proxy_ignore_client_abort on; #不允许代理端主动关闭连接   # 如果有多个服务器主机,可以有多个 server 模块, server { listen 80; # 监听的主机端口, server_name 140.187.167.220;#就是内部服务器的 IP 地址,或者域名
# 每个 location 代表代理一个位置,比如下面的表示:当用户访问 ${server_name}:${listen}/${location} 即 140.187.167.220:80/portal 时,实际是访问内部服务器 ${proxy_pass} 即 140.187.167.220:8082/portal
# 一个 server 模块下有多个 location 表示,代理该服务器的多个位置
# 如果有多个 server 模块,表示多个物理主机,即 ip 不同
location /portal { proxy_redirect off; 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_pass http://140.187.167.220:8082/portal; proxy_set_header Cookie $http_cookie; } location /admin { proxy_redirect off; 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_pass http://140.187.167.220:8080/admin; proxy_set_header Cookie $http_cookie; }
# 使用 nginx 做一个代理本地图片文件夹。
location ^~/images/upload/.*.(gif|jpg|jpeg|png|bmp|tiff|svg|pcd)$ { expires 30d; } access_log /var/log/nginx/proxy.log; } }

对于 location 的说明可以参看之前的博文 nginx配置文件中location说明

如果有多个应用在不同主机上,应该有多个 server 块,servername 就是 server 的 IP 地址

如果想代理一个主机上的多个位置,需要在一个 server 块下有多个 location 块。

2 nginx中负债均衡的 proxy_pass 斜杠的用法。 “/” 也是字符;

当 proxy_pass 的 ip:port 后未接字符串的时候,nginx 会将原请求路径原封不动地转交给下一站
当 proxy_pass 的 ip:port 后接了字符串的时候,nginx 会将 location 从 原请求路径 中剔除,再将剩余的字符串拼接到 proxy_pass 后生成 新请求路径,然后将 新请求路径 转交给下一站

例子1,全部转移到新路径。当访问 http://192.168.1.3/test/abc 时,会将该请求转发到 http://192.168.2.1/test/abc

server {
        listen       80;
        server_name  192.168.1.3;
        
        location ^~ /test/ {
            proxy_pass http://192.168.2.1
        }
}

例子2,剔除匹配字符串,剩余拼接到 proxy_pass 后面。当访问 http://192.168.1.3/test/abc 时,会将该请求转发到 http://192.168.2.1/abc

server {
        listen       80;
        server_name  192.168.1.3;
        
        location ^~ /test/ {
            proxy_pass http://192.168.2.1/
        }
}

3 反向代理的负载均衡

Nginx 服务器是介于客户端和服务器之间的中介,客户端发送的请求先经过 Nginx ,然后通过 Nginx 将请求根据相应的规则分发到相应的服务器。配置指令为 pass_proxy 指令以及 upstream 指令。

upstream mysvr { 
    server 192.168.10.121:3333;
    server 192.168.10.122:3333;
}
server {
    location  / {         
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
    }
}

upstream依照轮询(默认)方式进行负载,每一个请求按时间顺序逐一分配到不同的后端服务器。

3.1 upstream 的均衡策略的可用配置

1) 轮询

weight和访问比率成正比,用于后端服务器性能不均的情况。默认当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream bakend {
    server 192.168.1.10 weight=1;
    server 192.168.1.11 weight=2;
}

2)ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。如果后端服务器down掉,要手工down掉。

upstream resinserver{
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

3)fair(第三方插件)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    fair;
}

设备的状态有:

(1)down:表示单前的server暂时不参与负载

(2)weight:权重,默认为1, weight越大,负载的权重就越大。

(3)max_fails:允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。

(4)fail_timeout:max_fails次失败后,暂停的时间。

(5)backup:备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器,所以这台机器压力会最轻。

参考文献:

https://www.cnblogs.com/hualingyun/p/11125649.html

https://www.cnblogs.com/ysocean/p/9392908.html

https://blog.csdn.net/qq_29311303/article/details/52887609

https://www.runoob.com/w3cnote/nginx-proxy-balancing.html