指令列表
return
- 作用:用于立即结束当前请求的处理并生成响应。
- 用法:
return code [text];
code
是 HTTP 状态码,如 200、301、404 等。text
是可选的,用于指定响应主体内容。
location /example {
return 200 "Hello, world!";
}
break
- 作用:用于结束当前
location
块的处理,然后将控制传递给下一个处理阶段。 - 用法:
break;
location /example {
if ($query_string) {
break;
}
# 如果没有 query string,则继续处理请求
}
rewrite
- 作用:用于修改请求 URI,并将控制传递给下一个处理阶段。
- 用法:
rewrite regex replacement [flag];
regex
是正则表达式,用于匹配请求 URI。replacement
是替换字符串,用于替换匹配到的部分。flag
是可选的,用于指定修改行为,如last
、break
、redirect
等。
location /example {
rewrite ^/old-url$ /new-url permanent;
}
if
- 作用:根据条件执行不同的指令块。
- 用法:
if (condition) { ... }
condition
是一个条件表达式,可以是变量比较、正则表达式匹配等。
location /example {
if ($query_string) {
return 403;
}
# 如果没有 query string,则继续处理请求
}
proxy_pass
- 作用:将请求代理到另一个服务器。
- 用法:
proxy_pass URL;
URL
是目标服务器的地址。
location / {
proxy_pass http://backend_server;
}
try_files
- 作用:尝试按顺序查找文件或目录,并返回第一个找到的资源。
- 用法:
try_files file ... uri;
location /images/ {
try_files $uri $uri/ /images/default.jpg;
}
这些指令都能够在 Nginx 配置中灵活地控制请求处理和响应生成的流程,使得服务器能够根据具体需求进行定制化配置。
执行顺序
-
set
指令:首先,在location
块或server
块中定义的变量会被设置。 -
rewrite
指令:然后,Nginx 将根据rewrite
指令修改请求 URI。这可能会导致请求被重新路由到另一个location
块或处理阶段。 -
if
指令:接着,Nginx 将根据if
指令中定义的条件执行相应的指令块。需要注意的是,尽量避免在if
指令中执行复杂的逻辑,因为它可能会导致性能问题和不可预期的行为。 -
return
指令:如果if
指令中的条件被满足,或者在rewrite
指令之后没有匹配到任何location
块,那么就会执行return
指令,立即结束请求处理并生成相应的响应。 -
break
指令:最后,如果在if
指令中使用了break
指令,它将结束当前location
块的处理,并将控制传递给下一个处理阶段。
基础用法
set
指令
在 Nginx 的 location
或 server
块中,set
指令用于定义变量。这些变量可以在后续的指令中使用。通常用于设置一些动态值或标志位。
示例:
代码语言:javascript复制server {
location / {
set $my_var "some_value";
...
}
}
rewrite
指令
rewrite
指令用于修改请求 URI。它在当前块中处理,可能导致请求被重新路由到另一个 location
块。rewrite
指令可以在 server
和 location
块中使用。
示例:
代码语言:javascript复制server {
location /oldpath {
rewrite ^/oldpath(.*)$ /newpath$1 permanent;
}
}
if
指令
if
指令用于条件判断,根据条件的真假执行特定指令。尽量避免在 if
中执行复杂逻辑,因为它可能引发性能问题和不可预期的行为。
示例:
代码语言:javascript复制server {
location / {
set $my_var "some_value";
if ($my_var = "some_value") {
return 200 "Condition met";
}
}
}
return
指令
return
指令用于立即结束请求处理并生成指定的响应。如果 if
指令的条件满足或者没有匹配到其他 location
块时,return
指令会被执行。
示例:
代码语言:javascript复制server {
location / {
if ($request_method = GET) {
return 200 "GET method";
}
}
}
break
指令
break
指令用于终止当前 location
块的处理,并将控制传递给下一个处理阶段。这在需要提前结束某些处理时非常有用。
示例:
代码语言:javascript复制server {
location / {
if ($request_uri ~* ".jpg$") {
break;
}
...
}
}
在 Nginx 配置中,指令的处理顺序通常是先设置变量(set
),然后进行 URI 重写(rewrite
),接着根据条件执行特定指令块(if
),如果需要则立即返回响应(return
),最后在特定情况下结束处理并传递控制(break
)。理解这些指令的作用和顺序,有助于编写高效、正确的 Nginx 配置文件。
高阶使用
高级 set
指令
set
指令在复杂场景下可用于动态赋值和条件赋值。在 map
指令中,set
可以根据不同的条件动态赋值,从而简化配置。
示例:
代码语言:javascript复制http {
map $http_user_agent $mobile {
default no;
"~*Android" yes;
"~*iPhone" yes;
}
server {
location / {
set $device_type $mobile;
if ($device_type = yes) {
rewrite ^ /mobile redirect;
}
}
}
}
高级 rewrite
指令
rewrite
指令不仅可以简单地修改 URI,还能通过正则表达式和不同标志(如 last
、break
、redirect
、permanent
)实现复杂的重写逻辑。
示例:
代码语言:javascript复制server {
location / {
rewrite ^/oldpath/(.*)$ /newpath/$1 break;
}
location /newpath {
rewrite ^/newpath/(.*)$ /$1 last;
}
}
高级 if
指令
使用 if
指令时,需小心避免复杂逻辑,以防性能问题。使用 try_files
或 map
指令往往是更好的选择。
示例:
代码语言:javascript复制server {
location / {
try_files $uri $uri/ /index.html;
if ($http_user_agent ~* "(MSIE|Trident)") {
return 403;
}
}
}
高级 return
指令
return
指令适用于立即返回特定状态码和消息。结合条件判断,可以实现灵活的响应控制。
示例:
代码语言:javascript复制server {
location /admin {
if ($remote_addr !~* "^192.168.1.") {
return 403 "Access denied";
}
}
}
高级 break
指令
break
指令可用于终止当前 location
块的处理,尤其在结合条件判断时使用。
示例:
代码语言:javascript复制server {
location / {
if ($request_uri ~* ".jpg$") {
set $static 1;
break;
}
if ($static) {
root /static/images;
}
}
}
综合实例 通过具体示例展示如何结合使用上述指令实现复杂的配置需求,例如,根据用户代理进行重定向并处理静态文件请求。
示例:
代码语言:javascript复制http {
map $http_user_agent $device {
default desktop;
"~*Android" mobile;
"~*iPhone" mobile;
}
server {
location / {
if ($device = mobile) {
rewrite ^ /mobile last;
}
try_files $uri $uri/ /index.html;
}
location /mobile {
root /var/www/mobile;
try_files $uri $uri/ /mobile/index.html;
}
location ~* .(jpg|jpeg|png|gif)$ {
expires 30d;
root /var/www/images;
}
}
}
最佳实践
优化复杂的 Nginx 配置可以通过使用更多的高级指令和最佳实践来提高性能和可维护性。
以下是一些指导原则和示例:
使用 try_files
替代 if
来处理文件和目录
try_files
指令能够更有效地处理文件和目录请求,而不需要使用复杂的 if
条件判断。
示例:
代码语言:javascript复制location / {
try_files $uri $uri/ /index.html;
}
避免在 if
中执行复杂逻辑
在 if
指令中执行复杂逻辑可能会导致性能问题和不可预期的行为。尽量将逻辑转移到其他指令中,如 map
、try_files
等。
合理使用 map
指令
map
指令可以根据变量的值将其映射到其他值,用于简化配置和避免重复代码。
示例:
代码语言:javascript复制map $http_user_agent $is_mobile {
default 0;
"~*Android" 1;
"~*iPhone" 1;
}
server {
location / {
if ($is_mobile) {
return 301 https://m.example.com$request_uri;
}
...
}
}
使用 proxy_pass
实现反向代理
proxy_pass
指令用于将请求代理到后端服务器,适用于实现反向代理和负载均衡。
示例:
代码语言:javascript复制server {
location / {
proxy_pass http://backend_server;
...
}
}
启用缓存
启用适当的缓存可以显著提高性能,减少服务器负载。可使用 proxy_cache
和 fastcgi_cache
等指令来配置缓存。
示例:
代码语言:javascript复制server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
...
}
}
定期优化配置文件 定期检查和优化配置文件,删除不再使用的指令和块,以确保配置的简洁性和可维护性。
使用 include
指令
使用 include
指令将重复使用的配置片段提取到单独的文件中,以便统一管理和维护。
示例:
代码语言:javascript复制http {
include /etc/nginx/conf.d/*.conf;
}
通过采用以上最佳实践和高级指令,可以优化复杂的 Nginx 配置,提高服务器性能和可维护性。 。