“内容来自书本1和网络”
配置说明
1. location [ = \| ~ \| ~* \| ^~ ] uri {...}
1) 概述
a. 不含正则表达式uri称为“标准uri”,使用正则表达式的uri称为“正则uri”.
b. 不添加选项时,首先在server块的多个location块中搜索是否有标准uri
和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,
服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri
匹配成功,结束搜索,并使用这个location块处理此请求;
如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
2) 选项解释
a. “=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索
并立即处理此请求。
b. “~”,用于表示uri包含正则表达式,并且区分大小写。
c. “~*”,用于表示uri包含正则表达式,并且不区分大小写。
d. “^~”,用于标准uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,
立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
2. rewrite regex replacement [flag]
1) 概述
replacement, 匹配成功后用于替换URI中被戳取内容的字符串。默认情况下,如果该字符串是
由“http://”或者“https://”开头的,则不会继续向下对URI进行其他处理,而直接将重写后
的URI返回给客户端
2) flag选项解释
a. last,终止继续在本location块重处理接收到的URI,并将此处重写的URI作为一个新的URI,
使用各location块进行处理。该标志将重写后的URI重新在server块中执行,为重写后的URI
提供了转入到其他location块的机会。
b. break,将此处重写的URI作为一个新的URI,在本块中继续进行处理。该标志将重写后的地址
在当前的location块中执行,不会将新的URI转向到其他location块。
c. redirect,将重写后的URI返回给客户端,状态代码为302,指明是临时重定向URI,主要用
在replacement变量不是以“http://”或者"https://"开头的情况下
d. permanent,将重写后的URI返回给客户端,状态代码为301,指明是永久重定向URI
3. proxy_pass
1) 概述
note:proxy_pass会用新的URI替代旧的URI,尤其需要注意‘\’(根目录会自动添加\)
4. 缓存
1) 概述
a. 基于proxy_store缓存机制,通常将proxy_store的缓存目录配置到/dev/shm中提高缓存
数据的处理速度。note:只能缓存200状态下的响应数据,不支持动态链接请求,即会忽略get请求的参数
b. 基于memcached缓存机制
c. proxy_cached缓存机制
d. 基于第三方模块ncache的缓存机制
5. nginx与Squid组合
1) 概述
Squid Cache(简称Squid)是目前在大访问量的网站建设中应用非常广泛的Web缓存服务器。
但是,Squid服务本身不支持在单台服务器同一端口下运行多个进程(列入要反向代理Web必须指定端口80)
6. nginx服务器的邮件服务
7. nginx源码结构
1) 目录结构
* core
该目录中存放了nginx使用到的关键数据结构和nginx内核实现的源码,目录中大致的重要文件如下:
a. nginx.* 文件,包含了nginx程序入口函数main()的文件,实现了对nginx各模块的整体控制
b. ngx_connection.* 文件,实现与网络连接管理相关的功能
c. ngx_inet.* 文件,实现与socket网络套接字相关的功能
d. ngx_cycle.* 文件,实现对系统整个运行过程中参数、资源的统一管理和调配
e. ngx_log.* 文件,实现日志输出、管理的相关功能
f. ngx_file.* 文件,实现文件读写相关功能
g. ngx_regex.* 实现nginx服务器对正则表达式的支持
h. ngx_string.* 实现对字符串处理的基本功能
i. ngx_times.* 实现对时间的获取和处理操作
该目录中还包含了一些重要数据结构的定义和操作,比如ngx_array.*, ngx_list.*,
ngx_queue.*, ngx_hash.*, ngx_*tree.*, ngx_output_chain.*;
一些与内存管理相关的源码,比如ngx_palloc.*, ngx_shmtx.*, ngx_open_file_cache.*等
* event
该目录实现了nginx服务器的事件驱动模型,实现了nginx的消息机制
* http
该目录提供了对web服务主要的支持
* mail
mail目录存放了实现nginx服务器邮件服务的源码
* misc
ngx_cpp_test_module.cpp:文件实现的功能是测试程序中引用的头文件是否与C++兼容
ngx_google_perftools_module.c:文件用来支持Google PerfTools的使用,
Google Perftools包含四个工具,用于优化内存分配的效率和速度,帮助高并发的
情况下很好地控制内存的使用
* os
默认只包含一个unix目录,其中存放的源代码是针对“类Unix系统”,如Solaris、FreeBSD
等的特殊情况,进行实现
8. nginx内置变量
name | explain |
---|---|
$arg_PARAMETER | 客户端GET请求中PARAMETER字段的值 |
$args | 客户端请求中的参数 |
$binary_remote_addr | 远程地址的二进制表示 |
$body_bytes_sent | 已发送的消息体字节数 |
$content_length | HTTP请求信息里的Content-Length |
$content_type | 请求信息里的Content-Type |
$cookie_COOKIE | 客户端请求中COOKIE头域的值 |
$document_root | 针对当前请求的根路径设置值 |
$document_uri | 与$uri相同 |
$host | 请求信息中的Host头域值,如果请求中没有Host行,则等于设置的服务器名 |
$http_HEADER | HTTP请求信息里的HEARER字段 |
$http_host | 与$host相同,但如果请求信息中没有Host行,则可能不同 |
$http_cookie | 客户端的cookie信息 |
$http_referer | 引用地址 |
$http_user_agent | 客户端代理信息 |
$http_via | 最后一个访问服务器的IP地址 |
$http_x_forwarded_for | 相当于网络访问路径 |
$is_args | 如果$args有值,则等于“?”;否则等于空 |
$limit_rate | 对连接速率的限制 |
$nginx_version | 当前nginx服务器的版本 |
$pid | 当前nginx服务器主进程的进程ID |
$query_string | 与$args相同 |
$remote_addr | 客户端IP地址 |
$remote_port | 客户端端口号 |
$remote_user | 客户端用户名,用于Auth Basic Module验证 |
$request | 客户端请求 |
$request_body | 客户端请求的报文体 |
$request_body_file | 发往后端服务器的本地临时缓存文件的名称 |
$request_filename | 当前请求的文件路径名,由root或alias指令与URI请求生成 |
$request_method | 请求的方法,比如GET,POST |
$request_uri | 请求的URI,带参数,不包含主机名 |
$scheme | 所用的协议,如http或者https |
$sent_http_cache_control | |
$sent_http_connection | |
$sent_http_content_length | |
$sent_http_content_type | |
$sent_http_keep_alive | |
$sent_http_last_modified | |
$sent_http_location | |
$sent_http_transfer_encoding | |
$server_addr | 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址 |
$server_name | 请求到达的服务器名 |
$server_port | 请求到达的服务器端口号 |
$server_protocol | 请求的协议版本,HTTP/1.0或者HTTP/1.1 |
$uri | 请求的不带请求参数的URI,可能和最初的值有不同,比如经过重定向之类的 |
编译第三方模块
-
config文件的写法 a.HTTP模块,那么config文件中需要定义以下3个变量: ngx_addon_name:仅在configure执行时使用,一般设置为模块名称 HTTP_MODULES :保存所有的HTTP模块名称,每个HTTP模块间由空格符相连。在重新设置HTTP_MODULES变量时, 不要直接覆盖它,因为configure调用到自定义的config脚本前,已经将各个HTTP模块设置到 HTTP_MODULES变量中了,因此,要像如下这样设置:”$HTTP_MODULES ngx_http_mytest_module” NGX_ADDON_SRCS:用于指定新增模块的源代码,多个待编译的源代码间以空格符相连。注意,在设置NGX_ADDON_SRCS 时可以使用$ngx_addon_dir变量,它等价于configure执行时–add-module=PATH的参数
例子: ngx_addon_name=ngx_http_mytest_module HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module" NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c" 除了上述三个变量名,还有许多变量可以设置,HTTP_FILTER_MODULES:HTTP过滤模块,包括$CORE_MODULES, $EVENT_MODULES,$HTTP_MODULES,$HTTP_FILTER_MODULES,$HTTP_HEADERS_FILTER_MODULE等模块变 量都可以重定义,它们分别对应着nginx的核心模块,事件模块,HTTP模块,HTTP过滤模块,HTTP头部过滤模块。 除了NGX_ADDON_SRCS变量,还有一个变量经常用到:$NGX_ADDON_DEPS变量,它指定了模块依赖的路径,同样 可在config中设置
附录
-
深入理解Nginx模块开发与架构解析(第2版) 陶辉 著 ↩