一、Nginx 反向代理
正向代理代理的对象是客户端,反向代理代理的是服务端
在nginx安装包下,有 conf/nginx.conf 文件,这是nginx服务器的底子配置,默认的配置也存放在此。
1.1 nginx 文件布局
- # 1.全局块,配置影响nginx全局的指令。
- # 一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- ... #全局块
- # 2.配置影响nginx服务器或与用户的网络连接。
- # 有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- events { #events块
- ...
- }
- # 3.可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
- # 如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- http #http块
- {
- ... #http全局块
-
- # 4.配置虚拟主机的相关参数,一个http中可以有多个server。
- server #server块
- {
- ... #server全局块
-
- # 5.配置请求的路由,以及各种页面的处理情况。
- location [PATTERN] #location块
- {
- ...
- }
- location [PATTERN]
- {
- ...
- }
- }
- server
- {
- ...
- }
- ... #http全局块
- }
复制代码 1.2 默认的nginx配置文件
1.3 实践中的 nginx.conf
- ########### 每个指令必须有分号结束。#################
- #user administrator administrators; #配置用户或者组,默认为nobody nobody。
- #worker_processes 2; #允许生成的进程数,默认为1
- #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
- error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
- events {
- accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
- multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
- #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
- worker_connections 1024; #最大连接数,默认为512
- }
- http {
- include mime.types; #文件扩展名与文件类型映射表
- default_type application/octet-stream; #默认文件类型,默认为text/plain
- #access_log off; #取消服务日志
- log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
- access_log log/access.log myFormat; #combined为日志格式的默认值
- sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
- sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
- keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333 backup; #热备
- }
- error_page 404 https://www.baidu.com; #错误页
- server {
- keepalive_requests 120; #单连接请求上限次数。
- listen 4545; #监听端口
- server_name 127.0.0.1; #监听地址
- location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
- #root path; #根目录
- #index vv.txt; #设置默认页
- proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
- deny 127.0.0.1; #拒绝的ip
- allow 172.18.5.54; #允许的ip
- }
- }
- }
复制代码 惊群现象:一个网路连接到来,多个就寝的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
几个常见配置项:
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地点;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容巨细;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相干信息;
二、Nginx 负载均衡
2.1 热备负载均衡
热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的次序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333 backup; #热备
- }
- server {
- listen 8081; #监听端口
- server_name 127.0.0.1; #监听地址
- location /{
- proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
- }
- }
复制代码 2.2 轮询负责均衡
轮询:nginx默认就是轮询其权重都默以为1,服务器处理请求的次序:ABABABABAB…
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333;
- }
- server {
- listen 8081; #监听端口
- server_name 127.0.0.1; #监听地址
- location /{
- proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
- }
- }
复制代码 2.3 加权轮询负载规则
加权轮询:跟据配置的权重的巨细而分发给不同服务器不同数目的请求。如果不设置,则默以为1。下面服务器的请求次序为:ABBABBABBABBABB…
- upstream mysvr {
- server 127.0.0.1:7878 weight=1;
- server 192.168.10.121:3333 weight=2;
- }
- server {
- listen 8081; #监听端口
- server_name 127.0.0.1; #监听地址
- location /{
- proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
- }
- }
复制代码 2.4 ip_hash 负载均衡
ip_hash:nginx会让类似的客户端ip请求类似的服务器。
- upstream mysvr {
- server 127.0.0.1:7878;
- server 192.168.10.121:3333;
- ip_hash;
- }
- server {
- listen 8081; #监听端口
- server_name 127.0.0.1; #监听地址
- location /{
- proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
- }
- }
复制代码 2.5 对特定资源实现负载均衡
通过多个upstream分成多个服务器组,将不同的请求分流到不同的
- upstream videomysvr {
- server 127.0.0.1:7878 weight=1;
- server 192.168.10.121:3333 weight=2;
- }
- upstream filemysvr {
- server 192.3.2.1:7878 weight=1;
- server 192.3.2.2:3333 weight=2;
- }
- server {
- listen 8081; #监听端口
- server_name 127.0.0.1; #监听地址
- location /video/ {
- proxy_pass http://videomysvr; #请求转向mysvr 定义的服务器列表
- }
- location /file/ {
- proxy_pass http://filemysvr; #请求转向mysvr 定义的服务器列表
- }
- }
复制代码 2.6 对不同域名实现负载均衡
- upstream videomysvr {
- server 127.0.0.1:7878 weight=1;
- server 192.168.10.121:3333 weight=2;
- }
- upstream filemysvr {
- server 192.3.2.1:7878 weight=1;
- server 192.3.2.2:3333 weight=2;
- }
- server {
- listen 8081; #监听端口
- server_name www.ustc.edu.cn; #监听地址
- location /video/ {
- proxy_pass http://videomysvr; #请求转向mysvr 定义的服务器列表
- }
- }
- server {
- listen 8082; #监听端口
- server_name www.ustc.sse.edu.cn; #监听地址
- location /file/ {
- proxy_pass http://filemysvr; #请求转向mysvr 定义的服务器列表
- }
- }
复制代码 2.7 实现带有URL重写的负载均衡
- upstream backend{
- server 192.168.200.146:9001;
- server 192.168.200.146:9002;
- server 192.168.200.146:9003;
- }
- server {
- listen 80;
- server_name localhost;
- location /file/ {
- rewrite ^(/file/.*) /server/$1 last;
- }
- location / {
- proxy_pass http://backend;
- }
- }
复制代码 2.8 四层负载均衡
首先安装好redis和tomcat
- stream { # 一级括号
- upstream redisbackend {
- server 192.168.200.146:6379;
- server 192.168.200.146:6378;
- }
- upstream tomcatbackend {
- server 192.168.200.146:8080;
- }
- server {
- listen 81;
- proxy_pass redisbackend;
- }
- server {
- listen 82;
- proxy_pass tomcatbackend;
- }
- }
复制代码 三、Nginx 缓存
nginx 缓存的好处
- 减轻服务器负载
- 提供网页相应效率
- 降低网络阻塞,增强网络可扩展性
3.1 nginx 的缓存机制
配置块名称名称httpproxy_cache_path指定缓冲区的路径levels缓存目录级最高三层,每层1-2个字符表示,好比:1:1:2 三层keys_zone缓存块名称及内存块巨细,好比:cache_item:500m表示声明一个名为cache_item巨细为500m,超出巨细后最早的被清除max_size缓存区硬盘的最大值,超出闲置数据将被清除inactive最长闲置时间,好比:10d ,表示一个数据被闲置10天则将被清除locationproxy_cache指定缓冲区,对应keys_zone中的设定的值proxy_cache_key通过参数拼装参数key如:h o s t hosthosturii s a r g s is_argsisargsargs 则会已全部md5值作为keyproxy_cache_valid对不同的状态码设置缓存有效期 http模块:
- proxy_cache_path:该指定用于设置缓存文件的存放路径
- levels: 指定该缓存空间对应的目录,最多可以设置3层,每层取值为1|2如 : levels=1:2 缓存空间有两层目录,第一次是1个字母,第二次是2个字母;levels=2:2:2 最终的存储路径为 /usr/local/proxy_cache/7d/10/e2
- keys_zone:用来为这个缓存区设置名称和指定巨细,如:keys_zone=ffideal:200m 缓存区的名称是ffideal,巨细为200M,1M大概能存储8000个keys
- inactive:指定缓存的数据多次时间未被访问就将被删除,如:inactive=1d ,缓存数据在1天内没有被访问就会被删除
- max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源,如:max_size=20g
- http{
- # proxy_cache_path path [levels=number]
- # keys_zone=zone_name:zone_size [inactive=time]\[max_size=size];
- proxy_cache_path /usr/local/proxy_cache levels=1:2:1 keys_zone=ffideal:200m inactive=1d max_size=20g
- }
复制代码 location:
该指令用来开启或关闭代理缓存,如果是开启则自定使用哪个缓存区来进行缓存。
语法proxy_cache zone_name|off;默认值proxy_cache off;位置http、server、location zone_name:指定使用缓存区的名称
该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存。
语法proxy_cache_key key;默认值proxy_cache_key $scheme$proxy_host$request_uri;位置http、server、location
该指令用来对不同返回状态码的URL设置不同的缓存时间
语法proxy_cache_valid [code …] time;默认值—位置http、server、location 如:
- proxy_cache_valid 200 302 10m;
- proxy_cache_valid 404 1m;
- 为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
- proxy_cache_valid any 1m;
- 对所有响应状态码的URL都设置1分钟缓存
复制代码
该指令用来设置资源被访问多少次后被缓存
语法proxy_cache_min_uses number;默认值proxy_cache_min_uses 1;位置http、server、location
该指令用户设置缓存哪些HTTP方法
语法proxy_cache_methods GET|HEAD|POST;默认值proxy_cache_methods GET HEAD;位置http、server、location 默认缓存HTTP的GET和HEAD方法,不缓存POST方法。
3.2 缓存实例
Nginx的情况准备
(1)完成Nginx反向代理配置
- http{
- upstream backend{
- server 192.168.200.146:8080;
- }
- server {
- listen 8080;
- server_name localhost;
- location / {
- proxy_pass http://backend/js/;
- }
- }
- }
复制代码 (2)完成Nginx缓存配置
4.添加缓存配置
- http{
- proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
- upstream backend{
- server 192.168.200.146:8080;
- }
- server {
- listen 8080;
- server_name localhost;
- location / {
- proxy_cache itcast;
- proxy_cache_key itheima;
- proxy_cache_min_uses 5;
- proxy_cache_valid 200 5d;
- proxy_cache_valid 404 30s;
- proxy_cache_valid any 1m;
- add_header nginx-cache "$upstream_cache_status";
- proxy_pass http://backend/js/;
- }
- }
- }
复制代码 3.3 Nginx缓存的清除
方式一:删除对应的缓存目录
- rm -rf /usr/local/proxy_cache/......
复制代码 方式二:使用第三方扩展模块
ngx_cache_purge
(1)下载ngx_cache_purge模块对应的资源包,并上传到服务器上。
- ngx_cache_purge-2.3.tar.gz
复制代码 (2)对资源文件进行解压缩
- tar -zxf ngx_cache_purge-2.3.tar.gz
复制代码 (3)修改文件夹名称,方便后期配置
- mv ngx_cache_purge-2.3 purge
复制代码 (4)查询Nginx的配置参数
(5)进入Nginx的安装目录,使用./configure进行参数配置
- ./configure --add-module=/root/nginx/module/purge
复制代码 (6)使用make
进行编译
(7)将nginx安装目录的nginx二级制可实行文件备份
- mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
复制代码 (8)将编译后的objs中的nginx拷贝到nginx的sbin目录下
- cp objs/nginx /usr/local/nginx/sbin
复制代码 (9)使用make
进行升级
(10)在nginx配置文件中进行如下配置
- server{
- location ~/purge(/.*) {
- proxy_cache_purge itcast itheima;
- }
- }
复制代码 3.4 Nginx设置资源不缓存
前面咱们已经完成了Nginx作为web缓存服务器的使用。但是我们得思考一个问题就是不是所有的数据都适合进行缓存。好比说对于一些常常发生变化的数据。如果进行缓存的话,就很轻易出现用户访问到的数据不是服务器真实的数据。所以对于这些资源我们在缓存的过程中就必要进行过滤,不进行缓存。
Nginx也提供了这块的功能设置,必要使用到如下两个指令
proxy_no_cache
该指令是用来界说不将数据进行缓存的条件。
语法proxy_no_cache string …;默认值—位置http、server、location 配置实例
- proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
复制代码 proxy_cache_bypass
该指令是用来设置不从缓存中获取数据的条件。
语法proxy_cache_bypass string …;默认值—位置http、server、location 配置实例
- proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
复制代码 上述两个指令都有一个指定的条件,这个条件可以是多个,而且多个条件中至少有一个不为空且不等于"0",则条件满足建立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是$cookie_nocache、$arg_nocache、$arg_comment
$cookie_nocache、$arg_nocache、$arg_comment
这三个参数分别代表的含义是:
- $cookie_nocache
- 指的是当前请求的cookie中键的名称为nocache对应的值
- $arg_nocache和$arg_comment
- 指的是当前请求的参数中属性名为nocache和comment对应的属性值
复制代码 案例演示下:
- log_format params $cookie_nocache | $arg_nocache | $arg_comment;
- server{
- listen 8081;
- server_name localhost;
- location /{
- access_log logs/access_params.log params;
- add_header Set-Cookie 'nocache=999';
- root html;
- index index.html;
- }
- }
复制代码 案例实现
设置不缓存资源的配置方案
- server{
- listen 8080;
- server_name localhost;
- location / {
- if ($request_uri ~ /.*\.js$){
- set $nocache 1;
- }
- proxy_no_cache $nocache $cookie_nocache $arg_nocache $arg_comment;
- proxy_cache_bypass $nocache $cookie_nocache $arg_nocache $arg_comment;
- }
- }
复制代码 四、参考资料
https://www.runoob.com/w3cnote/nginx-setup-intro.html
https://www.runoob.com/w3cnote/nginx-proxy-balancing.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |