天天看点

Nginx常用变量,rewrite实战,Nginx反向代理,Nginx负载均衡

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调用这个集。

  1. 一个简单的负载均衡
    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秒。

负载均衡详细配置

继续阅读