阅读 134

nginx实现负载均衡和动静分离

这篇文章主要为大家详细介绍了nginx实现负载均衡和动静分离,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

nginx配置(windows配置),供大家参考,具体内容如下

以下是我的项目用到的一份配置文件

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#user nobody;
worker_processes 4; #进程数,一般cpu是几核就写多少
 
#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;
 proxy_connect_timeout 15s;
 proxy_send_timeout 15s;
 proxy_read_timeout 15s;
 fastcgi_buffers 8 128k;
 
 gzip on;
 client_max_body_size 30m;
 gzip_min_length 1k;
 gzip_buffers 16 64k;
 gzip_http_version 1.1;
 gzip_comp_level 6;
 gzip_types text/plain application/x-javascript text/css application/xml application/javascript image/jpeg image/gif image/png image/webp;
 gzip_vary on;
 
 #第一个集群
 upstream xdx.com{
 server 119.10.52.28:8081 weight=100;
 server 119.10.52.28:8082 weight=100;
  
 }
 
 #第二个集群,用于上传图片所用
 upstream xdxfile.com{
 server 119.10.52.28:8081;#关于文件上传的请求均访问这个集群
 }
 
 #第三个集群
 upstream xdx8082.com{
 server 119.10.52.28:8082;#8082
 }
 
 #第四个集群
 upstream xdxali.com{
 server 139.196.235.228:8082;#阿里云
 }
 
 #第五个集群
 upstream xdxaliws.com{
 server 139.196.235.228:8886;#阿里云websocket
 }
#第一个代理服务器,监听的是80端口,监听的域名是www.wonyen.com或者wonyen.com
 server {
 listen 80;#监听的端口
 server_name www.wonyen.com wonyen.com;#监听的域名
 
 #charset koi8-r;
 
 #access_log logs/host.access.log main;
 
 
 #location指的是访问的路径,下面这条配置表示当访问网站的根目录,即访问wonyen.com或者www.wonyen.com的时候,就去根目录为html的下面去寻找index.html或者index.htm。在index.html这个页面里面你可以做一些重定向的工作,跳转到指定页面
 
 #也可以自定义到某个集群
 # location / {
  # root html;
  # index index.html index.htm;
 #}
 #所有静态请求都交由nginx处理,存放目录为webapps下的root,过期时间为30天
  location ~ \.(css|js|gif|jpg|jpeg|png|bmp|swf|eot|svg|ttf|woff|mp3|mp4|wav|wmv|flv|f4v|json)$ {
  root apache-tomcat-8.0.9-windows-x86-yipin-8081/apache-tomcat-8.0.9/webapps/ROOT;
  expires 30d;
 }
 
 #配置以Att结尾的请求的处理集群为http://xdxfile.com
 location ~ ^/\w+Att{
  proxy_pass http://xdxfile.com;
 }
 
 #配置以Fill结尾的请求的处理集群为http://xdxfile.com
 location ~ ^/\w+Fill{
  proxy_pass http://xdxfile.com;
 }
 
 #精准配置,如果请求名为/crowdFundSave,则
 location = /crowdFundSave{
  proxy_pass http://xdxfile.com;
 }
 
 #精确配置,同上
 location = /crowdFundRewardSave{
  proxy_pass http://xdxfile.com;
 }
 
 #精确配置,同上
 location = /garbageCategorySave{
  proxy_pass http://xdxfile.com;
 }
 
 #精确配置,同上
 location = /mailTestAjax{
  proxy_pass http://xdx8082.com;
 }
 
 #精确配置,同上
 location = /mailSendAjax{
  proxy_pass http://xdx8082.com;
 }
 
 #精确配置,同上
 location = /mailOldAjax{
  proxy_pass http://xdx8082.com;
 }
 
 #精确配置,同上
 #location = /wechatAuthority{
  #proxy_pass http://xdxali.com;
 #}
 location ~ ^/ueditor1_4_3{
  proxy_pass http://xdxfile.com;
 }
 #其他所有请求都访问 http://xdx.com的集群
  location ~ .*$ {
  index index;
  proxy_pass http://xdx.com;
  }
 #404页面访问/Error404.jsp这个location
 error_page 404  /Error404.jsp;
 
 #500等页面也访问 /Error404.jsp这个location
 error_page 500 502 503 504 /Error404.jsp;
 
 #配置请求/Error404.jsp就访问http://xdxfile.com集群
 location = /Error404.jsp {
  proxy_pass http://xdxfile.com;
 }
 
 # 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
 #另外一个代理服务器,监听8886接口,监听的域名为www.wonyen.com或者wonyen.com
 server {
 listen 8886;
 server_name www.wonyen.com wonyen.com;
#配置若请求为wonyen.com:8086(根目录),就让他去访问http://xdxaliws.com这个集群,这边配置的是websocket的服务端
 location / {
  proxy_pass http://xdxaliws.com;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
 }
 }
 
 
 # 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;
 # }
 #}
 
}

以上就是我的一个配置。基本上需要注意的都在配置文件中注解。我把几个重要的地方单独拿出来讲一下。

1.集群的配置,我在上面的配置里有定义多个集群,集群按字面的意思理解就是由多台服务器构成的一个集合,典型的例子如 

1
2
3
4
5
upstream xdx.com{
 server 119.10.52.28:8081 weight=100;
 server 119.10.52.28:8082 weight=100;
  
 }

这样的一个配置,这个集群包含了两个分支,我们可以在两台服务器上搭建相同的项目(上述的例子是在同样的服务器,不同的端口部署相同的项目,因为笔者的服务器有限),当有请求是需要这个集群来处理的时候,nginx会随机分配,当然也可以配置权重来设置两个server的访问概率。这就是负载均衡的原理。我们在多台服务器上部署相同的项目,利用nginx对请求进行转发,这样可以降低只有一台服务器所造成的的负载过大,而且当其中一台服务器挂掉以后,nginx会分配另外一台服务器来工作,这样就不会造成服务停止了。

2.server配置项代表的是一个代理服务器,上面的文件中我们配置了两个文件,分别监听wonyen.com(www.wonyen.com)这两个域名的80和8886端口,所有访问wonyen.com:80(即wonyen.com)这个域名下的请求,都按照第一个server所定义的规则去转发,而所有访问wonyen.com:8886下的请求,则会按照第二个server所定义的规则去转发。

3.我们甚至可以通过配置来处理多个域名,看以下的例子。下面的例子我配置了两个域名的规则,一个是iis服务器,一个是tomcat服务器,主要目的是为了解决80端口只能被一个程序使用的问题。如果iis用了80,tomcat就用不了,反之亦然。所以我给iis和tomcat都分配除了80以外的端口,而把80端口留给niginx。由nginx来分配请求给不同的网站。

复制代码

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#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;