3-Nginx,Rewrite,反向代理及实战

本文详细介绍了Nginx的Rewrite功能,包括set、if、break、return等指令,以及如何实现域名跳转、目录自动添加斜杠等功能。此外,还讲解了Nginx的反向代理,包括proxy_pass、proxy_set_header和proxy_redirect等配置语法,以及如何使用SSL进行安全加密。最后探讨了反向代理的系统调优和安全控制。
摘要由CSDN通过智能技术生成

Rewrite功能配置

Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持,因此在编译安装Nginx服务器之前,需要安装PCRE库。Nginx使用的是ngx_http_rewrite_module模块来解析和处理Rewrite功能的相关配置。

Rewrite的相关命令

set指令
if指令
break指令
return指令
rewrite指令
rewrite_log指令

Rewrite的应用场景

域名跳转
域名镜像
独立域名
目录自动添加"/"
合并目录
防盗链的实现

Rewrite的相关指令

set指令

该指令用来设置一个新的变量。

语法 set $variable value;
默认值
位置 server、location、if

variable:变量的名称,该变量名称要用"$"作为变量的第一个字符,且不要与Nginx服务器预设的全局变量同名。

value:变量的值,可以是字符串、其他变量或者变量的组合等。

# rewrite
server{
    listen 8081;
    server_name localhost;
    location /server {
        set $name TOM;
        set $age 19;
        default_type text/plain; #返回文本方式
        return 200 $name=$age;
    }
}

image-20220627094530979

# rewrite
server{
    listen 8081;
    server_name localhost;
    location /server {
        set $name TOM;
        set $age 19;
        default_type text/plain; #返回文本方式
        return 200 $name=$age=$args;
    }
}

image-20220627095136073

Rewrite常用全局变量
变量 说明
$args 变量中存放了请求URL中的请求参数。比如htt p://192.168.200.133/server?arg1=value1&a rgs2=value2中 的"arg1=value1&arg2=value2",功能和 $query_string一样
$http_user_agent 变量存储的是用户访问服务的代理信息(如果 通过浏览器访问,记录的是浏览器的相关版本 信息)
$host 变量存储的是访问服务器的server_name值 server端的ip地址
$document_uri 变量存储的是当前访问地址的URI。比如htt p://192.168.200.133/server?id=10&name=z hangsan中的"/server",功能和$uri一样 location后面配置的地址
$document_root 变量存储的是当前请求对应location的root 值,如果未设置,默认指向Nginx自带html目 录所在位置 location里面 root地址所配置的值
$content_length 变量存储的是请求头中的Content-Length的 值
$content_type 变量存储的是请求头中的Content-Type的值
$http_cookie 变量存储的是客户端的cookie信息,可以通过 add_header Set-Cookie 'cookieName=cookieValue'来添加cookie数 据
变量 说明
$limit_rate 变量中存储的是Nginx服务器对网络连接速率 的限制,也就是Nginx配置中对limit_rate指令 设置的值,默认是0,不限制。
$remote_addr 变量中存储的是客户端的IP地址 客户端
$remote_port 变量中存储了客户端与服务端建立连接的端口 号 客户端
$remote_user 变量中存储了客户端的用户名,需要有认证模 块才能获取 客户端
$scheme 变量中存储了访问协议
$server_addr 变量中存储了服务端的地址 服务端
$server_name 变量中存储了客户端请求到达的服务器的名称 服务端
$server_port 变量中存储了客户端请求到达服务器的端口号 服务端
$server_protocol 变量中存储了客户端请求协议的版本,比 如"HTTP/1.1" 服务端
$request_body_file 变量中存储了发给后端服务器的本地文件资源 的名称
$request_method 变量中存储了客户端的请求方式,比 如"GET","POST"等
$request_filename 变量中存储了当前请求的资源文件的路径名

上述参数还可以在日志文件中使用,这个就要用到前面我们介绍的log_format指令 http块书写

#http块书写
log_format main '$remote_addr - $request - $status-$request_uri  $http_user_agent';

#添加到具体的server块
access_log logs/access.log main;  #main指的是使用http配置的的格式

image-20220627105928277

日志的格式与配置变量是匹配的

if指令

该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置。

语法 if (condition){...}
默认值
位置 server、location

condition为判定条件,可以支持以下写法:

  1. 变量名。如果变量名对应的值为空字符串或"0",if都判断为false,其他条件为true。
#写在server块内 增加一个location块
location /testif {
    set $username '';  
    default_type text/plain;
    if ($username){ #也可以改为默认变量 $args
    return 200 $username; #如果变量有值 显示变量的值
    }
    return 200 'param is enpty';  #页面显示这条

}
if ($param){

}
  1. 使用"="和"!="比较变量和字符串是否相等,满足条件为true,不满足为false
if ($request_method = POST){ #$request_methodhuod获取当前请求方式
    return 405; #如果请求方式是post  返回405(not allowed 不允许访问)
}

注意:此处和Java不太一样的地方是字符串不需要添加引号,并且等号和不等号前后到需要加空格。

  1. 使用正则表达式对变量进行匹配,匹配成功返回true,否则返回false。变量与正则表达式之间使用"","*","!","!*"来连接。

    "~"代表匹配正则表达式过程中区分大小写,

    "~*"代表匹配正则表达式过程中不区分大小写

    "!"和"!*"刚好和上面取相反值,如果匹配上返回false,匹配不上返回true

if ($http_user_agent ~ MSIE){
    #$http_user_agent的值中是否包含MSIE字符串,如果包含返回true
}

注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含"}"或者是";"等字符时,就需要把引号加上。

  1. 判断请求的文件是否存在使用"-f"和"!-f",
if (-f $request_filename){ #$request_filename 获取当前访问资源的文件名
    #判断请求的文件是否存在  条件存在执行这里面的语句
}
if (!-f $request_filename){
    #判断请求的文件是否不存在 取反  如果访问的资源不存在 输出这里面的内容   例如 没访问到内容的报错提醒
    return 200 'not found'
}
  1. 判断请求的目录是否存在使用"-d"和"!-d"

  2. 判断请求的目录或者文件是否存在使用"-e"和"!-e"

  3. 判断请求的文件是否可执行使用"-x"和"!-x"

break指令

该指令用于中断当前相同作用域中的其他Nginx配置。与该指令处于同一作用域的Nginx配置中,位于它前面的指令配置生效,位于后面的指令配置无效。并且break还有另外一个功能就是终止当前的匹配并把当前的URI在本location进行重定向访问处理。

语法 break;
默认值
位置 server、location、if

例子:

location /testbreak{
    default_type text/plain; #文本方式显示在浏览器
    set $username TOM; #192.168.47.8:8080//testbreak    浏览器header里是 TOM
    if ($args){ # $args 获取当前请求url ?后面的所有参数
        Set $username JERRY; #192.168.47.8:8080//testbreak?1  浏览器header里是 JERRY
        #需要在html目录下创建testbreak/index.html
        break;
        set $username ROSE;#192.168.47.8:8080//testbreak?1
    }
    add_header username $username; #加一个头部信息
    return 200 $username; #通过返回的都不信息就可以判断走的是break上面 HERRY还是下面的ROSE
}
return指令

该指令用于完成对请求的处理,直接向客户端返回。在return后的所有Nginx配置都是无效的。

语法 retur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机猿巧合.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值