先看看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

1
gzip on;

默认值为off,即不启用gzip;只有gzip为on是gzip相关的指令才有效。

1
gzip_buffers number size;

number nginx向系统申请缓存空间的个数

size 第个缓存空间的大小。

nginx在对响应输出的数据进行gzip压缩时需要向系统申请number * size 大小的空间用于存储数据。size的值为系统内存页 一页的大小,一般为4k或8k;

1
gzip_comp_level level;

该指令用于设定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;
}