(一)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;
}
}
参数名称 |
参数说明 |
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;
}
(四)nginx优化
(1)worker_processes
- 每个worker进程都是单线程的进程,它们会调用各个配置块以实现多种多样的功能。
- 如果模块确认不会出现阻塞式的调用,那么有多少CPU内核就应该配置多少个进程;
- 如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程,一般为CPU核数或2倍;
(2)worker_connections
(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;
}
}
}