Nginx 实战案例

二、实战案例

2.1. 反向代理

 
server { listen 80; server_name doodblog.linkdood.cn; access_log /data/Yunwei/nginx/logs/doodblog_access.log main; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://172.16.8.185:8080; } } 

2.2. 负载均衡

upstream 模块: 提供负载均衡、故障转移等功能

负载均衡类型
类型 描述 备注
Round Robin 轮训 依次分配
Weight 权重 根据分配权重成比例分配
ip_hash IP 哈希 根据 IP 哈希结果分配
fair 根据后端服务器响应时间 第三方插件
url_hash 根据访问 url 哈希 第三方插件
设备状态
状态 描述 备注
down 当前服务器不提供服务  
weight 设置权重,数值越大,权重越高 默认:1
max_fails 如失败次数超过最大值,返回 proxy_next_upstream 模块定义的错误 默认:1
backup 备用服务器, 当所有非 backup 机器 down 或忙的时候,请求 backup 机器  
fail_timeout max_fails 达到多少次失败后,暂停多长时间  
 
# 负载均衡及案例 upstream index_test { ip_hash; server 127.0.0.1:8000 weight=1; server 127.0.0.1:8001 weight=2 down; server 127.0.0.1:8002 weight=2; server 127.0.0.1:8003 weight=2 backup; server 127.0.0.1:8004 weight=2 max_fails=3 fail_timeout=30s; } server { listen 80; server_name wiki.liandoudou.com.cn; access_log /data/soft/nginx/logs/wiki_access.log main; location / { proxy_pass http://index_test; } } 

2.3. 下载列表

root、alias 区别
alias: 访问 /download/android 路径,实际去找 /data/packages/client/anr/comm 目录
root: 访问 /download/ios 路径,实际去找 /data/packages/client/anr/comm/download/ios 目录

 
server { listen 80; server_name doodblog.linkdood.cn; access_log /data/Yunwei/nginx/logs/doodblog_access.log main; # alias指定程序路径 location /download/android { alias /data/packages/client/anr/comm; autoindex on; } # root 指定程序路径 location /download/ios { root /data/packages/client/anr/comm; autoindex on; } } 

2.4. 代理 PHP 程序

 
server { listen 80; server_name getip.linkdood.cn; location ~ \.php$ { root /data/Yunwei/nginx/html; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; } # 关闭favicon提示 location /favicon.ico { log_not_found off; access_log off; } } 

2.5. 正则表达式

正则符合正则描述备注
\ 转义符  
^ 匹配字符开始位置  
$ 匹配字符结束位置  
.* 匹配任意字符串  
~ 区分大小写  
~* 不区分大小写
!~ 区分大小写,不匹配  
!~* 不区分大小写,不匹配  
(x|y|z) 或匹配,x 或 y 或 z  
-f 判断文件是否存在  
-d 判断目录是否存在  
-e 判断文件或目录是否存在  
-x 判断是否为可执行文件  
 
#不区分大小写,匹配(at|bg0|hd|ht|pm|wc) location ~* /(at|bg0|hd|ht|pm|wc)(.*) { root /data/linkdood/data/bigdata; } 

2.6.rewrite 重定向

重定向标记标记描述备注
last 相当于 apache 里面的 [L] 标记,表示 rewrite  
break 本条规则匹配完成后,终止匹配,不再匹配后面的规则  
redirect 返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址  
permanent 返回 301 永久重定向,浏览器地址会显示跳转后的 URL 地址  
 
# 将所有http请求,永久重定向到https rewrite ^(.*)$ https://$host$1 permanent; # 将www.linkdood.cn/doodlog/ 永久重定向到doodblog.linkdood.cn rewrite ^/connect$ http://connect.myweb.com permanent; rewrite ^/connect/(.*)$ http://connect.myweb.com/$1 permanent; # 将doodblog.linkdood.cn 永久重定向到www.linkdood.cn/doodlog/ if ($host = "doodblog.linkdood.cn"){ rewrite ^/(.*)$ http://www.linkdood.cn/doodlog/$1 permanent; } # 将linkdood.cn 跳转到www.linkdood.cn if ($host != 'www.linkdood.cn' ) { rewrite ^/(.*)$ http://www.linkdood.cn/$1 permanent; } # 将 doodlog.linkdood.cn/image/下面数字 + png的图片跳转到404 rewrite ^/image/([0-9]+)\.png$ /404.html last; 

2.7. 访问限制

allow、deny 属于模块(ngx_http_access_module
allow: 允许 IP 或 IP 段访问,区间:http、server、location、limit_except
deny: 拒绝 IP 或 IP 段访问,区间:http、server、location、limit_except

 
#屏蔽单个IP的命令是 deny 192.168.1.1 #封整个段即从123.0.0.1到123.255.255.254的命令 deny 123.0.0.0/8 #封IP段即从123.45.0.1到123.45.255.254的命令 deny 124.45.0.0/16 #封IP段即从123.45.6.1到123.45.6.254的命令是 deny 123.45.6.0/24 location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; } # 禁止htaccess location ~//.ht { deny all; } # 禁止/data目录 location ~ ^/data { deny all; } # 禁止单个文件 location ~ /www/log/123.log { deny all; } 

2.8. 访问限速

limit_req: 限制请求数
limit_conn: 限制并发连接数

限制单 IP 并发数

 
#并发及带宽限制,对单个IP限制最大2个连接数,每个连接最大限速100k http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 2; limit_rate 100k; } } } # 测试: -c 并发请求数 -n 总请求数 -k 保持KeepAlive ab -n100 -c100 -k doodblog.linkdood.cn 

限制单会话请求数

 
# 单IP最大请求数为1个/s,最大5个延迟请求,超过立即返回503 http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5 nodelay; } } }
posted @ 2019-03-07 10:51  张富  阅读(765)  评论(0编辑  收藏  举报
levels of contents