花了一上午时间这次认认真真把张宴的那本nginx看了一遍,确实写的不错,很详细....
本来想总结一份文档,看到netseek的nginx指南已经整理的很详细,没必要再整了。理论就不废话了,nginx主要配置都在nginx.conf配置文件中.
1. nginx配置文档主要框架结构:
1. ....... 定义运行nginx worker进程的用户/组,worker进程数,可以打开的最大文件描述符数.Log/pid path
2. events{ 事件模块,控制nginx处理连接的方式
3. ……………….
4. }
5. http { nginx处理http的核心模块
6. ……………….
7. upstrearm 负载组名{ 负载均衡模块,可以有多个均衡组.
8. ……………………. nginx作反向代理方式有:轮询,权重,ip_hash,url_hash,fair
9. }
10. Server{ 定义虚拟主机模块,可以有多个
11. ………………
12. }
13. Server{
14. ………………….
15. Location ~ /purge(/.*) { location匹配目录/文件访问控制模块
16. ………..
17. }
18. Location ~ .*\.(ico\mp3\avi\jpg\jpeg\swf\.......) {
19. ………..
20. }
21. Location ~ .*\.(thtml|thtm)$ {
22. ………..
23. }
24. Location ./ {
25. ………..
26. }
27. Location ~ .*\.(php|jsp|cgi)$ {
28. ………..
29. }
30. Location /unlimit/ {
31. ………..
32. }
33. ………………….
34. }
35. Server{
36. ……………….
37. Location ~ .*\.(ico\mp3\avi\jpg\jpeg\swf\.......) {
38. ………..
39. }
40. Location ./ {
41. ………..
42. }
43. …………………….
44. }
45. }
2. nginx反向代理proxy_pass与负载均衡模块upstream实现:
1. user nginx nginx;
2. worker_processes 10; 工作进程数一般是cpu核数*2
3. error_log /var/log/nginx/error.log crit;
4. pid /var/run/nginx.pid;
5. worker_rlimit_nofile 51200; 文件描述符,每个进程所能打开的最大文件数量/socket.
6.
7. events
8. {
9. use epoll; 使用的I/O网络模型
10. worker_connections 51200;
11. }
12.
13. http
14. {
15. includ mime.types;
16. default_type application/octet-stream;
17. #charset uft-8; 如果有多个字符类型,最好在程序中定义
18.
log_format
main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"' ' up_ip: $upstream_addr '
'up_type $upstream_http_content_type' ' gzip "$gzip_ratio"';
注:添加header头信息x_forwarded_for获取客户端真实IP。 $remote_addr.....nginx内部变量
access_log /var/log/nginx/access.log main;
19.
20. server_names_hash_bucket_size 128;
21. client_header_buffer_size 32k;
22. large_client_header_buffer 4 32k;
23.
24. sendfile on;
25. tcp_nopush on;
26. tcp_nodelay on;
27. keepalive_timeout 65;
28.
29. gzip on; 开启gzip压缩
30. gzip_min_length 1k;
31. gzip_buffers 4 16k;
32. gzip_http_version 1.1;
33. gzip_comp_level 2;
34.
35. limit_zone myzone $binary_remote_addr 10m;
36.
37. client_max_body_size 50m; 允许客户端请求的最大单个字节数
38. client_body_buffer_size 256k; 缓冲区代理缓冲客户端请求的最 大字节数
39. proxy_connect_timeout 190; 后端server超时时间
40. proxy_send_timeout 290; 后端server回传时间
41. proxy_read_timeout 290; 后端server响应时间
42. proxy_buffer_size 4k; 缓存区保护的用户头信息大小,供nginx进行规则处理.
43. proxy_buffers 4 32k; 几个buffer最大用多大空间
44. proxy_busy_buffers_size 64k; 忙时可申请更大的空间
45. proxy_temp_file_write_size 64k; proxy缓存临时文件的大小
46. proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; 如遇500,503,404状态码转发到后端另一服务器。
47. proxy_max_temp_file_size 128m;
48.
49. upstream mysvr {
50. server 192.168.1.10;
51. server 192.168.1.11;
52. hash $http_host$request_uri;
53. }
54.
55. upstream websvr{
56. server 192.168.1.20;
57. server 192.168.1.21;
58. }
59. 注:nginx负载均衡方式:轮询,权重,ip_hash,url_hash,fair.具体解释下面有说明。
60.
61. upstream message_server{
62. server 192.168.1.30;
63. server 192.168.1.31;
64. }
65.
66. server {
67. listen 80;
68. server_name www.domain.com
69. location ~.*\.(ico|mp3|avi|wma|wmv|asf|mpg|mov|mid|js|css|jpg|ping|gif|swf|flv)$
70. {
71. proxy_set_header Host $host;
72. proxy_set_header X-Real-IP $remote_addr;
73. proxy_set_header X-Forwarded-For $proxy_add_x_forwaded_for;自定义变量获取原客户端真实IP。
74. 75. proxy_pass http://mysrv; 反向代理到mysrv负载池。
76. root html; 网页文件根目录,后端server 默认路径。
77. }
78. location ~.*\.(php|jsp|cgi)?${
79. 动态可直接proxy_pass到后端web池.http://websrv;
80. }
81.
82. location / 匹配以/开头的url
83. {
84. proxy_next_upstream http_502 http_504 error timeout invalid_header;
85. 如果后端服务器返回502,504,执行超时错误,自动请求转发到后端另一台server,故障切换。
86. proxy_pass http://mysrv;
87. proxy_set_header Host $host;
88. proxy_set_header X-Forwarded-For $remote_addr;
89. }
90. limit_conn myzone 100; 限制单个IP的100个并发访问数.
91. access_log /var/log/nginx/access.log main;
92. }
93.
94. server{ 第二个虚拟主机,反向代理websrv负载组
95. listen 80;
96. server_name www1.domain.com;
97. 访问http://www1.domain.com/message/...地址,反向代理到message_server池
98. 99. location /message/
100. {
101. proxy_pass http://message_server;
102. proxy_set_header Host $host;
103. }
104.
105. 访问除了/message/之外的http://www1.domain.com/.....地址,反向代理到websrv
106. location /
107. {
108. proxy_pass http://websrv;
109. proxy_set_header Host $host;
110. proxy_set_header X-Forwarded-For $remote_addr;
111. }
112. access_log /var/log/nginx/message.access;
113. }
114.
115.
116. }
117.
Nginx作为反向代理,利用upstream模块支持多组负载均衡,方式:
a) 轮询:每个请求按时间顺序依次分配到不同后端server.如何后端server down掉,能自动排除。
b) 权重: 根据weight值越大的后端server优先。指定轮询机率。
c) Ip_hash:如客户端IP第一次访问后端A-server,输入用户名密码后第二次可能分发到后端B-server,ip_hash利用hash_key值按访问ip的hash结果分配即进行哈希算法使其同一IP第二次会话保持访问至同一后端server. 此种方式能解决session问题,每个访客固定访问一个后端server.
d) 利用hash算法此种方式无法进行负载均衡。
e) url_hash:按访问url的hash结果分配,使每个url定向到同一后端server.如果后端是缓存server比较长有效,,如squid,可以增加squid命中率。
f) Fair:按后端服务器响应时间来分配请,响应时间短的优先分配。
Location 对url进行匹配,可以进行重定向或新的代理,负载均衡。
3. nginx缓存模块proxy_cache实例:
1. http{
2. ....
3. proxy_temp_path /data/proxy_temp_path;
4. levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
5. proxy_temp_path,proxy_cache_path路径须在同一分区下。
6. 设置web缓存区名cache_one,内存缓存空间大小200M,自动清除超过1天没有访问的缓存数据,硬盘缓存空间大小30G。
7. .....
8. upstream my_srv{
9. server ....
10. server ....
11. }
12. server{
13. ........
14. location /
15. {
16. proxy_set_header Host $host;
17. proxy_set_header X-Forwarded-For $remote_addr;
18. proxy_pass http:mysrv;
19.
20. location ~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
21. {
22. proxy_cache cache_one; 使用缓存区
23.
24. proxy_cache_valid 200 304 12h;
25. proxy_cache_valid 301 302 1m;
26. proxy_cache_valid any 1m;
27. 对不同状态码缓存时间不一样。
28.
29. proxy_cache_key $host$uri$is_args$args;
30. nginx根据key值md5哈希存储缓存,一般根据域名,URL,参数组成key.
31.
32. proxy_set_header Host $host;
33. proxy_set_header X-Forwarded-For $remote_addr;
34. proxy_pass http:mysrv;
35. 反向代理,访问后端.
36.
37. location ~/purge(/.*) 清除缓存http://.../purge/..
38. {
39. allow 127.0.0.1; 允许执行清除的IP段
40. allow 192.168.1.0/16;
41. deny all;
42. proxy_cache_purge cache-one $host$1$is_args$args;
43. }
44. access_log /var/log/nginx/purge.access main;
45.
46. }
47. }
4. nginx作为web服务器,nginx+php搭建胜过apche+php高性能的文章已经很多,也就不重复了。参考下基本都可以实现。
nginx很多模块可直接参照 nginx官网:http://nginx.org/en/docs/
分享附件:
如果想深入了解nginx并运用熟练,知其然知其所以然,可以参考下张宴的实战nginx书和netseek整理的nginx指南,都写得很好....