Nginx常用的变量
比较常用的有$http_user_agent(客户端信息,浏览器标识),$request_uri(请求连接),$http_referer(跳转过来的地址)
Nginx所有变量的详情
rewrite实战
rewrite经常用于域名跳转,伪静态,防盗链
1. 域名重定向
场景一:
两个域名,一个是以前使用(www.shuai.com),一个是现在使用(www.aoli.com),将访问全部转到现在使用的域名上去。
在www.shuai.com虚拟主机中
server
{
listen 80;
server_name www.shuai.com;
rewrite /(.*) http://www.aoli.com/$1 permanent;
...
}
场景二:
一台主机有多个主机名,将所有访问全都转向一个主机名。
server
{
listen 80;
server_name www.shuai.com shuai.com;
if ( $host != "www.shuai.com" )
{
rewrite /(.*) http://www.shuai.com/$1 permanent;
}
}
场景三:
http跳转https
server{
listen 80;
server_name www.shuai.com;
rewrite /(.*) https://www.shuaicom/$1 permanent;
.......
}
场景四:
域名访问二级目录
server{
listen 80;
server_name bbs.shuai.com;
rewrite /(.*) http://www.shuai.com/bbs/$1 last;
.......
}
场景五:
分离静态请求
server{
listen 80;
server_name www.shuai.com;
if ( $uri ~* 'jpg|jpeg|gif|css|png|js$')
{
rewrite /(.*) http://img.shuai.com/$1 permanent;
}
.......
}
2.防盗链
server{
listen 80;
server_name www.shuai.com;
location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
{
valid_referers none blocked server_names *.shuai.com shuai.com ;
if ($invalid_referer)
{
rewrite /(.*) http://img.shuai.com/images/forbidden.png;
return 403;
}
}
.......
}
这里none表示空referer,blocked 表示没有http://或https://开头
3 .伪静态
location / {
rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
}
还有,多个条件一块rewrite的时候,Nginx只能加上一个计数变量
rewrite实战详解
Nginx的反向代理
反向代理作用有很多,本区域域名没有备案好,可以在香港的主机上做一个代理,能访问网站。反向代理多台后端机器,就被称为负载均衡。
简单的反向代理模板:代理www.shuai.com,proxy_pass设置的是IP,proxy_set_header Host 接收主机信息,proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。
server
{
listen 80;
server_name www.shuai.com;
location /
{
proxy_pass http://123.23.13.11/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- proxy_pass 可以后接主机名或IP+port ,一般的在后面加上\,这里设置会有好多种情况,这里就不一一说了,看后面详情。
- proxy_set_header用来设定被代理服务器接收到的header信息。
- proxy_redirect
- proxy_buffering
- proxy_cache
平常主要使用proxy_pass和proxy_set_header,后面的几个不常用。
proxy_buffering和proxy_cache详情
负载均衡
Nginx负载均衡是通过upstream 和proxy_pass 实现的,upstream提供一个real_server集,proxy_pass调用这个集。
-
一个简单的负载均衡
upstream www { server 172.37.150.109:80; server 172.37.150.101:80; server 172.37.150.110:80; } server { listen 80; server_name www.shuai.com; location / { proxy_pass http://www/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
upstream提供一个三台real_server集叫www,proxy_pass调用www,就可以实现。请求轮番发送给三台服务器。session或cookie信息是没有共享的。可能会需要多次登录信息。
2. 标准的负载均衡
upstream www {
server 172.37.150.109:80 weight=50;
server 172.37.150.101:80 weight=100;
server 172.37.150.110:80 weight=50;
ip_hash;
}
server {
listen 80;
server_name www.aminglinux.com;
location / {
proxy_pass http://www/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
weight表示权重,server性能好,设置权重高,处理任务多。
ip_hash表示客户端固定访问某台server(解决了session共享)。
基本上这样配置就是常用的Nginx负载均衡了。
upstream还有一些其他配置
server 172.37.150.109:80 weight=50 max_fails=3 fail_timeout=30s down backup;
down,表示当前的server不参与负载均衡;
backup,为预留的机器,当其他的server(非backup)出现故障或者忙的时候,才会请求backup机器;
max_fails,允许请求失败的次数,默认为1。当失败次数达到该值,就认为该机器down掉了。 失败的指标是由proxy_next_upstream模块定义,其中404状态码不认为是失败。
fail_timeount,定义失败的超时时间,也就是说在该时间段内达到max_fails,才算真正的失败。默认是10秒。