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; } } }