Nginx模块开发与架构解析(nginx安装、配置说明)
nginx的配置
通用语法
- 块配置项由一个块配置项和一对大括号组成,块配置项可嵌套。
- 配置项的语法格式:配置项名 配置项值1 配置项值2;
- 在一行前面加"#"表示注释
- 配置项的单位
指定空间大小
K或者k千字节(KB)
M或者m千字节(MB) 指定时间
ms(毫秒)
s(秒)
m(分钟)
h(小时)
d(天)
w(周,包含7天)
M(月,包含30天)
y(年,包含365天)
基本配置
- 用于调试进程、定位问题的配置项
- daemon on | off; 是否以守护进程方式运行nginx,默认是
- master_process on | off; 是否以master/worker方式工作,默认是
- error_log /path/file level; error日志设置
- /path/file参数可以是一个具体的文件,默认为logs/error.log文件
- /path/file可以是/dev/null,这是关闭error日志的唯一手段
- /path/file可以是stderr,这样日志会输出到标准错误文件中
- level是日志的输出级别,取值范围:debug、info、notice、warn、error、crit、alert、emerg
- 当设定为一个级别时,大于或等于该级别的日志都会被输出到/path/file文件中,小于该级别的日志则不会输出
- 如果日志级别设定到debug,必须在configure时加入--with-debug配置项
- debug_points [stop | abort]; 是否处理几个特殊的调试点(通常不会使用这个配置项)
- debug_connection [IP | CIDR]; 仅对指定的客户端输出debug级别的日志
- 这个配置项属于事件类配置项,必须放在events {...}中才有效
- 使用debug_connection前,必须在configure时加入--with-debug配置项
- worker_rlimit_core size; 限制coredump核心转储文件的大小
- working_directory path; 指定coredump文件生成目录
- 需确保worker进程有权限向working_directory指定的目录中写入文件
- 正常运行的配置项
- env VAR|VAR=VALUE; 定义环境变量
- include /path/file; 嵌入其他配置文件
- pid path/file; pid文件的路径,默认为pid logs/nginx.pid;
- user username [groupname]; nginx worker进程运行的用户及用户组,默认为user nobody nobody;
- worker_rlimit_nofile limit; 指定nginx worker进程可以打开的最大句柄描述符个数
- worker_rlimit_sigpending limit; 限制信号队列
- 优化性能的配置项
- worker_processes number; nginx worker进程个数,默认为worker_processes 1
- 模块间确认不会出现阻塞式的调用,则有多少CPU内核就应该配置多少个进程(内核个数可以通过命令cat /proc/stat查看stat文件)
- 模块间确认会出现阻塞式的调用,则根据需要配置稍多一些的worker进程
- worker_cpu_affinity cpumask [cpumask...] 绑定nginx worker进程到指定的cpu内核
- 2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
- worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
2核CPU开8进程,那么可以写为:
worker_processes 8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
- ssl_engine device; SSL硬件加速
- 需确保服务器上有SSL硬件加速设备,通过命令openssl engine -t查看是否有SSL硬件加速设备
- timer_resolution t; 系统调用gettimeofday的执行频率(一般不用配置)
- worker_priority nice; nginx worker进程优先级设置,默认为worker_priority=0;
- nice值是进程的静态优先级,取值范围是-20~+19,-20是最高优先级
- 不建议把worker进程的nice值设置比内核进程的nice值(通常为-5)小
- worker_processes number; nginx worker进程个数,默认为worker_processes 1
- 事件类配置项
- accept_mutex [on | off]; 是否打开accept(负载均衡)锁,默认为accept_mutex on;
- lock_file path/file; lock文件的路径,默认为lock_file logs/nginx.lock;
- 打开accept锁并且nginx不支持原子锁,lock_file配置才会生效
- accept_mutex_delay Nms; 使用accept锁后到真正建立连接之间的延迟时间,默认为accept_mutex_delay 500ms;cept off;
- use [kqueue | rtsig | epoll | /dev/poll | select | poll | even
- multi_accept [on | off]; 批量建立新连接,默认为multi_actport]; 选择事件模型,默认nginx会自动使用最合适的事件模型
- worker_connections number; 每个worker的最大连接数
从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法:
nginx作为http服务器的时候:max_clients = worker_processes * worker_connections/2
nginx作为反向代理服务器的时候:max_clients = worker_processes * worker_connections/4
静态web服务器的配置项
- 虚拟主机与请求的分发
- listen address:port [ default | default_server | backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on | off] | ssl]; 监听端口,直属于server块,默认listen 80;
- default、default_server:将所在的server块作为整个web服务的默认server块;默认将nginx.conf中找到的第一个server块作为默认server块
- backlog=num:表示TCP中backlog队列的大小,默认为-1(不予设置)
- rcvbuf=size:设置监听句柄的SO_RCVBUF参数
- sndbuf=size:设置监听句柄的SO_SNDBUF参数
- accept_filter:设置accept过滤器,只对FreeBSD操作系统有用
- deferred:当请求数据来临时,worker进程才会开始处理这个连接
- bind:绑定当前端口/地址对,只有同时对一个端口监听多个地址时才会生效
- ssl:在当前监听的端口上建立的连接必须基于SSL协议
- server_name name [...]; 主机名称,直属于server块,默认server_name "";
- server_name后可以跟多个主机名称
- server_name与host的匹配优先级
- 首先选择所有字符串完全匹配的server_name,如www.testweb.com
- 其次选择通配符在前面的server_name,如*.testweb.com
- 再次选择通配符在后面的server_name,如www.testweb.*
- 最后选择使用正则表达式才匹配的server_name,如~^\.testweb\.com$
- server_name与host不匹配
- 优先选择在listen配置项后加入[default | default_server]的server块
- 找到匹配listen端口的第一个server块
- server_names_hash_bucket_size size; 每个散列桶占用的内存大小,直属于http、server、location,默认serveer_names_hash_bucket_size 32|64|128;
- server_names_hash_max_size size; 散列表的冲突率,直属于http、server、location,默认server_names_hash_max_size 512;
- server_name_in_redirect on | off; 重定向主机名称的处理,直属于http、server、location,默认server_name_in_redirect on;
- 本配置需要配合server_name使用
- location [=||*|^~|@] /uri/ {...} 根据用户请求中的URI来匹配/uri/表达式,直属于server
- = 表示把URI作为字符串,以便与参数中的uri做完全匹配
- ~ 表示匹配URI时是字母大小写敏感
- ~* 表示匹配URI忽略字母大小写问题
- ^~ 表示匹配URI时只需要其前半部分与uri参数匹配即可
- @ 表示仅用于nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求
- 如果需要表达“如果不匹配...则...”,可以在最后一个location中使用/作为参数,它会匹配所有的http请求,这样就可以表示如果不能匹配前面的所有location,则有“/”这个location处理
- listen address:port [ default | default_server | backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on | off] | ssl]; 监听端口,直属于server块,默认listen 80;
- 文件路径的定义
- root path; 以root方式设置资源路径,直属于http、server、location、if,默认root html;
- alias path; 以alias方式设置资源路径,直属于location
- root和alias区别在于是否会根据完整的URI请求来映射
- index file; 访问首页,直属于http、server、location,默认index index.html
- error_page code [code...] [= | =answer-code] uri | @named_location; 根据http返回码重定向页面,直属于http、server、location、if
- recursive_error_pages [on | off]; 是否允许递归使用error_page,直属于http、server、location,默认recursive_error_pages off;
- try_files path1 [path2...] uri; 如果所有path都找不到有效的文件,就重定向到最后的参数uri上,直属于server、location
- 内存及磁盘资源的分配
- client_body_in_file_only on | clean | off; http包体只存储到磁盘文件中,直属于http、server、location,默认client_body_in_file_only off;
- 该配置一般用于调试、定位问题
- client_body_in_single_buffer on | off; http包体尽量写入到一个内存buffer中,直属于http、server、location,默认client_body_in_single_buffer off;
- client_body_buffer_size size; 存储http包体的内存buffer大小,直属于http、server、location,默认client_body_buffer_size 8k/16k;
- client_body_temp_path dir_path [level1 [level2[level 3]]]; http包体的临时存放目录,直属于http、server、location,默认client_body_temp_path client_body_temp;
- [level1 [level2[level 3]]]是为了防止一个目录下的文件数量太多,按照临时文件名最多再加三层目录
- client_header_buffer_size size; 存储http头部的内存buffer大小,直属于http、server,默认client_header_buffer_size 1k;
- large_client_header_buffers number size; 存储超大http头部的内存buffer大小,直属于http、server,默认large_client_header_buffers 4 8k;
- connection_pool_size size; 指定tcp连接的内存池的初始大小,直属于http、server,默认connection_pool_size 256;
- request_pool_size size; 指定http请求的内存池的初始大小,直属于http、server,默认request_pool_size 4k;
- client_body_in_file_only on | clean | off; http包体只存储到磁盘文件中,直属于http、server、location,默认client_body_in_file_only off;
- 网络连接的设置
- client_header_timeout time; 读取http头部的超时时间,直属于http、server、location,默认client_header_timeout 60;(默认单位:秒)
- client_body_timeout time; 读取http包体的超时时间,直属于http、server、location,默认client_body_timeout 60;(默认单位:秒)
- send_timeout time; 发送响应的超时时间,直属于http、server、location,默认send_timeout 60;(默认单位:秒)
- reset_timeout_connection on | off; 连接超时后将通过向客户端发送RST包来直接重置连接,直属于http、server、location,默认reset_timeout_connection off;
- lingering_close off | on | always; 控制nginx关闭用户连接的方式,直属于http、server、location,默认lingering_close on;
- lingering_time time; 控制nginx关闭用户连接的时间,直属于http、server、location,默认lingering_time 30s;
- lingering_timeout time; 控制nginx关闭用户连接的时间,直属于http、server、location,默认lingering_timeout 5s;
- keepalive_disable [msie6 | safari | none]; 对某些浏览器禁用keepalive功能,直属于http、server、location,默认keepalive_disable msie6 safari;
- keepalive_timeout time; keepalive超时时间,直属于http、server、location,默认keepalive_timeout 75;(默认单位:秒)
- keepalive_request n; 一个keepalive长连接上允许承载的请求最大数,直属于http、server、location,默认keepalive_request 100;(默认单位:秒)
- tcp_nodelay on | off; 确认对keepalive连接是否使用TCP_NODELAY选项,直属于http、server、location,默认tcp_nodelay on;
- tcp_nopush on | off; 在打开sendfile选项时,确定是否开启FreeBSD系统上的TCP_NOPUSH或Linux系统上的TCP_CORK功能,直属于http、server、location,默认tcp_nopush off;
- MIME类型的设置
- type {...} MIME type与文件扩展的映射,直属于http、server、location
- default_type MIME-type; 默认MIME type,直属于http、server、location,默认default_type text/plain;
- types_hash_bucket_size size; 设置每个散列桶占用的内存大小,直属于http、server、location,默认types_hash_bucket_size 32|64|128;
- types_hash_max_size size; 散列表的冲突率,直属于http、server、location,默认types_hash_max_size 1024;
- 对客户端请求的限制
- limit_except method ... {...} 按http方法名限制用户请求,直属于http
- client_max_body_size size; http请求包体的最大值,直属于http、server、location,默认client_max_body_size 1m;
- 用于限制Content-Length所示值的大小的,非常有用处
- limit_rate speed; 对请求的限速,直属于http、server、location、if,默认limit_rate 0;
- limit_rate_after time; nginx向客户端发送的响应长度超过limit_rate_after后才开始限速,直属于http、server、location、if,默认limit_rate_after 1m;
- 文件操作的优化
- sendfile on | off; sendfile系统调用,直属于http、server、location,默认sendfile系统调用
- aio on | off; AIO系统调用,直属于http、server、location,默认aio off;
- 该配置与sendfile功能互斥
- directio size | off; 使用O_DIRECT选项去读取文件,缓冲区大小为size,直属于http、server、location,默认directio off;
- 该配置通常对大文件的读取速度有优化作用
- 该配置与sendfile功能互斥
- directio_alignment size; 指定以O_DIRECT选项去读取文件时的对其方式,直属于http、server、location,默认directio_alignment 512;
- 该配置与directio配合使用
- open_file_cache max=N [inactive=time] | off; 打开文件缓存,直属于http、server、location,默认open_file_cache off;
- max:表示在内存中存储元素的最大个数
- inactive:表示在inactive指定的时间段内没有被访问过的元素将会被淘汰,默认时间为60秒
- off:关闭缓存功能
- open_file_cache_errors on | off; 是否缓存打开文件错误的信息,直属于http、server、location,默认open_file_cache_errors off;
- open_file_cache_min_uses number; 不被淘汰的最小访问次数,直属于http、server、location,默认open_file_cache_min_uses 1;
- open_file_cache_valid time; 检验缓存中元素有效性的频率,直属于http、server、location,默认open_file_cache_valid 60s;
- 对客户端请求的特殊处理
- ignore_invalid_headers on | off; 忽略不合法的http头部,直属于http、server,默认ignore_invalid_headers on;
- underscores_in_headers on | off; http头部是否允许下画线,直属于http、server,默认underscores_in_headers off;
- If-Modified-Since [off | exact | before]; 对If-Modified-Since头部的处理策略,直属于http、server、location,默认If-Modified-Since exact;
- merge_slashes on | off; 是否合并相邻的"/",直属于http、server、location,默认merge_slashes on;
- resolver address ...; 设置DNS名字解析服务器的地址
- resolver_timeout time; 设置DNS解析的超时时间,直属于http、server、location,默认resolver_timeout 30s;
- server_tokens on | off; 返回错误页面时是否在server中注明nginx版本,直属于http、server、location,默认server_tokens on;
- ngx_http_core_module模块提供的变量
- $arg_PARAMETER:http请求中某个参数的值,如/index.html?size=100,可以用$arg_size取得100这个值
- $args:http请求中的完整参数。例如,在请求/index.html?_w=120&_h=120中,$args表示字符串_w=120&_h=120
- $binary_remote_addr:二进制格式的客户端地址。例如:\x0A\xE0B\x0E
- $body_bytes_sent:表示在向客户端发送的http响应中,包体部分的字节数
- $content_length:表示客户端请求头部中的Content-Length字段
- $content_type:表示客户端请求头部中的Content-Type字段
- $cookie_COOKIE:表示在客户端请求头部中的cookie字段
- $document_root:表示当前请求所使用的root配置项的值
- $uri:表示当前请求的URI,不带任何参数
- $document_uri:与$uri含义相同
- $request_uri:表示客户端发来的原始请求URI,带完整的参数
- $host:表示客户端请求头部中的Host字段
- $hostname:表示nginx所在机器的名称
- $http_HEADER:表示当前http请求中相应头部的值,HEADER名称全小写。例如,$http_host:表示请求头部对应的值
- $sent_http_HEADER:表示返回客户端的http响应中相应头部的值,HEADER名称全小写。例如,$sent_http_content_type表示响应中Content-Type头部对应的值
- $is_args:表示请求中的URI是否带参数,如果带参数,$is_args值为?,如果不带参数,则是空字符串
- $limit_rate:表示当前连接的限速是多少,0表示无限速
- $nginx_version:表示当前nginx的版本号
- $query_string:请求URI中的参数
- $remote_addr:表示客户端的地址
- $remote_port:表示客户端连接使用的端口
- $remote_user:表示使用Auth Basic Module时定义的用户名
- $request_filename:表示用户请求中的URI经过root或者alias转换后的文件路径
- $request_body:表示http请求中的包体,该参数只在proxy_pass或fastcgi_pass中有意义
- $request_body_file:表示http请求中的包体存储的临时文件名
- $request_completion:表示请求是否已经全部完成
- $request_method:表示http请求的方法名,如GET、PUT、POST等
- $scheme:表示http scheme,如在请求https://nginx.com/中表示https
- $server_addr:表示服务器地址
- $server_name:表示服务器名称
- $server_port:表示服务器端口
- $server_protocol:表示服务器向客户端发送响应的协议,如HTTP/1.1或者HTTP/1.0
反向代理服务器的配置项
- 负载均衡的基本配置
- upstream name {...} upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用,直属于http
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
- server name [parameters]; 指定一台上有服务器的名字(域名、IP地址端口、UNIX句柄等),直属于upstream
- parameters可为weight=number:设置向这台上游服务器转发的权重,weigh和ip_hash配置不可同时使用,默认为1
- parameters可为max_fails=number:向上游服务器转发失败最大次数,该选项与fail_timeout配合使用
- parameters可为fail_timeout=time:该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。默认为10秒
- down:表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用
- backup:表示上游服务器是备份服务器,在使用ip_hash配置项时无效
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
- ip_hash; 可确保同一个客户端的请求只会转发到指定的上游服务器中,直属于upstream
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
- 记录日志时支持的变量
- $upstream_addr 处理请求的上游服务器地址
- $upstream_cache_status 表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、STALE、HIT
- $upstream_status 上游服务器返回的响应中的HTTP响应码
- $upstream_response_time 上游服务器的响应时间,精度到毫秒
- $upstream_http_$HEADER HTTP的头部,如$upstream_http_host
log_format timing '$remote_addr - $remote_user [$time_local] $request '
'upstream_response_time $upstream_response_time'
'msec $msec request_time $request_time';
log_format up_head '$remote_addr - $remote_user [$time_local] $request '
'upstream_http_content_type $upstream_http_content_type';
- 反向代理的基本配置
- proxy_pass URL; 将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名、IP地址加端口的形式、Unix句柄,直属于location、if
- 默认情况下反向代理不会转发请求中的host头部的,如果需要转发,那么必须加上配置:proxy_set_header Host $host;
- proxy_method method; 转发时的协议方法名,直属于http、server、location,例如:proxy_method POST;
- proxy_hide_header the_header; 将上游服务器的响应转发给客户端,直属于http、server、location
- proxy_pass_header the_header; 将原来禁止转发的header设置为允许转发,直属于http、server、location
- proxy_pass_request_body on | off; 确定是否向上游服务器发送HTTP包体部分,直属于http、server、location,默认proxy_pass_request_body on;
- proxy_pass_request_headers on | off; 确定是否转发HTTP头部,直属于http、server、location,默认proxy_pass_request_headers on;
- proxy_redirect [default | off | redirect replacement] 当上游服务器返回的响应是重定向或刷新请求时,重设HTTP头部的location或者refresh字段,直属于http、server、location,默认proxy_redirect default;
- proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off]; 表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求,直属于http、server、location,默认proxy_next_upstream error timeout;
Nginx模块开发与架构解析(nginx安装、配置说明)的更多相关文章
- 《深入理解Nginx:模块开发与架构解析》(一)
第1章 研究 Nginx 前的准备工作 1.1 Nginx 是什么 Web 服务器的基本功能:基于 REST 架构风格,以统一资源描述符(URI)或者统一资源定位符(URL),作为沟通依据,通过 HT ...
- 《深入理解Nginx:模块开发与架构解析》读书笔记
1.nginx的特点:快.扩展性强.可靠性强.内存低消耗.支持高并发.热部署.开源免费 2.nginx由master进程来管理多个(CPU数)worker进程 3.配置按功能分,有4类: 1)用于调试 ...
- 【转】Nginx模块开发入门
转自: http://kb.cnblogs.com/page/98352/ 结论:对Nginx模块开发入门做了一个helloworld的示例,简单易懂.也有一定的深度.值得一看. Nginx模块开发入 ...
- Nginx模块开发入门
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- [转] Nginx模块开发入门
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- Nginx模块开发入门(转)
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- Nginx模块开发入门(转)
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- FW: Nginx模块开发入门
前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...
- linux下nginx模块开发入门
本文模块编写参考http://blog.codinglabs.org/articles/intro-of-nginx-module-development.html 之前讲了nginx的安装,算是对n ...
随机推荐
- 12、mysql补充
本篇导航: 视图 触发器 事务 存储过程 函数 流程控制 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可 ...
- [转]开源.net 混淆器ConfuserEx介绍
今天给大家介绍一个开源.net混淆器——ConfuserEx http://yck1509.github.io/ConfuserEx/ 由于项目中要用到.net 混淆器,网上搜寻了很多款,比如Dotf ...
- Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
How to remove the key size restriction in Java JDK? Are you developing your beautiful application us ...
- Win10注册表无法保存对权限所作的更改拒绝访问
在对系统的安全控制得越来越多的情况下,要对注册表的关键数据进行修改是件挺麻烦的事,时不时会弹出无法保存对xxxxxx权限所作的更改,拒绝访问,操作产生错误,操作出现错误的提示,这时怎么办呢?这里就最近 ...
- intellij 自动导包
- MySQL 的 autocommit
在自动提交模式(autocommit=ON)下提交事务: •在自动提交模式下,每个SQL语句都是一个独立的事务. –mysql>insert into ACCOUNTS values(1,'To ...
- Netty实现的一个异步Socket代码
本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio; import com.google.common.util.concurrent.ThreadF ...
- boost::filesystem经常使用使用方法具体解释
提示: filesystem库提供了两个头文件,一个是<boost/filesystem.hpp>,这个头文件包括基本的库内容.它提供了对文件系统的重要操作. 同一时候它定义了一个类pat ...
- 【转载】史上最全:TensorFlow 好玩的技术、应用和你不知道的黑科技
[导读]TensorFlow 在 2015 年年底一出现就受到了极大的关注,经过一年多的发展,已经成为了在机器学习.深度学习项目中最受欢迎的框架之一.自发布以来,TensorFlow 不断在完善并增加 ...
- Sublime Text 输入法跟随光标
通过PackageControl安装“IMESupport”,重启Sublime Text3,即可解决: 注:如项目自述,仅支持Windows.