Nginx反向代理实现
反向代理基本配置
正向代理
正向代理是指客户端与目标服务器之间增加一个代理服务器,客户端直接访问代理服务器,再由代理服务器访问目标服务器并返回客户端。这个过程中客户端需要知道代理服务器的地址,并配置连接。
反向代理
反向代理是指客户端访问目标服务器,在目标服务器内部有一个统一接入网关将请求转发至后端真正处理的服务器并返回结果。这个过程当中客户端不需要知道代理服务器地址,代理对客户端是透明的。
区别
正向代理 | 反向代理 | |
---|---|---|
代理服务器位置 | 客户端与服务都能连接的位置 | 目标服务器内部 |
主要作用 | 屏蔽客户端IP、集中式缓存、解决客户端不能直连服务器的问题 | 屏蔽服务端内部实现、负载均衡、缓存 |
应用场景 | 爬虫、翻墙、maven的nexus服务 | Nginx、Apache负载均衡引用 |
正向代理与反向代理从技术角度来说是没有区别的,只是应用场景不同,正向代理是代理服务器访问别的外部服务器,而反向代理是访问服务器内部服务
正向代理配置
server {
listen 80;
server_name www.hello.com;
location /baidu.html {
proxy_pass http://www.baidu.com/;
}
}
反向代理配置
location /proxy {
proxy_pass http://127.0.0.1:8080;
}
}
代理相关参数
#代理服务
proxy_pass
#是否允许重定向
proxy_redirect off;
# 串header参数值后端服务
proxy_set_header Host $host;
# 设置request header即客户端地址
proxy_set_header X-Forwarded-For $remote_addr;
### 代理连接目标服务时间
#连接代理服务超时时间
proxy_connect_timeout 90;
#请求发送最大时间
proxy_send_timeout 90;
#读取最大时间
proxy_read_timeout 90;
#代理缓冲区大小
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
负载均衡配置与参数解析
upstream backend {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name www.hello.com;
# 反向代理
location / {
proxy_pass http://backend;
}
}
upstream相关参数
- server 反向服务地址加端口
- weight 权重
- max_fails 失败多少次认为主机已经挂掉,剔除;
- fail_timeout 剔除后重新探测时间;
- backup 备用服务
- max_conns 允许最大连接数
- slow_start 当节点恢复 不立即加入 而是等待slow_start时间后加入服务队列。
upstream负载均衡算法介绍
- ll+weight :轮询加权重(默认);
- ip_hash:基于Hash计算,用于保持session一致性;
- url_hash:静态资源缓存、节约存储、加快速度;
- least_conn:最少连接;
- least_time:最小的响应时间,计算节点平均响应时间,然后去响应最快的哪一个,分配更高的权重。
Nginx高速缓存
问题
当达到500QPS的时候很难继续压测上去,一个商品详情页html 主体达平均150kb,在500QPS的时候已经接近千兆局域网贷款极限,所以必须减少内网通信。
Nginx缓存配置
在http元素下添加缓存区声明。
#缓存路径
proxy_cache_path
#缓存层级及目录位数
levels
#缓存区内存大小
keys_zone
#有效期
inactive
#硬盘大小
max_size
# 指定缓存区,对应keys_zone 中设置的值
proxy_cache
#通过参数拼装缓存key
proxy_cache_key
#胃不痛的状态码设置缓存有效期
# proxy_cache_valid
# 在http模块下加入配置
proxy_cache_path /www/cache
levels=1:2 # 1代表第一层缓存中目录名有一个字符,2代表第二层目录名有两个字符
keys_zone=cache_hello:500m
inactive=20d
max_size=1g;
# 在server location下加入对应参数
location / {
proxy_cache cache_hello;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 12h;
proxy_pass http://backend;
}
虽然采用轮询算法,但是由于加了缓存,所以多次访问到的都是同一个tomcat。
指定缓存区缓存的内容
缓存清除
该功能可以采用第三方模块 ngx_cache_purge
来实现,为nginx添加新模块
# 下载包
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
# 查看已安装模块
./sbin/nginx -V
# 进入nginx安装包目录 重新安装 --add-module 为模块解压的全路径
./configure --prefix=/root/Desktop/installpack/nginx-1.18.0 --with-http_stub_status_module --with-http_ssl_module --add-module=/root/Desktop/installpack/ngx_cache_purge-2.3
# 重新编译
make
#备份并删除/usr/local/nginx/sbin/nginx 文件
#将nginx安装目录objs/nginx 拷贝到/usr/local/nginx/sbin/下面
#启动nginx
location ~ /clear(/.*) {
proxy_cache_purge cache_hello $host$1$is_args$args;
}
Nginx性能参数调优
worker_processes number
每个worker进程都是单线程的进程,它们会调用各个模块以实现各种功能。如果这些模块确认不会出现阻塞时的调用,那么有多少cpu内核就应该配置多少个进程;反之,如果有可能出现阻塞时调用,那么需要配置稍多一些的worker进程。
每个worker进程的最大连接数
worker_connections number;
worker_connections 1024; # 默认
绑定Nginx worker进程到指定的CPU内核
worker_cpu_affinity cpumask
假设每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个cpu,那么就会出现同步问题,反之,如果每一个worker进程都独享一个cpu,就会在内核的调度策略上实现完全的并发。
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001; #移位
Nginx worker进程优先级设置
worker_priority nice;
worker_priority 0; #默认
优先级由静态优先级和内核根据进程执行情况所做的动态调整共同决定,nice是进程的静态优先级,取值范围是-20~+19
,-20是最高优先级,+19是最低优先级。如果用户希望Nginx占有更多的系统资源,那么可以把nice值配置的更小一些,但不建议比内核进程的nice值还小。
Nginx worker进程可以打开最大句柄描述符个数
worker_rlimit_nofile limit;
如果没有设置则跟随系统进程的限制,设置后操作系统和Nginx可以处理比ulimit -a
更多的文件。
是否打开accept锁
accept_mutex [on|off] #默认为on
accept_mutex是Nginx的负载均衡锁,当某一个worker进程建立的连接数量达到worker_connections配置的最大连接数的7/8时,会大大地减小该worker进程试图建立新TCP连接的机会,如果关闭这个锁,那么建立TCP连接的耗时会更短,但是worker进程之间的辅助会非常不均衡,因此不建议关闭。
使用accept锁后到真正建立连接之间的延迟时间
accept_mutex_delay Nms;
在使用accept锁后,同一时间只有一个worker进程能够取到accept锁,这个accept锁不是堵塞锁,如果取不到会立即返回,然后至少等待accept_mutex_delay时间后才能再次驶入取锁。