worker_processes number | auto;
worker 进程的数量;通常应该为当前主机的 cpu 的物理核心数。多于 8 个的话建议写 8 ,超过 8 个性能不会提升,稳定性降低
worker_cpu_affinity auto [cpumask] #将 work 进程绑定在固定 cpu 上提高缓存命中率
# 例:
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;
worker_priority number
# 指定 worker 进程的 nice 值,设定 worker 进程优先级: [-20,20]
worker_rlimit_nofile number
worker # 进程所能够打开的文件数量上限,默认较小,生产中需要调大如 65535。系统资源通过配置修改/etc/security/limits.conf 例:root soft nofile 65535,或命令修改 ulimit -n,修改后需重启服务或系统生效。
worker_connections number
use method
# 如:use epoll;
# 处理新的连接请求的方法
accept_mutex on | off # 互斥;
server { ... }
# 配置一个虚拟主机
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME; # 指令指向不同的主机名
root /PATH/TO/DOCUMENT_ROOT;
}
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
server_name *.magedu.com www.magedu.*
server_name ~^www\d+\.magedu\.com$ #\d 表示 [0-9]
匹配优先级机制从高到低:
tcp_nodelay on | off;
tcp_nopush on | off;
sendfile on | off;
是否启用 sendfile 功能,在内核中封装报文直接发送。如用来进行下载等应用磁盘 IO 重负载应用可设置为 off ,以平衡磁盘与网络 IO 处理速度降低系统负载,如图片显示不正常把这个改为 off 。默认 Off
是否在响应报文的 Server 首部显示 nginx 版本
server_tokens on | off | build | string
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
在一个 server 中 location 配置段可存在多个,用于实现从 uri 到文件系统的路径映射; ngnix 会根据用户请求的 URI 来检查定义的所有 location ,并找出一个最佳匹配,而后应用其配置
server {...
server_name www.magedu.com;
location /images/ {
root /data/imgs/;
}
}
http://www.magedu.com/images/logo.jpg
--> /data/imgs/images/logo.jpg
路径别名 alias path
示例:
# http://www.b.com/bbs/index.php
location /bbs/ {
alias /web/forum/;
} # --> /web/forum/index.html
location /bbs/ {
root /web/forum/;
} # --> /web/forum/bbs/index.html
注意 :
location 中使用 root 指令和 alias 指令的意义不同
error_page code ... [=[response]] uri;
模块:
ngx_http_core_module
error_page 404 /404.html
error_page 404 =200 /404.html #防止 404 页面被劫持
keepalive_timeout timeout [header_timeout];
keepalive_requests number;
keepalive_disable none | browser ...
send_timeout time;
client_body_buffer_size size;
用于接收每个客户端请求报文的 body 部分的缓冲区大小;默认为 16k ;超出此大小时,其将被暂存到磁盘上的由 client_body_temp_path 指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的 body 部分的临时存储路径及子目录结构和数量
目录名为 16 进制的数字;
client_body_temp_path /var/tmp/client_body 1 2 2
limit_rate rate;
限制响应给客户端的传输速率,单位是 bytes/second 默认 0 表示无限制
limit_except method ... { ... }
仅用于 location 限制客户端使用除了指定的请求方法之外的其它方法
method:GET , HEAD , POST , PUT , DELETE , MKCOL , COPY , MOVE , OPTIONS , PROPFIND ,
PROPPATCH , LOCK , UNLOCK , PATCH
# 例:
limit_except GET {
allow 192.168.1.0/24;
deny all;
}
除了 GET 和 HEAD 之外其它方法仅允许 192.168.1.0/24 网段主机使用
实现基于 ip 的访问控制功能
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;
http, server, location, limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
#示例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
实现基于用户的访问控制,使用 basic 机制进行用户认证
auth_basic string | off;
auth_basic_user_file file;
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
用户口令:
六、状态查看模块 ngx_http_stub_status_module
用于输出 nginx 的基本状态信息
# 示例:
location /status {
stub_status;
allow 172.16.0.0/16;
deny all;
}
log_format name string
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
buffer=size
flush=time
# 示例
log_format compression '$remote_addr-$remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log compression buffer=32k;
json 格式日志示例;log_format json '{"@timestamp":"$time_iso8601",'
'"client_ip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"method":"$request_method",'
'"request_uri":"$request_uri",'
'"xff":"$http_x_forwarded_for",'
'"referrer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
# 例:
open_log_file_cache max=1000 inactive=20s valid=1m;
nginx 对于代理服务器请求的响应报文,在何种条件下启用压缩功能
# 示例:
gzip on;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_vary on;
gzip_min_length 1024;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_disable "MSIE[1-6]\.(?!.*SV1)";
gzip_types text/xml text/plain text/css application/javascript application/xml application/json;
# 示例:
server {
listen 443 ssl;
server_name www.magedu.com;
root /vhosts/ssl/htdocs;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
}
将用户请求的 URI 基于 regex 所描述的模式进行检查,匹配到时将其替换为 replacement 指定的新的 URI 。注意:如果在同一级配置块中存在多个 rewrite 规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
# 例:
rewrite ^/zz/(.*\.html)$ /zhengzhou/$1 break;
rewrite ^/zz/(.*\.html)$ https://www.dianping/zhengzhou/$1 permanent;
停止处理,并返回给客户端指定的响应码
return code [text];
return code URL;
return URL;
是否开启重写日志, 发送至 error_log(notice level)
引入新的上下文,条件满足时,执行配置块中的配置指令; server , location
比较操作符 :
# 浏览器分流示例:
if ($http_user_agent ~ Chrom) {
rewrite ^(.*)$ /chrome/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /IE/$1 break;
}
valid_referers none|blocked|server_names|string ...;
定义 referer 首部的合法可用值,不能匹配的将是非法值,用于防盗链,
# 示例:
location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers none blocked server_names *.magedu.com
*.mageedu.com magedu.* mageedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
break;
}
access_log off;
}
Context:location, if in location, limit_except
注意: proxy_pass 后面的路径不带 uri 时,其会将 location 的 uri 传递给后端主机
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port];
}
...
}
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy_pass http://host; 不能加/
}
...
}
# http://HOSTNAME/uri/ --> http://host/uri/
设定发往后端主机的请求报文的请求首部的值
Context: http, server, location
proxy_set_headerHost$host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
标准格式如下 :
如后端是 Apache 服务器应更改日志格式:
%h -----> %{X-Real-IP}i
定义可用于 proxy 功能的缓存; Context:http
# 定义可用于 proxy 功能的缓存; Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size]
[manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number]
[purger_sleep=time] [purger_threshold=time];
# 例:
proxy_cache_path /data/nginx/cache(属主要为 nginx) levels=1:2 keys_zone=nginxcache:20m inactive=2m
proxy_cache zone | off; #默认 off
指明调用的缓存,或关闭缓存机制; Context: http , server , location
缓存中用于“键”的内容
定义对特定响应码的响应内容的缓存时
定义在 http{...} 中
# 示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 示例:
# 在 http 配置定义缓存信
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:1:1 keys_zone=proxycache:20m
inactive=120s max_size=1g;
# 调用缓存功能,需要定义在相应的配置段,如 server{...};
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
在被代理的后端服务器出现哪种情况下,可以直接使用过期的缓存响应客户端
proxy_cache_use_stale error | timeout |
invalid_header | updating | http_500 | http_502 |
http_503 | http_504 | http_403 | http_404 | off ..
对哪些客户端请求方法对应的响应进行缓存, GET 和 HEAD 方法总是被缓存
用于隐藏后端服务器特定的响应首部
定义与后端服务器建立连接的超时时长,如超时会出现 502 错误,默认为 60s ,一般不建议超出 75s
proxy_connect_timeout time;
把请求发送给后端服务器的超时时长;默认为 60s
等待后端服务器发送响应报文的超时时长, 默认为 60s
添加自定义首部
add_header name value [always];
添加自定义响应信息的尾部
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;
add_trailer name value [always];
fastcgi_pass address
fastcgi_index name
fastcgi_param parameter value [if_not_empty];
示例 1:
location ~* \.php$ {
fastcgi_pass # 后端 fpm 服务器 IP:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/usr/share/nginx/html$fastcgi_script_name;
include fastcgi.conf;
…
}
示例 2:
location ~* ^/(status|ping)$ {
include fastcgi_params;
fastcgi_pass # 后端 fpm 服务器 IP:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi.conf;
}
fastcgi 缓存相关
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size]
[manager_files=number] [manager_sleep=time] [manager_threshold=time]
[loader_files=number] [loader_sleep=time] [loader_threshold=time]
[purger=on|off] [purger_files=number] [purger_sleep=time]
[purger_threshold=time];
用于将多个服务器定义成服务器组,而由 proxy_pass , fastcgi_pass 等指令进行引用
# 定义后端服务器组,会引入一个新的上下文
# 默认调度算法是 wrr
Context: http
upstream httpdsrvs {
server ...
server...
...
}
在 upstream 上下文中 server 成员,以及相关的参数; Context:upstream
address 的表示格式
最少连接调度算法,当 server 拥有不同的权重时其为 wlc ,当所有后端主机连接数相同时,则使用 wrr ,适用于长连接
基于指定的 key 的 hash 表来实现对请求的调度,此处的 key 可以直接文本、变量或二者组合
server ,使用 consistent 参数, 将使用 ketama 一致性 hash 算法,适用于后端是 Cache 服务器(如 varnish )时使用
hash $request_uri consistent;
hash $remote_addr;
健康状态检测机制;只能用于 location 上下文
常用参数:
对 backend server 做健康状态检测时,定义其结果判断机制;
只能用于 http 上下文
常用的参数 :
模拟反代基于 tcp 或 udp 的服务连接,即工作于传输层的反代或调度器
stream { ... }
# 定义 stream 相关的服务; Context:main
stream {
upstream telnetsrvs {
server 192.168.22.2:23;
server 192.168.22.3:23;
least_conn;
}
server {
listen 10.1.0.6:23;
proxy_pass telnetsrvs;
}
}
listen address:port [ssl] [udp] [proxy_protocol]
[backlog=number] [bind] [ipv6only=on|off] [reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
可实现代理基于·TCP·, ·UDP (1.9.13)·, ·UNIX-domain·
sockets 的数据流
stream {
upstream telnetsrvs {
server 192.168.10.130:23;
server 192.168.10.131:23;
hash $remote_addr consistent;
}
server {
listen 172.16.100.10:2323;
proxy_pass telnetsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
linux 对于 nginx 做的内核优化(/etc/sysctl.conf)
fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
# 执行 sysctl -p 使内核修改生效
在 nginx 中配置 proxy_pass 代理转发时,如果在 proxy_pass 后面的 url 加 / ,表示绝对根路径;如果没有 / ,表示相对路径,把匹配的路径部分也给代理走。
# 第一种:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
# 代理到 URL:http://127.0.0.1/test.html
# 第二种(相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
# 代理到 URL:http://127.0.0.1/proxy/test.html
# 第三种:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
# 代理到 URL:http://127.0.0.1/aaa/test.html
# 第四种(相对于第三种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
# 代理到 URL:http://127.0.0.1/aaatest.html
# 第五种 配合 upstream 模块
# 如果一个域名可以解析到多个地址,那么这些地址会被轮流使用,此外,还可以把一个地址指定为 server group
upstream fasf.com {
server 10.*.*.20:17007 max_fails=2 fail_timeout=15s;
server 10.*.*.21:17007 max_fails=2 fail_timeout=15s down;
ip_hash;
}
server {
listen 9000;
server_name fsf-NGINX-P01;
location / {
proxy_pass http://fasf.com;
proxy_read_timeout 300;
proxy_connect_timeout 90;
proxy_send_timeout 300;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
}
X_Forward_For 字段表示该条 http 请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了(显示真实访问 ip)
syntax: rewrite regex replacement [flag]
rewrite 由 ngx_http_rewrite_module 标准模块支持是实现 URL 重定向的重要指令,他根据 regex (正则表达式) 来匹配内容跳转到 replacement ,结尾是 flag 标记
简单的小例子:
rewrite ^/(.*) http://www.baidu.com/ permanent;
匹配成功后跳转到百度,执行永久 301 跳转
常用正则表达式 regex:
rewrite 最后一项 flag 参数
标记符号 | 说明 |
---|---|
last | 本条规则匹配完成后继续向下匹配新的 location URI 规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回 302 临时重定向 |
permanent | 返回 301 永久重定向 |
在反向代理域名的使用,在 tomcat 中配置多个项目需要挂目录的使用案例
server {
listen 443;
server_name FLS-Nginx-P01;
ssl on;
ssl_certificate cert/214837463560686.pem;
ssl_certificate_key cert/214837463560686.key;
}
公网域名解析 fls.***.com
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location = / {
rewrite ^(.*)$ https://fls.***.com/fls/;
}
location / {
proxy_redirect http https;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
proxy_pass http://10.0.3.4:8080;
}
}
nginx 服务器日志相关指令主要有两条:一条是 log_format ,用来设置日志格式;另外一条是 access_log ,用来指定日志文件的存放路径、格式和缓存大小,可以参加 ngx_http_log_module 。一般在 nginx 的配置文件中日记配置( /usr/local/nginx/conf/nginx.conf )
log_format combined '$remote_addr-$remote_user [$time_local]'
upstream fasf.com {
server 10.5.1.*:17007 max_fails=2 fail_timeout=15s;
server 10.5.1.*:17007 max_fails=2 fail_timeout=15s down;
ip_hash; # ----同一 ip 会被分配给固定的后端服务器,解决 session 问题
}
server {
listen 443;
server_name fsfs-pi-P01;
ssl on;
ssl_certificate 214820781820381.pem; #证书路径:nginx.conf 所在目录
ssl_certificate_key 214820781820381.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://fafs.com;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
}
}
sendfile : 设置为 on 表示启动高效传输文件的模式。 sendfile 可以让 Nginx 在传输文件时直接在磁盘和 tcp socket 之间传输数据。如果这个参数不开启,会先在用户空间(Nginx 进程空间)申请一个 buffer ,用 read 函数把数据从磁盘读到 cache ,再从 cache 读取到用户空间的 buffer ,再用 write 函数把数据从用户空间的 buffer 写入到内核的 buffer ,最后到 tcp socket 。开启这个参数后可以让数据不用经过用户 buffer
当上传一个发数据文件时, nginx 往往会超时,此时需要调整 keepalive_timeout 参数,保持会话长链接
如果你是个前端开发人员,你肯定知道线上环境要把 js , css ,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要。
gzip on
gzip_min_length 1k
设置允许压缩的页面最小字节数,页面字节数从 header 头中的 Content-Length 中进行获取。默认值是 0 ,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大。
gzip_buffers 4 16k
获取多少内存用于缓存压缩结果, ‘4 16k’ 表示以 16k*4 为单位获得
gzip_comp_level 5
gzip 压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php
对特定的 MIME 类型生效,其中 'text/html’ 被系统强制启用
gzip_http_version 1.1
识别 http 协议的版本,早起浏览器可能不支持 zip 自解压,用户会看到乱码
gzip_vary on
gzip_proxied off
nginx 做为反向代理时启用, off (关闭所有代理结果的数据的压缩), expired (启用压缩,如果 header 头中包括 "Expires" 头信息), no-cache (启用压缩, header 头中包含 "Cache-Control:no-cache" ), no-store (启用压缩,header 头中包含 "Cache-Control:no-store") , private (启用压缩, header 头中包含 "Cache-Control:private" ), no_last_modefied (启用压缩,h eader 头中不包含 "Last-Modified") , no_etag (启用压缩,如果 header 头中不包含” Etag “头信息), auth (启用压缩,如果 header 头中包含” Authorization “头信息)
gzip_disable msie6
( IE5.5 和 IE6 SP1 使用 msie6 参数来禁止 gzip 压缩 ) 指定哪些不需要 gzip 压缩的浏览器(将和 User-Agents 进行匹配),依赖于 PCRE 库
以上代码可以插入到 http {...} 整个服务器的配置里,也可以插入到虚拟主机的 server {...} 或者下面的 location 模块内
client_body_buffer_size 15M;
请求缓冲区在 NGINX 请求处理中起着重要作用。 在接收到请求时, NGINX 将其写入这些缓冲区,此指令设置用于请求主体的缓冲区大小。 如果主体超过缓冲区大小,则完整主体或其一部分将写入临时文件。 如果 NGINX 配置为使用文件而不是内存缓冲区,则该指令会被忽略。 默认情况下,该指令为 32 位系统设置一个 8k 缓冲区,为 64 位系统设置一个 16k 缓冲区
client_body_temp_path clientpath 3 2;
关于 client_body_temp 目录的作用,简单说就是如果客户端 POST 一个比较大的文件,长度超过了 nginx 缓冲区的大小,需要把这个文件的部分或者全部内容暂存到 client_body_temp 目录下的临时文件
client_body_temp_path /spool/nginx/client_temp 3 2;
可能创建的文件路径为
/spool/nginx/client_temp/702/45/00000123457
client_max_body_size 30M;
此指令设置 NGINX 能处理的最大请求主体大小。如果请求大于指定的大小,则 NGINX 发回 HTTP 413(Request Entity too large) 错误。 如果服务器处理大文件上传,则该指令非常重要
worker_processes :
stream {
upstream smtp {
least_conn; # ------把请求转发给连接数较少的后端,能够达到更好的负载均衡效果
server 10.5.3.17:25 max_fails=2 fail_timeout=10s;
}
server {
listen 25;
proxy_pass smtp;
proxy_timeout 3s;
proxy_connect_timeout 1s;
}