网站工信部不备案吗,百度 云上传wordpress 失败,杭州网站建设哪家强,南昌网站优化网站开发华子目录 nginx反向代理功能http反向代理反向代理配置参数proxy_pass的注意事项案例#xff1a;反向代理单台后端服务器案例#xff1a;反向代理实现动静分离案例#xff1a;反向代理的缓存功能非缓存场景下测压准备缓存缓存场景下测压验证缓存文件 反向代理负载均衡#x… 华子目录 nginx反向代理功能http反向代理反向代理配置参数proxy_pass的注意事项案例反向代理单台后端服务器案例反向代理实现动静分离案例反向代理的缓存功能非缓存场景下测压准备缓存缓存场景下测压验证缓存文件 反向代理负载均衡7层upstream配置参数负载均衡算法案例反向代理多台web服务器轮询案例反向代理多台web服务器源地址hash调度案例反向代理多台web服务器对uri进行hash调度案例反向代理多台web服务器对cookie值进行hash调度案例反向代理多台web服务器下线 反向代理负载均衡4层案例基于udp的dns的负载均衡先配置dns服务器nginx配置 案例基于tcp的MySQL的负载均衡数据库配置nginx配置 nginx反向代理功能 反向代理reverse proxy指的是代理外网用户的请求到内部的指定的服务器并将数据返回给用户的一种方式这是用的比较多的一种方式Nginx除了可以在企业提供高性能的web服务之外另外还可以将nginx本身不具备的请求通过某种预定义的协议转发至其它服务器处理不同的协议就是Nginx服务器与其他服务器进行通信的一种规范主要在不同的场景使用以下模块实现不同的功能: ngx_http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理ngx_http_upstream_module 用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组ngx_stream_proxy_module 将客户端的请求以tcp协议转发至指定服务器处理ngx_http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理ngx_http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理 逻辑调用关系 访问逻辑图
同构代理用户不需要其他程序的参与直接通过http协议或者tcp协议访问后端服务器异构代理用户访问资源时需要经过处理后才能返回比如phppython等等这种访问资源需要经过处理才能被访问 http反向代理
官方文档https://nginx.org/en/docs/http/ngx_http_proxy_module.html
反向代理配置参数 proxy_pass 用来设置将客户端请求转发给的后端服务器的主机可以是主机名:端口、IP地址:端口也可以代理到预先设置的主机群组需要模块ngx_http_upstream_module支持 proxy_hide_header field 用于nginx作为反向代理的时候在返回给客户端http响应时隐藏后端服务器相应头部的信息可以设置在http,server或location块 #示例: 隐藏后端服务器ETag首部字段
location /web {index index.html;proxy_pass http://10.0.0.18:8080/;proxy_hide_header ETag;
}proxy_pass_header field 透传默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数如果要传递的话则要使用proxy_pass_header field声明将后端服务器返回的值传递给客户端field 首部字段大小不敏感 #示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
proxy_pass_header Server;
proxy_pass_header Date;proxy_pass_request_body on | off 是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块默认即为开启 proxy_pass_request_headers on | off 是否将客户端的请求头部转发给后端服务器可以设置在http,server或location块默认即为开启 proxy_set_header 可更改或添加客户端的请求头部信息内容并转发至后端服务器比如在后端服务器想要获取客户端的真实IP的时候就要更改每一个报文的头部 #示例:
location ~ /web {proxy_pass http://172.25.254.20:80;proxy_hide_header ETag;proxy_pass_header Server;proxy_pass_request_body on;proxy_pass_request_headers on;proxy_set_header X-Forwarded-For $remote_addr;
}proxy_connect_timeout time 配置nginx服务器与后端服务器尝试建立连接的超时时间默认为60秒 #用法如下proxy_connect_timeout 60s;
#60s为自定义nginx与后端服务器建立连接的超时时间,超时会返回客户端504响应码proxy_read_timeout time 配置nginx服务器向后端服务器或服务器组发起read请求后等待的超时时间默认60s proxy_send_timeout time 配置nginx项后端服务器或服务器组发起write请求后等待的超时 时间默认60s proxy_http_version 1.0 用于设置nginx提供代理服务的HTTP协议的版本默认http 1.0 proxy_ignore_client_abort off 当客户端网络中断请求时nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启则服务器、会忽略客户端中断并一直等着代理服务执行返回如果设置为off则客户端中断后Nginx也会中断客户端请求并立即记录499日志默认为off proxy_pass的注意事项
location /web {index index.html;proxy_pass http://172.25.254.30:8080;
}
#8080后面无uri即无/符号会将location后面的url加到proxy_pass指定的url后面此行为类似于root
#proxy_pass指定的uri不带斜线将访问/web下的内容如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~)则proxy_pass之后必须不能使用uri。即不能有/ 用户请求时传递的uri将直接附加至后端服务器之后 location /web {index index.html;proxy_pass http://172.25.254.30:8080/;
}
#8080后面有uri即/符号此行为类似于alias
#proxy_pass指定的uri带斜线等于访问http://172.25.254.30:8080/index.htmllocation中的proxy_pass只能有一个不能有多个否则会报错 案例反向代理单台后端服务器
nginx服务器172.25.254.100 www.huazi.orgweb1服务器172.25.254.10
[rootweb1 ~]# yum install httpd -y
[rootweb1 ~]# echo 172.25.254.10 /var/www/html/index.html
[rootweb1 ~]# systemctl start httpd[rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name www.huazi.org;location / {proxy_pass http://172.25.254.10:80;}
}[rootnginx-node1 ~]# nginx -s reload测试当访问www.huazi.org时nginx会将请求代理到web1上
案例反向代理实现动静分离 nginx服务器172.25.254.100 www.huazi.orgweb1服务器172.25.254.10 动web2服务器172.25.254.20 静
[rootweb1 ~]# yum install php -y
[rootweb1 ~]# vim /var/www/html/index.php
?phpphpinfo();
?[rootweb1 ~]# systemctl restart httpd[rootweb2 ~]# yum install httpd -y[rootweb2 ~]# mkdir -p /var/www/html/static[rootweb2 ~]# echo static 172.25.254.20 /var/www/html/static/index.html[rootweb2 ~]# systemctl start httpd[rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen 80;server_name www.huazi.org;location ~ \.php$ {proxy_pass http://172.25.254.10:80;}location /static {proxy_pass http://172.25.254.20:80;}
}[rootnginx-node1 ~]# nginx -s reload测试 案例反向代理的缓存功能 proxy_cache zone_name | off; 默认off 指明调用的缓存或关闭缓存机制zone_name表示缓存的名称需要由proxy_cache_path事先定义 proxy_cache_key string 缓存中用于“键”的内容默认值proxy_cache_key $scheme$proxy_host$request_uri; proxy_cache_valid [code ...] time; 定义对特定响应码的响应内容的缓存时长定义在http{...}中示例: proxy_cache_valid 200 302 10m; 对于 HTTP 响应状态码为 200OK和 302Found通常用于临时重定向的响应它们将被缓存并且缓存有效期为 10 分钟10m proxy_cache_path 路径 定义可用于proxy功能的缓存 proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; 默认是off 在被代理的后端服务器出现哪种情况下可直接使用过期的缓存响应给客户端示例 proxy_cache_use_stale error http_502 http_503; proxy_cache_methods GET | HEAD | POST ...; 对哪些客户端请求方法对应的响应进行缓存GET和HEAD方法总是被缓存 #示例在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache levels1:2:2 keys_zoneproxycache:20m inactive120s max_size10g;#/var/cache/nginx/proxy_cache 定义缓存保存路径,proxy_cache会自动创建
#levels1:2:2 定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^82^201048576个目录
#keys_zoneproxycache:20m 定义了一个名为proxycache的缓存键区域并为其分配了20MB的内存,一般1M可存放8000个左右的key
#inactive120s 缓存有效时间
#max_size10g 最大磁盘占用空间磁盘存入文件内容的缓存空间最大值#调用缓存功能需要定义在相应的配置段如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间10分钟
proxy_cache_valid any 1m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存非缓存场景下测压
[rootweb2 ~]# ab -n 1000 -c 100 http://www.huazi.org/static/index.html准备缓存
在主配置文件中
[rootnginx-node1 ~]# vim /usr/local/nginx/conf/nginx.confproxycache名字可以自定义 [rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf[rootnginx-node1 ~]# nginx -s reload缓存场景下测压
[rootweb2 ~]# ab -n 1000 -c 100 http://www.huazi.org/static/index.html发现请求变快了
验证缓存文件 反向代理负载均衡7层
官方文档 https://nginx.org/en/docs/http/ngx_http_upstream_module.html在上面的案例中Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器而且不能对后端服务器提供相应的服务器状态监测Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
upstream配置参数
http {upstream name {server ip:port [params];......................}server {location / {proxy_pass http://name;}}
}upstream中的server支持的params如下
weightnumber #设置权重默认为1,实现类似于LVS中的WRR,WLC等
max_connsnumber #给当前后端server设置最大活动链接数默认为0表示没有限制
max_failsnumber #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeouttime #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用如果发现可用,则将后端服务器参与调度,默认为10秒
backup #设置为备份服务器当所有后端服务器不可用时,才会启用此备用服务器
down #标记为down状态,可以平滑下线后端服务器
resolve #当server定义的是主机名的时候当A记录发生变化会自动应用新IP而不用重启负载均衡算法
Nginx支持多种负载均衡算法常见的包括
轮询Round Robin默认算法按照顺序将请求依次分发到后端服务器权重Weighted Round Robin为每个后端服务器设置权重权重高的服务器分配的请求会更多IP 哈希ip_hash根据客户端 IP 的哈希值决定分发到哪台后端服务器适用于需要保持会话一致性的场景最少连接least_conn将请求分配给当前连接数最少的后端服务器hash指定字段哈希基于指定的请求字段如URL、Cookie等来分配请求 案例反向代理多台web服务器轮询 需要location块中的proxy_pass参数和upstream块配合使用upstream块和server块是同级的 [rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster {server 172.25.254.10:80 fail_timeout15s max_fails3;server 172.25.254.20:80 fail_timeout15s max_fails3;server 172.25.254.100:80 backup;
}server {listen 80;server_name www.huazi.org;location / {proxy_pass http://webcluster;}
}max_failsnumber 后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测fail_timeouttime 后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用如果发现可用,则将后端服务器参与调度,默认为10秒backup关键字意味着只有当webcluster组中的其他所有服务器都不可用时Nginx才会向这个服务器发送请求 [rootnginx-node1 ~]# nginx -s reload测试
案例反向代理多台web服务器源地址hash调度 有ip_hash就不能有backup [rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster {ip_hash;server 172.25.254.10:80 fail_timeout15s max_fails3;server 172.25.254.20:80 fail_timeout15s max_fails3;
}server {listen 80;server_name www.huazi.org;location / {proxy_pass http://webcluster;}
}[rootnginx-node1 ~]# nginx -s reload测试 案例反向代理多台web服务器对uri进行hash调度
[rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster {hash $request_uri consistent;server 172.25.254.10:80 fail_timeout15s max_fails3;server 172.25.254.20:80 fail_timeout15s max_fails3;
}server {listen 80;server_name www.huazi.org;location / {proxy_pass http://webcluster;}
}[rootnginx-node1 ~]# nginx -s reload[rootweb1 ~]# mkdir -p /var/www/html/static/
[rootweb1 ~]# echo 172.25.254.10 static /var/www/html/static/index.html案例反向代理多台web服务器对cookie值进行hash调度
[rootnginx-node1 ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster {hash $cookie_huazi;server 172.25.254.10:80 fail_timeout15s max_fails3;server 172.25.254.20:80 fail_timeout15s max_fails3;
}server {listen 80;server_name www.huazi.org;location / {proxy_pass http://webcluster;}
}[rootnginx-node1 ~]# nginx -s reload案例反向代理多台web服务器下线
upstream webcluster {hash $cookie_huazi;server 172.25.254.10:80 fail_timeout15s max_fails3 down;server 172.25.254.20:80 fail_timeout15s max_fails3;
}server {listen 80;server_name www.huazi.org;location / {proxy_pass http://webcluster;}
}[rootnginx-node1 ~]# nginx -s reload反向代理负载均衡4层
stream {upstream backend {server backend1.example.com:3306;server backend2.example.com:3306;}server {listen 3306;proxy_pass backend;}
}Nginx在1.9.0版本开始支持tcp模式的负载均衡在1.9.13版本开始支持udp协议的负载udp主要用于DNS的域名解析其配置方式和指令和http代理类似其基于ngx_stream_proxy_module模块实现tcp负载另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、调度算法等高级功能如果编译安装需要指定--with-stream选项才能支持ngx_stream_proxy_module模块官方文档https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html
案例基于udp的dns的负载均衡
nginx服务器172.25.254.100 www.huazi.orgdns1服务器172.25.254.10dns2服务器172.25.254.20
先配置dns服务器
[rootweb1 ~]# yum install bind -y[rootweb1 ~]# vim /etc/named.conf[rootweb1 ~]# vim /etc/named.rfc1912.zones[rootweb1 ~]# cd /var/named/
[rootweb1 named]# cp -a named.localhost /var/named/huazi.com.zone
[rootweb1 named]# vim huazi.com.zone[rootweb1 named]# systemctl start named[rootweb1 named]# dig www.huazi.com 172.25.254.10[rootweb2 ~]# yum install bind -y[rootweb2 ~]# vim /etc/named.conf[rootweb2 ~]# vim /etc/named.rfc1912.zones[rootweb2 ~]# cd /var/named/
[rootweb2 named]# cp -a named.localhost /var/named/huazi.com.zone
[rootweb2 named]# vim huazi.com.zone[rootweb2 named]# systemctl start named[rootweb2 named]# dig www.huazi.com 172.25.254.20nginx配置 udp和tcp的负载均衡要写在http块之外 #修改主配置文件
[rootnginx-node1 ~]# vim /usr/local/nginx/conf/nginx.conf[rootnginx-node1 ~]# mkdir -p /usr/local/nginx/tcpconf.d/[rootnginx-node1 ~]# vim /usr/local/nginx/tcpconf.d/dns.conf
stream {upstream dns {server 172.25.254.10:53 fail_timeout15s max_fails3;server 172.25.254.20:53 fail_timeout15s max_fails3;}server {listen 53 udp reuseport;proxy_timeout 20s;proxy_pass dns;}
}[rootnginx-node1 ~]# nginx -s reload测试 100上没有dns服务dig却可以指定到100通过100进行代理 案例基于tcp的MySQL的负载均衡
nginx服务器172.25.254.100 www.huazi.orgMySQL1服务器172.25.254.10MySQL2服务器172.25.254.20
数据库配置
[rootweb1 ~]# yum install mariadb-server -y[rootweb2 ~]# yum install mariadb-server -y[rootweb1 ~]# vim /etc/my.cnf.d/mariadb-server.cnf[rootweb2 ~]# vim /etc/my.cnf.d/mariadb-server.cnfnginx配置
[rootnginx-node1 ~]# vim /usr/local/nginx/tcpconf.d/dns.conf[rootnginx-node1 ~]# nginx -s reload下载MySQL的客户端
[rootnginx-node1 ~]# yum install mariadb -y测试