项目地址:http://git.oschina.net/miki-long/nginx
前提:最近在研究nginx的用法,在windows上小试了一下,由于windows下不支持nginx缓存配置,所以本文主要是讲nginx,以及反向代理与负载均衡。
【一、为什么要使用nginx】
要回答为什么要使用nginx,那就先说说nginx能做些什么。
首先,nginx能做反向代理,那么什么是反向代理呢,举个栗子,我想在本地使用 www.mickey.com 的域名去访问 www.taobao.com。那么这个时候我们就可以通过nginx去实现。
再者,nginx能实现负载均衡,什么是负载均衡呢?就是我的项目部署在不同的服务器上,但是通过统一的域名进入,nginx则对请求进行分发,减轻了服务器的压力。
在上面这两种情况下,nginx服务器的作用都只是作为分发服务器,真正的内容,我们可以放在其他的服务器上,这样来,还能起到一层安全隔壁的作用,nginx作为隔离层。
其次,nginx还能解决跨域的问题。
【二、、nginx安装】
在 http://nginx.org/ 下载对应版本的nginx
在 nginx 的目录下使用 start nginx 或者 双击 nginx.exe 打开nginx
【三、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 1#全局设置
2main
3# 运行用户
4user www-data;
5# 启动进程,通常设置成和cpu的数量相等
6worker_processes 1;
7# 注意:分配到不同的配置文件---(类似搭建Tomcat集群,可能有多个文件分开配置nginx2.conf,nginx3.conf)
8#include vhost/*.conf;
9
10# 全局错误日志及PID文件
11error_log /var/log/nginx/error.log;
12pid /var/run/nginx.pid;
13
14# 工作模式及连接数上限
15events {
16 use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
17 worker_connections 1024; #单个后台worker process进程的最大并发链接数
18 # multi_accept on;
19}
20
21#设定http服务器,利用它的反向代理功能提供负载均衡支持
22http {
23 #设定mime类型,类型由mime.type文件定义
24 include /etc/nginx/mime.types;
25 default_type application/octet-stream;
26 #设定日志格式
27 access_log /var/log/nginx/access.log;
28
29 #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
30 #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
31 sendfile on;
32 #将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞
33 tcp_nopush on;
34 tcp_nodelay on;
35 #连接超时时间
36 keepalive_timeout 65;
37
38 #开启gzip压缩
39 gzip on;
40 gzip_disable "MSIE [1-6]\.(?!.*SV1)";
41
42 #设定请求缓冲
43 client_header_buffer_size 1k;
44 large_client_header_buffers 4 4k;
45
46 include /etc/nginx/conf.d/*.conf;
47 include /etc/nginx/sites-enabled/*;
48
49 #设定负载均衡的服务器列表
50 upstream mysvr {
51 #weigth参数表示权值,权值越高被分配到的几率越大
52 #本机上的Squid开启3128端口
53 server 192.168.8.1:3128 weight=5;
54 server 192.168.8.2:80 weight=1;
55 server 192.168.8.3:80 weight=6;
56 }
57
58
59 server {
60 #侦听80端口
61 listen 80;
62 #定义使用www.xx.com访问
63 server_name www.xx.com;
64
65 #设定本虚拟主机的访问日志
66 access_log logs/www.xx.com.access.log main;
67
68 #默认请求
69 location / {
70 root /root; #定义服务器的默认网站根目录位置
71 index index.php index.html index.htm; #定义首页索引文件的名称
72
73 fastcgi_pass www.xx.com;
74 fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
75 include /etc/nginx/fastcgi_params;
76 }
77
78 # 定义错误提示页面
79 error_page 500 502 503 504 /50x.html;
80 location = /50x.html {
81 root /root;
82 }
83
84 #静态文件,nginx自己处理
85 location ~ ^/(images|javascript|js|css|flash|media|static)/ {
86 root /var/www/virtual/htdocs;
87 #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
88 expires 30d;
89 }
90 #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
91 location ~ \.php$ {
92 root /root;
93 fastcgi_pass 127.0.0.1:9000;
94 fastcgi_index index.php;
95 fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
96 include fastcgi_params;
97 }
98 #设定查看Nginx状态的地址
99 location /NginxStatus {
100 stub_status on;
101 access_log on;
102 auth_basic "NginxStatus";
103 auth_basic_user_file conf/htpasswd;
104 }
105 #禁止访问 .htxxx 文件
106 location ~ /\.ht {
107 deny all;
108 }
109
110 }
111
112 #第一个虚拟服务器
113 server {
114 #侦听192.168.8.x的80端口
115 listen 80;
116 server_name 192.168.8.x;
117
118 #对aspx后缀的进行负载均衡请求
119 location ~ .*\.aspx$ {
120 root /root;#定义服务器的默认网站根目录位置
121 index index.php index.html index.htm;#定义首页索引文件的名称
122
123 proxy_pass http://mysvr;#请求转向mysvr 定义的服务器列表
124
125 #以下是一些反向代理的配置可删除.
126 proxy_redirect off;
127
128 #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
129 proxy_set_header Host $host;
130 proxy_set_header X-Real-IP $remote_addr;
131 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
132 client_max_body_size 10m; #允许客户端请求的最大单文件字节数
133 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
134 proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
135 proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
136 proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
137 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
138 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
139 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
140 proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
141 }
142 }
143}
144
1
2 1
2
【四、nginx反向代理】
本地起两个项目,源码在此。
分别在这两个文件夹下面运行
1
2
3 1npm install
2node server.js
3
在浏览器输入
本机ip:4789
本机ip:5789
可以访问到这两个页面
接着我们想使用
test.nginx.com访问到 页面5789
test.nginx.com/bug 访问到页面5789
则我们首先需要配置hosts
win 下hosts 的地址为 C:\Windows\System32\drivers\etc
我们需要在hosts文件里面添加如下配置
1
2 1172.18.144.23 test.nginx.com
2
然后在 nginx 的 http 模块上添加一个 server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 1
2
3server {
4 listen 80;
5 server_name test.nginx.com;
6
7 location / {
8 proxy_pass http://172.18.144.23:4789/;
9 }
10
11 location /buy {
12 proxy_pass http://172.18.144.23:5789/;
13 }
14
15 error_page 500 502 503 504 /50x.html;
16 location = /50x.html {
17 root html;
18 }
19
20 }
21
22
然后重启nginx
在浏览器输入 test.nginx.com
在浏览器输入 test.nginx.com/bug
反向代理就这样子啦。
【五、nginx负载均衡】
在nginx中配置http
首先配置负载均衡的服务
在http模块中添加如下配置
1
2
3
4
5 1upstream webservers {
2 server 172.18.144.23:4789 weight=10;
3 server 172.18.144.23:5789 weight=10;
4 }
5
把server改为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1server {
2 listen 80;
3 server_name test.nginx.com;
4
5 location / {
6 proxy_pass http://webservers;
7 }
8
9 location /buy {
10 proxy_pass http://172.18.144.23:5789/;
11 }
12
13 error_page 500 502 503 504 /50x.html;
14 location = /50x.html {
15 root html;
16 }
17
18 }
19
在浏览器输入 test.nginx.com,刷新,我们可以看到两种页面,说明nginx已经把我们的请求分发到不同的地方去了。