[运维][Nginx]Nginx学习(3/5)-Nginx高级

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常用全局变量
变量 说明
$args 变量中存放了请求URL中的请求参数。比如http://192.168.200.133/server?arg1=value1&args2=value2中的"arg1=value1&arg2=value2",功能和$query_string一样
$http_user_agent 变量存储的是用户访问服务的代理信息(如果通过浏览器访问,记录的是浏览器的相关版本信息)
$host 变量存储的是访问服务器的server_name值
$document_uri 变量存储的是当前访问地址的URI。比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server",功能和$uri一样
$document_root 变量存储的是当前请求对应location的root值,如果未设置,默认指向Nginx自带html目录所在位置
$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 变量中存储了当前请求的资源文件的路径名
$request_uri 变量中存储了当前请求的URI,并且携带请求参数,比如http://192.168.200.133/server?id=10&name=zhangsan中的"/server?id=10&name=zhangsan"

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

log_format main '$remote_addr - $request - $status-$request_uri  $http_user_agent';
​
access_log logs/access.log main;
if指令

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

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

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

  1. 变量名。如果变量名对应的值为空字符串或"0",if都判断为false,其他条件为true。

if ($param){
    
}
  1. 使用"="和"!="比较变量和字符串是否相等,满足条件为true,不满足为false

if ($request_method = POST){
    return 405;
}

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

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

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

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

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

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

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

  1. 判断请求的文件是否存在使用"-f"和"!-f",

if (-f $request_filename){
    #判断请求的文件是否存在
}
if (!-f $request_filename){
    #判断请求的文件是否不存在
}
  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;
    if ($args){
        Set $username JERRY;
        break;
        set $username ROSE;
    }
    add_header username $username;
    return 200 $username;
}
return指令

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

语法 return code [text]; return code URL; return URL;
默认值
位置 server、location、if

code:为返回给客户端的HTTP状态代理。可以返回的状态代码为0~999的任意HTTP状态代理

text:为返回给客户端的响应体内容,支持变量的使用

URL:为返回给客户端的URL地址

location /testreturn {
​
    return 200 success;
}
​
location /testretu
<think>嗯,用户之前问过“防火墙”这个词的英文,现在又突然问了一个关于Nginx的命令。我需要先理解这个命令的作用。用户给出的命令是sbin/nginx -t -c conf/nginx.conf,看起来是测试Nginx配置文件的正确性。 首先,用户可能是在配置Nginx时遇到了问题,或者准备重启服务前想要检查配置文件是否有错误。考虑到用户之前的问题是关于防火墙的,可能他们现在在搭建服务器环境,涉及到网络和Web服务器的配置。这时候检查Nginx配置是否正确非常重要,因为错误的配置会导致服务无法启动,进而影响网站访问。 接下来,我需要分解这个命令的各个部分。sbin/nginx可能是指Nginx的可执行文件路径,用户可能是在Nginx的安装目录下执行这个命令。-t选项是测试配置,-c指定配置文件的位置。这里用户指定了conf/nginx.conf,可能他们的配置文件放在conf目录下,而不是默认的位置。 用户可能不太清楚各个参数的具体作用,或者想确认命令的正确性。此外,他们可能在使用过程中遇到了问题,比如配置修改后服务无法启动,所以需要测试配置是否正确。这时候需要详细解释每个参数的意义,以及整个命令的执行流程。 另外,用户可能对Nginx的配置文件结构不太熟悉,或者之前修改了配置,现在需要验证是否有效。可能的深层需求是希望确保修改后的配置不会导致服务崩溃,避免线上故障。因此,除了解释命令本身,还需要给出一些常见问题的解决方法,比如检查语法错误、文件路径是否正确,或者权限问题。 还要考虑到用户可能是在学习Nginx的配置,或者是运维新手,所以需要提供一些扩展知识,比如如何重新加载配置而不中断服务,或者如何查看错误日志。这样可以帮助用户更全面地理解整个流程,而不仅仅是执行一个命令。 最后,确保回答清晰易懂,分点解释每个参数,给出示例输出,并提醒常见注意事项,比如权限和路径问题。这样用户能够按照步骤操作,并自行排查可能的问题。</think>以下是对命令 `sbin/nginx -t -c conf/nginx.conf` 的详细解释: --- ### **命令功能** 这条命令用于 **测试 Nginx 配置文件的语法正确性**,确保配置修改后可以正常加载,避免因语法错误导致服务崩溃。 --- ### **命令分解** 1. **`sbin/nginx`** - 表示调用 Nginx 的可执行文件。 - 如果当前目录不在 Nginx 安装路径下(例如 `/usr/local/nginx/sbin/`),可能需要使用绝对路径(如 `/usr/local/nginx/sbin/nginx`)。 2. **`-t`** - 全称为 `--test`,表示测试配置文件的语法,但**不实际重启 Nginx 服务**。 3. **`-c conf/nginx.conf`** - `-c`:指定要测试的配置文件路径。 - `conf/nginx.conf`:配置文件的相对路径(默认路径通常是 `/etc/nginx/nginx.conf`)。如果当前目录在 Nginx 根目录下,可以直接使用此路径;否则需调整为绝对路径。 --- ### **典型输出** - **语法正确**: ```bash nginx: configuration file conf/nginx.conf test is successful ``` - **语法错误**: ```bash nginx: [emerg] invalid parameter "example_error" in conf/nginx.conf:10 nginx: configuration file conf/nginx.conf test failed ``` - 错误会标出具体行号和原因(如第 10 行的 `example_error`)。 --- ### **应用场景** - 修改 Nginx 配置文件(如添加虚拟主机、调整缓存策略)后,需验证语法。 - 重启或重载 Nginx 服务前,防止配置错误导致服务中断。 --- ### **扩展知识** 1. **重新加载配置(不中断服务)** 测试通过后,用以下命令让 Nginx 重新加载配置: ```bash sbin/nginx -s reload ``` 2. **查看 Nginx 进程和版本** - 检查运行状态:`ps aux | grep nginx` - 查看版本:`sbin/nginx -v`(简略)或 `sbin/nginx -V`(详细编译参数) 3. **日志排查** 如果测试失败,可查看错误日志定位问题: ```bash tail -f logs/error.log ``` --- ### **注意事项** - **权限问题**:可能需要 `sudo` 权限执行(如非 root 用户操作系统默认安装的 Nginx)。 - **路径问题**:如果命令报错 `command not found`,检查 Nginx 可执行文件的路径是否正确。 - **配置备份**:修改配置文件前,建议先备份原文件(如 `cp nginx.conf nginx.conf.bak`)。 如果有具体错误信息或配置疑问,可以进一步讨论! 🛠️
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

awonw

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

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

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

打赏作者

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

抵扣说明:

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

余额充值