文章目录
(一)nginx反向代理
(1)什么是反向代理
- 反向代理:使用代理服务器接受Internet上的请求,将请求转发给内部服务器,将内部服务器响应结果返回给Internet上请求的客户端。
- 正向代理:客户端无法访问Internet时,通过访问正向代理服务器(可与客户端、Internet连通),再由正向代理服务器访问Internet,获取响应结果后返回给客户端。
- 正向代理与反向代理区别:
正向代理 | 反向代理 | |
---|---|---|
代理服务器位置 | 客户端与服务器都能连接的位置 | 目标服务器内部 |
主要作用 | 屏蔽客户端IP、集中式缓存、解决客户端不能直连服务端的问题 | 屏蔽服务端IP及内部实现、负载均衡、缓存 |
应用场景 | 爬虫、翻墙、maven的nexus服务 | Nginx、Apache负载均衡应用 |
(2)nginx代理配置
- 访问: http://localhost:8001/job/page
- 代理到:http://192.168.100.100:9999/page
server { listen 8001; server_name localhost; location /job/ { proxy_pass http://192.168.100.100:9999/; # 加上'/'后,代理到的地址会去掉location后面的路径(即:/job/) } }
- 访问: http://localhost:8001/job/page
- 代理到:http://192.168.100.100:9999/job/page
server { listen 8001; server_name localhost; location /job/ { proxy_pass http://192.168.100.100:9999; # 去掉'/',代理地址会拼接上location后面的路径 } }
代理相关参数 | 参数说明 |
---|---|
proxy_pass | 代理服务 |
proxy_redirect off; | 是否允许重定向 |
proxy_set_header Host $host; | 传header参数至后端服务,$http_host,$proxy_port,$proxy_host |
proxy_set_header X-Forwarded-For $remote_addr; | 设置 request header,即客户端IP地址 |
proxy_connect_timeout 90; | 连接代理服务超时时间 |
proxy_send_timeout 90; | 请求发送最大时间 |
proxy_read_timeout 90; | 读取最大时间 |
(二)nginx负载均衡
upstream backend {
server 192.168.100.100:9001;
server 192.168.100.100:9002;
}
server {
listen 8001;
server_name localhost;
proxy_connect_timeout 1; # 超时无响应,自动转发到其他服务器
proxy_send_timeout 1; # 后端服务器数据回传时间
proxy_read_timeout 1; # 连接成功后_等候后端服务器响应时间
location / {
proxy_pass http://backend;
}
}
- upstream参数说明:
参数名称 | 参数说明 |
---|---|
weight | 权重 |
max_fails | 最大失败数,触达则剔除主机 |
fail_timeout | 主机剔除后,重新探测时间,触达后再次按max_fails进行新一轮主机探活,直至主机恢复 |
backup | 备用服务 |
max_conns | 允许最大连接数 |
ll+weight | 轮询加权重(默认) |
ip_hash | 基于Hash计算,用于session保持,不与backup一同使用 |
url_hash | 静态资源缓存,节约存储,加快速度(第三方) |
least_conn | 最少链接(第三方) |
least_time | 最小响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重(第三方) |
upstream backend {
#ip_hash; # 用于会话保持,不与backup一同使用。
server 192.168.100.100:9001 weight=1 max_fails=1 fail_timeout=5;
server 192.168.100.100:9002 weight=2;
server 192.168.100.100:9003 weight=1 backup;
}
(三)nginx缓存
- 修改nginx配置文件下http配置块:
http {
...
proxy_cache_path D:\nginx-1.18.0\proxy_cache\cache levels=1:2 keys_zone=cache:60m max_size=120m inactive=1h use_temp_path=off;
#缓存临时目录
proxy_temp_path D:\nginx-1.18.0\proxy_cache\tmp;
server {
...
}
}
- 参数说明:
参数名称 | 说明 |
---|---|
proxy_cache_path | nginx缓存资源的存放路径 |
levels | 缓存文件目录层次;levels=1:2表示两级目录 |
key_zone | 在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中缓存,1m可以存储8000个key |
max_size | 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件 |
inactive | 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件 |
use_temp_path | 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝 |
- 修改反向代理:
location / {
proxy_cache cache; # 启用缓存,若为off表示关闭缓存
proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid 200 10s;
proxy_cache_valid 404 2h;
add_header cache-status $upstream_cache_status; # 变量$upstream_cache_status,表示显示缓存的状态
proxy_pass http://myserver;
index index.html index.htm;
}
- 注意:post请求不会缓存
(四)nginx优化
(1)worker_processes
- 每个worker进程都是单线程的进程,它们会调用各个配置块以实现多种多样的功能。
- 如果模块确认不会出现阻塞式的调用,那么有多少CPU内核就应该配置多少个进程;
- 如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程,一般为CPU核数或2倍;
(2)worker_connections
-
表示worker进程的最大连接数,默认1024。
-
connections不可随便设置,需与两个重要指标关联:
- 内存:
- 每个连接数分别对应一个read_event、一个write_event事件;
- 一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节;
- 通过数学公式可以算出100000个连接数大概会占用31M(100000*328/1024/1024);
- 当然这只是nginx启动时,connections连接数所占用的nginx。
- 进程最大可打开文件数:
- 进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询;
- nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式;
- 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值;
(1)修改系统配置
vim /etc/security/limits.conf soft nofile 65535 hard nofile 65535 soft nproc 65535 hard nproc 65535 #退出重新连接 查看 ulimit -n
(2)nginx配置
#配置Nginx worker进程最大打开文件数 worker_rlimit_nofile 65535;
ps -elf | grep nginx 找到nginx的worker进程ID
cat /proc/1203/limits 查看,其中1203是worker进程ID,请注意其中的Max open files
系统的最大打开文件数>= worker_connections*worker_process
(3)worker_cpu_affinity
- 绑定Nginx worker进程到指定的CPU内核:
- 假定每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,那么这就会出现同步问题。
- 如果每一个worker进程都独享一个CPU,就在内核的调度策略上实现了完全的并发。
- 仅对Linux操作系统有效。
例如,如果有4颗CPU内核,就可以进行如下配置:
worker_processes 4; worker_cpu_affinity 1000 0100 0010 0001;
例如,如果有8颗CPU内核,就可以进行如下配置:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
(4)open_file_cache
- 为打开文件指定缓存,默认未启用
open_file_cache max=65535 inactive=60s;
参数 | 说明 |
---|---|
max | 指定缓存数量,建议和打开文件数一致 |
inactive | 经过多长时间文件没被请求,删除缓存 |
(5)open_file_cache_valid
- 多长时间检查一次缓存的有效信息。
open_file_cache_valid 80s;
(6)open_file_cache_min_uses
- open_file_cache 指令中的 inactive 参数设定的时间内,文件的最少使用次数
open_file_cache_min_uses 1;
(7)优化样例
worker_processes 2;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
}
http {
open_file_cache max=65535 inactive=60s;
open_file_cache_valid 80s;
open_file_cache_min_uses 1;
proxy_cache_path D:\nginx-1.18.0\proxy_cache\cache levels=1:2 keys_zone=cache:60m max_size=120m inactive=1h use_temp_path=off;
proxy_temp_path D:\nginx-1.18.0\proxy_cache\tmp; #缓存临时目录
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}