先看看nginx.conf.default这个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #user nobody; worker_processes 1;
#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
#pid logs/nginx.pid;
events { worker_connections 1024; }
http { include mime.types; default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on; #tcp_nopush on;
#keepalive_timeout 0; keepalive_timeout 65;
#gzip on;
server { listen 8080; server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { root html; index index.html index.htm; }
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}
# deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
# another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias;
# location / { # root html; # index index.html index.htm; # } #}
# HTTPS server # #server { # listen 443 ssl; # server_name localhost;
# ssl_certificate cert.pem; # ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on;
# location / { # root html; # index index.html index.htm; # } #} include servers/*;
|
location块配置理解
location 语法结构
1 2 3
| location [ = | ~ | ~* | ~^ ] uri { ... }
|
其中uri是待匹配的请求字符串,也就是待匹配的请求。可以是不含正则表达的字符串,如/index.html(“标准uri”)。 也可以是正则表达式,如.php$ 匹配以点php结尾的请求。
中括号的内容可选,当没有中括号的内容。nginx 首先在server的多个location块中搜索是否有标准uri与请求字符串相匹配的,如果有多个可以匹配,就记录匹配度最高的一个,注意这里只是先记录下来。然后服务器再用location中的正则uri与请求字符串匹配,当第一个uri匹配成功,结束搜索,并用这个location块处理请求,如果正则全部匹配失败,则使用刚才那个记录匹配度最的location块处理请求。
可先参数的含义
- = 表示请求字符串要与uri严格匹配。
- ~ 表示uri包含正则表达式,并且区分大小写。(实际验证未区分大小写)
- ~* 表示uri包含正则表达式,并且不区分大小写。
- ^~ 用于标准uri前,要求nginx找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location中的正则uri和请求字符串匹配。
配置请求的根目录
1 2 3
| location /data/ { root path_to_root; }
|
更改location的uri
1 2 3
| location ~ ^/data/(.+\.(htm|html))$ { alias /locationtest1/other/$1; }
|
设置网站的错误页面
语法:error_page code [=[response]] uri
1 2 3 4 5 6
| error_page 404 /404.html; error_page 403 http://site.com/forbidden.html; error_page 410 =310 /empty.gif; location /404.html { root /server/errorpage/; }
|
基于ip的访问权限设置
1 2 3 4 5
| location / { deny 192.168.1.1; #不支持写多个ip,要支持多个重复使用deny allow 192.168.1.0/24; deny all; }
|
这里会参生疑问,我们先禁止了192.168.1.1访问,然后又允许了192.168.1.0/24访问。最后又禁止所有访问。哪到底192.168.1.0/24能不能访问?
如果遇到匹配的配置,则停止向下搜索。
nginx gzip
默认值为off,即不启用gzip;只有gzip为on是gzip相关的指令才有效。
1
| gzip_buffers number size;
|
number nginx向系统申请缓存空间的个数
size 第个缓存空间的大小。
nginx在对响应输出的数据进行gzip压缩时需要向系统申请number * size 大小的空间用于存储数据。size的值为系统内存页 一页的大小,一般为4k或8k;
该指令用于设定gzip的压缩程度,压缩程度从底到高分1~9个等级。1压缩程度最低,压缩效率最高。9压缩程度最高,压缩效率最低,最耗时。
1 2
| gzip_disable regex ...; gzip_disable MSIE [4-6]\.
|
对哪些UA不作gzip处理。
1 2
| gzip_min_length length; gzip_min_length 1024;
|
响应超过多少才gzip压缩。如果太小,压缩后可能会变大。建议最小1024,即1kb;
1 2 3 4 5 6
| gzip on; gzip_min_length 1024; gzip_buffers 4 16k; gzip_comp_level 2; gzip_types text/plain application/z-javascript text/css application/xml; ...
|
rewrite
Rewrite的Flags
- last – 完成重写指令后,搜索相应的URI和位置。相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则。
- break – 中止Rewirte,不在继续匹配。
- redirect – 返回临时重定向的HTTP状态302。
- permanent – 返回永久重定向的HTTP状态301。
文件及目录匹配
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
正则表达式全部符号解释
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配
- (pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘/(’ 或 ‘/)’。
- ^ 匹配输入字符串的开始位置
- $ 匹配输入字符串的结束位置
域名跳转
1 2 3 4 5 6 7 8
| #例1 ... server { listen 80; server_name jump.myweb.name; rewrite ^/ http://www.myweb.info/; #域名跳转 } ...
|
多域名跳转
1 2 3 4 5 6 7 8
| server { listen 80; server_name jump.myweb.name jump.myweb.info; if ($host myweb\.info) #注意正则表达式中对点号“.”要用“\”进行转义 { rewrite ^(.*) http://jump.myweb.name$1 pe rmanent; #多域名跳转 } }
|
三级域名跳转
1 2 3 4 5 6 7 8 9
| server { listen 80; server_name jump1.myweb.name jump2.myweb.name; if ($http_ host ~* ^(.*) \.myweb.name$) { rewrite (.*) http://jump.myweb.name$1; break; } }
|
代理
1 2 3 4 5 6 7 8 9 10 11 12
| server { #监听80端口 listen 80; server_name localhost; # individual nginx logs for this web vhost access_log /tmp/access.log; error_log /tmp/error.log ;
location / { proxy_pass http://www.baidu.com; } }
|
负载均衡
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单说来就是:将负载进行平衡。人话就是将请求分派给其它服务器以及如何分派。
默认的规则
1 2 3 4 5 6 7 8 9 10 11
| # 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 #要放在http下。 upstream mt { server mt1.com; # 应用服务器1 server mt2.com; # 应用服务器2 }
#放在server下 location /api { proxy_pass http://mt; }
|
权重策略
1 2 3 4 5 6 7 8
| upstream mt { server 127.0.0.1:8085 weight=1; # 应用服务器1 server 127.0.0.1:8086 weight=9; # 应用服务器2 }
location /api { proxy_pass http://mt; }
|
ip_hash策略
1 2 3 4 5 6 7 8 9 10 11 12 13
| #3、IP绑定 ip_hash #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器, #可以解决session的问题;在不考虑引入分布式session的情况下, #原生HttpSession只对当前servlet容器的上下文环境有效 upstream mt { ip_hash; server mt1.com:8085; # 应用服务器1 server mt2.com:8086; # 应用服务器2 }
location /api { proxy_pass http://mt; }
|