小菜对ngx的使用仍停留在“复杂可实现”的程度,写出的ngx配置文件,虽然可用,但让明眼人一看不禁想骂一句“oh,shit!”
之前对rewrite的了解只停留在感性的url重写的层面上,对于为什么要进行重写没有体会。下面结合最近的项目时间谈谈对rewrite的认识
1. 对于rest化的url针对请求方式进行rewrite
e.g
RESTFUL uri——
http://example.com/user/$uid/photo
需求:
请求方式 | 期望处理 |
GET | 获取某一张照片的信息 |
POST | 添加照片 |
PUT | 更新照片信息 |
DELETE | 删除照片 |
针对上述需求完全可以用rewrite进行处理,从而实现
不同的业务请求方式可以映射到不同的后端处理逻辑中
server{
server_name example.com ;
if ( $request_method = GET ){
rewrite ^(/user/(.*)/photo)$ index.php?do=get_photo&uid=$2 break;
}
if ( $request_method = POST ){
rewrite ^(/user/(.*)/photo)$ index.php?do=add_photo&uid=$2 break;
}
if ( $request_method = PUT ){
rewrite ^(/user/(.*)/photo)$ index.php?do=update_photo&uid=$2 break;
}
if ( $request_method = DELETE ){
rewrite ^(/user/(.*)/photo)$ index.php?do=del_photo&uid=$2 break;
}
}
2. 金玉其外“败絮”其中
为前端展现优雅的url,利用rewrite从url中解析出需要的参数,映射到后端逻辑进行处理
3.“漏斗”式后台处理
不同的前端url,基于rewrite统一后端处理入口。举例说明:
图片展现的两种url:
小菜初始的nginx规则为:
location ~ ^/d/(.*)$ {
root ${SRC_ROOT}/apps/fnt ;
expires max;
fastcgi_cache cache_php;
set $PREFIX "";
if ( $request_method = HEAD ) {
set $PREFIX "HEAD_";
}
fastcgi_cache_key $PREFIX$1;
fastcgi_cache_valid 200 302 3d;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
tcp_nodelay on;
include fastcgi_params ;
fastcgi_pass 127.0.0.1:${CGI_PORT};
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME ${SRC_ROOT}/apps/fnt/index.php ;
fastcgi_param QUERY_STRING do=d&path=$1 ;
client_max_body_size 100m;
fastcgi_connect_timeout 1000s;
fastcgi_send_timeout 1000s;
fastcgi_read_timeout 1000s;
}
location ~ ^/([^/]*)\.(jpg|png|bmp|gif)$ {
root ${SRC_ROOT}/apps/fnt ;
expires max;
fastcgi_cache cache_php;
set $PREFIX "";
if ( $request_method = HEAD ) {
set $PREFIX "HEAD_";
}
fastcgi_cache_key $PREFIX$1;
fastcgi_cache_valid 200 302 3d;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;
include fastcgi_params ;
fastcgi_pass 127.0.0.1:${CGI_PORT};
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME ${SRC_ROOT}/apps/fnt/index.php ;
fastcgi_param QUERY_STRING key=$1&postfix=$2 ;
client_max_body_size 100m;
fastcgi_connect_timeout 1000s;
fastcgi_send_timeout 1000s;
fastcgi_read_timeout 1000s;
}
明眼人一眼就能看出,里面的冗余
在师傅的指导下利用rewrite进行修改如下:
location ~* ^/([^/]*)\.(jpg|png|bmp|gif)$ {
rewrite ^/([^/]*)\.(jpg|png|bmp|gif)$ /backend/?key=$1&postfix=$2 last;
}
location ~ ^/d/(.*)$ {
rewrite ^/d/(.*)$ /backend/?path=$1&do=d
}
location = /backend/ {
internal;
root ${SRC_ROOT}/apps/fnt ;
set $key $arg_path;
if ( $key = "" ){
set $key $arg_key;
}
expires max;
fastcgi_cache cache_php;
set $PREFIX "";
if ( $request_method = HEAD ){
set $PREFIX "HEAD_";
}
fastcgi_cache_key $PREFIX$1;
fastcgi_cache_valid 200 302 3d;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;
include fastcgi_params ;
fastcgi_pass 127.0.0.1:${CGI_PORT};
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME ${SRC_ROOT}/apps/fnt/index.php ;
fastcgi_param QUERY_STRING $query_string;
client_max_body_size 100m;
fastcgi_connect_timeout 1000s;
fastcgi_send_timeout 1000s;
fastcgi_read_timeout 1000s;
}
是不是清爽了许多?有木有?!
分享到:
相关推荐
- `NGX_HTTP_SRV_CONF`: 在配置文件的`server`块内。 - `NGX_HTTP_SIF_CONF`: 在`server`块内的`if`语句中。 - `NGX_HTTP_LOC_CONF`: 在`location`块内。 - `NGX_HTTP_LIF_CONF`: 在`location`块内的`if`语句中...
本文将深入探讨Nginx中的一个重要组成部分——脚本引擎与rewrite设计原理,特别是针对ngx_http_core_main_conf_t结构中的两个关键成员:`cmcf->variables_keys` 和 `cmcf->variables` 的详细解析。 #### 二、核心...
4. **启动与管理**:安装完成后,使用`nginx`命令启动服务,配置文件通常位于`/etc/nginx/nginx.conf`,可以通过`systemctl`或`service`进行服务管理。 ### 配置Nginx Nginx的配置文件主要包含服务器块(server ...
例如,可以添加 ngx_http_rewrite_module 实现 URL 重写,ngx_http_proxy_module 实现反向代理,或者 ngx_http_gzip_static_module 实现静态文件的 gzip 压缩。 **6. 安装与配置** 在安装 Nginx 1.24.0 时,需要...
8. **模块配置:** Nginx支持多种模块,如`ngx_http_rewrite_module`用于URL重写,`ngx_http_proxy_module`用于反向代理,`ngx_http_gzip_module`用于GZIP压缩等。每个模块都有自己的配置选项,可以在`http`、`...
Nginx的配置文件解析是通过`ngx_conf_parse`函数完成的,它将配置文件转换为内部数据结构,供后续处理使用。理解配置文件解析流程有助于定制和扩展Nginx配置。 4. **内存池**: Nginx使用自定义的内存池`ngx_pool...
具体的执行顺序为:`opre` -> `ocreate_main_conf` -> 执行 `ngx_command_t` 定义的函数(被视为 `init_main_conf` 的自动处理部分)-> `oinit_main_conf` -> `opostconfig`。 **2. 监听端口** - 在完成配置文件...
- 配置文件:主要配置文件为`nginx.conf`,其中可以定义服务器块(server blocks),每个服务器块可以设置监听端口、代理设置、SSL配置等。 - 虚拟主机:通过配置文件中的多个服务器块实现虚拟主机,每个服务器块...
Nginx支持模块化设计,可以通过安装额外的模块扩展其功能,如`ngx_http_rewrite_module`用于URL重写,`ngx_http_proxy_module`实现反向代理,`ngx_http_gzip_static_module`提供GZIP压缩静态文件等。同时,根据实际...
- 最终,赋值指令被转化为代码,并存储在`ngx_http_rewrite_loc_conf_t`结构体的`code`数组中,该数组的元素类型是`ngx_http_script_value_code_t`。 综上所述,Nginx通过精心设计的监听结构、事件处理机制以及...
同时,Nginx的模块化设计使得扩展功能变得非常方便,如通过添加`ngx_http_rewrite_module`实现URL重写,或者使用`ngx_http_access_module`控制访问权限。 总之,掌握Nginx的安装和配置对于Web服务的管理和优化至关...
3. 配置文件:Nginx的配置文件通常位于`conf/nginx.conf`,在这里可以设置监听端口、服务器块、虚拟主机等。 4. 启动Nginx:编译完成后,可以在命令行输入`nginx`或`sudo systemctl start nginx`启动服务。 5. 测试...
6. 配置启动:编辑配置文件`/usr/local/nginx/conf/nginx.conf`,根据实际需求调整服务器配置。 7. 启动:运行`/usr/local/nginx/sbin/nginx`启动Nginx服务。 8. 监控与管理:使用`nginx -s reload`命令来平滑重启...
此外,`lua_shared_dict`可以用来在Nginx实例间共享数据,`lua休息`用于设置定时任务,`log_by_lua`允许在日志记录中使用Lua,而`rewrite_by_lua`则可以在重写规则中执行Lua代码。 为了调试和优化Lua脚本,还可以...
以下我们将详细介绍Nginx Rewrite模块在不同场景下的应用,以及如何配置和使用。 ### 应用场景1:基于域名的跳转 #### 场景描述 假设公司原域名`www.accp.com`需要更换为`www.kgc.com`,但旧域名不能废弃,需要将...
1. **模块扩展**:Nginx通过模块化设计,可以方便地添加或扩展功能,如`ngx_http_rewrite_module`用于URL重写,`ngx_http_access_module`进行访问控制。 2. **性能优化**:包括调整`worker_connections`限制最大...
在配置方面,Nginx使用配置文件(通常为nginx.conf)来定义服务器的行为。配置文件包括多个块,如http、server和location,它们分别定义了全局设置、虚拟主机设置和URL匹配规则。例如,通过`server_name`指令指定...