正向代理:
每个客户端都有一个代理,客户端通过代理去目标服务器获取资源,客户端清楚并知道服务器是谁,而服务器不知道客户端是谁
反向代理:
客户端发请求到反向代理服务器,反向代理服务器根据客户端请求再结合自身规则返回给客户端资源
反向代理是客户端不知道服务器的情况,客户端只管从反向代理服务器获取资源
负载均衡: 后台服务器组成了一个服务器集群(多台服务器). 有中间服务器(nginx)接受到请求分发给不同的服务器后台. 该nginx就是一个负载均衡服务器. 优点: ??分散后台服务器的压力 ??自动去掉挂掉的后台服务器 ??缓存后台服务器响应内容
负载均衡的分配策略 ??nginx 的 upstream目前支持 4 种方式的分配 ??1、轮询(默认) ??????每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然方式简便、成本低廉。但缺点:可靠性低和负载分配不均衡。 ??2、weight ?????指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
server 192.168.48.128 weight = 6; #60%请求
server 192.168.48.129 weight = 4; #40%请求
? ??3、ip_hash ?????每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 ??4、fair(第三方) ?????按后端服务器的响应时间来分配请求,响应时间短的优先分配。 ??5、url_hash(第三方) ????按访问url的hash结果来分配请求,使每个url定向到同一 ????个后端服务器,后端服务器为缓存时比较有效。
nginx.conf基础文件
#运行nginx的所属组和所有者
user ?nginx;
#这是nginx服务器并发处理服务的关键配置,它的值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
#开启一个nginx工作进程,一般cpu几核就写几
worker_processes ?auto;
error_log ?/var/log/nginx/error.log notice;
pid ? ? ? ?/var/run/nginx.pid; #pid路径
events 块涉及的指令**主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数。
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
events {
#一个worker进程可以同时处理1024个请求
#支持的最大连接数为1024,这部分配置对于nginx的性能影响较大,在实际中应灵活配置
? ? worker_connections ?1024;
}
#这是nginx配置中最频繁的一部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是,http块包括http全局块、server块
# 提供 http 服务相关的配置参数,一般默认配置就可以,主要配置在于 http 上下文里的 server 上下文
http {
? ? include ? ? ? /etc/nginx/mime.types;
? ? default_type ?application/octet-stream;
? ? log_format ?main ?'$remote_addr - $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;
? ? #可以配置多个单独的*.conf文件,最终都会在http块里被执行,也可直接写在当前http块下
? ? #一个http块下面可以有多个server块,这些server块可以单独配置在单独的*.conf文件里面
include /etc/nginx/conf.d/*.conf;
}
default.conf基础文件
server {
? ? listen ? ? ? 80; #监听本机80端口
? ? listen ?[::]:80;
? ? server_name ?localhost;#域名配置项,匹配所有就用“_”下划线
? ? #access_log ?/var/log/nginx/host.access.log ?main;
#location 块
#一个 server 块可以配置多个 location 块。
#这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚
#拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请
#求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
? ? location / {
? ? ? ? root ? /usr/share/nginx/html/boke;#资源路径
? ? ? ? index ?index.html index.htm;#寻找路径下的index.html和index.htm
? ? }
#server {
# listen 82;
# server_name 192.168.48.128;
# location ~/boke/ {
# root /usr/share/nginx/html/;
# index index.html index.htm;
# }
#}
? ? #error_page ?404 ? ? ? ? ? ? ?/404.html;
? ? # redirect server error pages to the static page /50x.html
? ? #
? ? error_page ? 500 502 503 504 ?/50x.html;
? ? location = /50x.html {
? ? ? ? root ? /usr/share/nginx/html;
? ? }
}
反向代理示例:
一、通过路径访问两台服务器:
在192.168.48.128服务器上安装tomcat并启动,
在192.168.48.129上配置server块(server要在http块中),或者在conf.d目录中单独创建*.conf文件
我在conf.d目录下创建了82.conf文件,在里面做了如下配置
#当用户访问nginx服务器localhost:82时,将跳转到指向的tomcat服务器,并显示tomcat页面
server {
#监听82端口
listen 82;
#下划线表示适配网址和ip
server_name _;
location / {
#使用proxy_pass指向到代理的tomcat服务器地址
proxy_pass http://192.168.48.128:8081;
index index.html index.htm;
}
}
二、通过指定不同的后缀来访问不同的服务器
分别访问以下两个不同后缀的链接到不同的服务器
http://192.168.48.129:82/linboke/
http://192.168.48.129:82/winboke/
#在server块里定义多个location块
server {
listen 82;
server_name _;
#在linux上启动一个tomcat,在tomcat webapps目录下创建linboke目录
location ~/linboke/ {
#指定跳转到linboke目录所在的服务器和端口
proxy_pass http://192.168.48.128:8081;
index index.html index.htm;
}
#在windows上启动一个tomcat,在tomcat webapps目录下创建winboke目录
location ~/winboke/ {
#指定跳转到winboke目录所在的服务器和端口
proxy_pass http://192.168.0.234:8080;
index index.html index.htm;
}
}
以上配置了两个location,也可配置多个,下面看下location语法
location [=|~|~*|^~] /uri/ { … }
= ? ? ? ? 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
~ ? ? ? ? 区分大小写匹配(可用正则表达式)
~* ? ? ? 不区分大小写匹配(可用正则表达式)
!~ ? ? ? 区分大小写不匹配
!~* ? ? 不区分大小写不匹配
^~ ? ? ? 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式
#示例1:匹配任意请求
location / { }
#示例2:
#不区分大小写匹配任何以gif、jpg、jpeg结尾的请求,并将该请求重定向到 /logo.png请求
location ~* .(gif|jpg|jpeg)$ {
rewrite .(gif|jpg|jpeg)$ /logo.png;
}
#示例3:
#区分大小写匹配以.txt结尾的请求,并设置此location的路径是/usr/local/nginx/html/。
#也就是以.txt结尾的请求将访问/usr/local/nginx/html/ 路径下的txt文件
location ~ ^.+\.txt$ {
root /usr/local/nginx/html/;
}
负载均衡示例:
在linux和Windows 的tomcat的webapps目录下创建共同目录linboke,在linboke目录下创建index.html文件,可以写入不同内容以作区分
#在http块中的全局块中配置
#upstream是固定写法,myserver可以自定义
#负载均衡,当前未配置负载均衡规则,所以目前是默认的轮询规则
upstream myserver {
#linux中的tomcat服务器
server 192.168.48.128:8081;
#windows中的tomcat服务器
server 192.168.0.234:8080;
}
server {
#监听82端口
listen 82;
location / {
#定向到自定义的myserver
proxy_pass http://myserver;
}
}
访问nginx服务器192.168.48.129:82/linboke 页面,刷新第一次出现页面1再刷新一次页面出现页面2,多次刷新后随着页面内容的交替变化,发现此时nginx的负载均衡轮询规则已经生效
1、轮询(默认)
每个客户端的请求会按照时间顺序逐个分配到不同的后端服务器,如何myserver块中的某一台服务器挂了,那么nginx会自动剔除出问题的机器,保证业务正常
2、weight权重
这里经过实验权重为1的服务器,刷新两次或者3次页面都还在,
权重为2的服务器往往只刷新一次就结束了,往往只能等待权重大的服务器被使用多次后才能再次被使用一次
upstream myserver {
#weight=1 默认权重为1,权重越高被使用的次数越高
server 192.168.48.128:8081 weight=1;
server 192.168.0.234:8080 weight=2;
}
server {
listen 82;
location / {
proxy_pass http://myserver;
}
}
3、ip_hash
我这边配置了ip_hash后,多次刷新后页面始终不变,一直停留在192.168.0.234:8080服务器的页面,可真是逮着一个小可爱就可劲儿薅啊!
当然,如果我在另一台电脑上进入页面,很可能会一直停留在另一个页面
upstream myserver {
server 192.168.48.128:8081;
server 192.168.0.234:8080;
ip_hash;
}
server {
listen 82;
location / {
proxy_pass http://myserver;
}
}
4、fair模块(第三方)
fair 采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、响应时间智能的进行负载均衡?。
upstream myserver {
server 192.168.48.128:8081;
server 192.168.0.234:8080;
fair;
}
server {
listen 82;
location / {
proxy_pass http://myserver;
}
}
由于是fair是第三方模块,需要额外安装配置
配置扩展
server块
server {
#如果你使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
#这样http和https的链接都可以用,防止http请求发送到https端口后报400错误
#配置HTTPS的默认访问端口为443,443后面跟ssl
listen 443 ssl;
#配置证书绑定的域名
server_name cx.com;
#以下属性中,以ssl开头的属性表示与证书配置有关。
#配置.pem文件地址(证书文件)
ssl_certificate cert/1234522_cx.com.pem;
#配置.key文件地址(私钥文件)
ssl_certificate_key cert/1234522_cx.com.key;
----------------------------------------------------------------------------------------
#ssl_session_cache:用于缓存 https建立连接后的session key,减少后续因为断开后需要重新建连造成的性能损耗。
#ssl_session_cache,就是缓存ssl会话状态的缓存,它有4种模式可选,分别是:
#off:严格的禁止使用会话缓存
#none:宽松的禁止使用会话缓存,即虽然nginx不说不允许使用会话缓存,但实际不会将会话缓存下来
#builtin:openssl的内置缓存,只有一个工作进程可以使用该缓存,官方指出,内置缓存,会导致内存碎片
#shared:共享缓存,所有worker进程共享
#设置为使用1m内存。 1m ~= 4000 connections
ssl_session_cache shared:SSL:1m;
#缓存的时间由ssl_session_timeout决定,默认是5分钟
ssl_session_timeout 5m;
#在 nginx 中设置ssl_session_cache之后,就开启了TLS缓存复用
#客户端Client Hello的时候,会带一个Session ID
#服务端和客户端协商建立连接,确认Session ID
#然后客户端将Session ID保存在本地,再次发起连接的时候,Client Hello会带上这个ID
#因为服务端开启了ssl_session_cache,则在缓存中查找对应的Session ID,如果存在则接受并恢复会话,返回相同的Session ID
#如果在缓存中,未找到对应的Session ID,则转换成完整的TLS握手
#TLS通过复用ssl来优化TLS连接过程,tls的复用由服务端决定是否可复用,包括session的过期时间,在nginx中,通过开启ssl_session_cache来开启缓存和复用,性能会有极大提升。
----------------------------------------------------------------------------------------
#ssl_ciphers配置项的可选值由openssl 的ciphers定义
#配置加密套件,写法遵循openssl标准,nginx 默认配置是 HIGH:!aNULL:!MD5
ssl_ciphers HIGH:!aNULL:!MD5;
###ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#密码加密方式
#启用特定的加密协议
ssl_prefer_server_ciphers on;
#B<HIGH>:“high”加密算法套件。目前意味着密钥长度值大于128位,目前一些算法套件是128字节的密钥。
#题外:如果使用字符“!”,则从算法列表中禁用该算法。根据明确的规定,禁用了的算法将不会再出现。
}
location块
#根据location的匹配优先级如下
#(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序)(location 部分起始路径) > (/)
location / {
## 配置页面不缓存html和htm结尾的文件
#$request_filename:当前连接请求的文件路径,由root或alias指令与URI请求生成。
#匹配所有以htm或html结尾的文件,~* 开头表示不区分大小写的正则匹配
if ($request_filename ~* .*\.(?:htm|html)$)
{
#如果匹配到htm或html结尾的文件,那么就不缓存
#private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问服务器
#no-store: 不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源)
#no-cache: 数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age, 则缓存期间不访问服务器
#must-revalidate:缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。表示如果页面过期,则去服务器进行获取。
#proxy-revalidate:与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
#注:Cache-Control设置为 max-age=no-cache 服务端还是会返回304,只有设置成 no-store 才是强制不缓存。
#
}
root app1;
index index.html index.htm;
#try_files去尝试到网站目录读取用户访问的文件,如果第一个变量存在,就直接返回;
#不存在继续读取第二个变量,如果存在,直接返回;不存在直接跳转到第三个参数上。
try_files $uri $uri/ /index.html;
}
-----------------------------------------------------------------------------------
location /test/ {
#alias的处理结果是:使用alias路径替换location路径
alias /root/yxx/nginx/yj/test/;
index index.html index.htm;
try_files $uri $uri/ /yj/test/index.html;
}
#location ~/boke/ {
# #root的处理结果是:root路径+location路径,这里起到的是把链接拼合的作用
#并且root在nginx配置文件的server、http和location中都可以使用
#/usr/share/nginx/html/ + /boke/ + index.html
# root /usr/share/nginx/html/;
# index index.html index.htm;
# }
###~~~~~~~~~~~~~~~~~~~~alias示例~~~~~~~~~~~~~~~~~~~~~###
#--alias只能在location块中使用--+
#当请求为“192.168.48.128:82/boke2/”时,location的/boke2/会被替换为alias的内容,紧接着去找index.html”。
#linux资源目录完整路径:/usr/share/nginx/html/boke2/index.html
location /boke2/ {#效果同下,location /boke2/的这个值完全就是自定义
alias /usr/share/nginx/html/boke2/;
index index.html index.htm;
}
#效果同上,哪怕我随便定一个/b/,nginx会忽略/b/,/b/只起引导作用,最终也只会去找alias路径下的资源
location /b/ {
alias /usr/share/nginx/html/boke2/;
index index.html index.htm;
}
#--alias--+
#配合 location 的正则表达式使用
#匹配到静态图片资源就进入alias下的路径
location ~ ^/u/(.+\.(?:gif|jpe?g|png))$ {
alias /usr/share/nginx/html/boke2/$1;
}
#请求为“/u/33.png”时, 返回文件“/usr/share/nginx/html/boke2/33.png”。
#--alias--+
###~~~~~~~~~~~~~~~~~~~~alias end~~~~~~~~~~~~~~~~~~~~###
-----------------------------------------------------------------------------------
#nginx使用proxy模块时,默认的读取超时时间是60s。
location ^~ /app2/{
#反向代理:转发
proxy_pass http://127.0.0.1:8000/app2/app2/;
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
#是向后端写数据的超时时间,两次写操作的时间间隔大于这个值,也就是过了这么长时间后端还是没有收到数据,连接会被关闭。如果超时,Nginx 的返回码是多少? 504
proxy_send_timeout 1800;# 秒 默认值 60s
#连接成功后等候后端服务器响应时间其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
#是从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,和后端的连接会被关闭。如果一个请求时间时间非常大,要把这个值设大点。如果超时,Nginx 的返回码是多少? 504
proxy_read_timeout 1800;# 秒 默认值 60s
#后端服务器连接的超时时间_发起握手等候响应超时时间
#是和后端建立连接的超时时间,记住不要超过 75s 。如果超时,Nginx 的返回码是多少? 504
proxy_connect_timeout 1800;# 秒 默认值 60s
#nginx对上传文件大小有要求,默认1m,如果很大,还要适当调整上传超时时间
#限制请求体的大小,若超过所设定的大小,返回413错误
#客户端请求服务器最大允许大小,如果超过设定值,肯定就报错了
client_max_body_size 2048m;#默认1m
#http协议版本
proxy_http_version 1.1;
###~~~~~~~~~~~~~~~~~~~~proxy_set_header ~~~~~~~~~~~~~~~~~~~~###
#proxy_set_header 就是可设置请求头-并将头信息传递到服务器端。不属于请求头的参数中也需要传递时 重定义下就行
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
###~~~~~~~~~~~~~~~~~~~~proxy_set_header end~~~~~~~~~~~~~~~~~~~~###
}
location /xxx{
proxy_pass http://www.123.cn:8888/xxx;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host cx.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept text/html,application/xhtml+xml,application/xml;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
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;
}
location ^~ /abc-admin{
proxy_pass http://127.0.0.1:8000/abc-admin/abc-admin;
proxy_send_timeout 1800;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
client_max_body_size 2048m;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /abc-yyy/{
proxy_pass http://127.0.0.1:8059;
proxy_send_timeout 1800;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
client_max_body_size 2048m;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
## 配置页面不缓存html和htm结尾的文件
if ($request_filename ~* .*\.(?:htm|html)$)
{
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
root admin;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
|