1. root和alias区别

location /img/ {
    root /var/www/image;
}

location /img/ {
    alias /var/www/image/;
}

使用alias, /img -> /var/www/image/

使用root, /img -> /var/www/image/img/


alias替换掉了路由本身,root保留了路由本身

注意,alias必须以/结尾,否则会找不到文件

 

2. try_files


在nginx中 try_files 的的作用一般用户url的美化, 或者是伪静态功能, 能替代一些rewrite的指令,提高解析效率

location /images/ {
    root /opt/html/;
    try_files $uri   $uri/  /images/default.gif; 
}

比如 请求 127.0.0.1/images/test.gif 会依次查找

1.文件/opt/html/images/test.gif

2.文件夹 /opt/html/images/test.gif/下的index文件

3. 请求127.0.0.1/images/default.gif


4.其他注意事项

1.try-files 如果不写上 $uri/,当直接访问一个目录路径时,并不会去匹配目录下的索引页 即 访问127.0.0.1/images/ 不会去访问 127.0.0.1/images/index.html

 

3. rewrite


nginx的rewrite功能应该广泛,可以对url进行各种复杂的重写,解决


1. 伪静态

2. 路径格式的调整,添加、去除路径等

2. 目录、参数等调整,例如path参数和query_string的转换

3. 路径的各种跳转

 

4. location语法


location有两种匹配规则:


1. 命名location,用@标识,类似于定于goto语句块

location @name { … }

例如:

location /index/ {
  error_page 404 @index_error;
}
location @index_error {
  .....
}

location / {
    try_files $uri $uri/ @custom
}

location @custom {
    # ...do something
}

2. 匹配URL类型,有四种参数可选,当然也可以不带参数

location [ = | ~ | ~* | ^~ ] uri { … }

location   =        /uri        =开头表示精确前缀匹配,只有完全匹配才能生效
location   ^~       /uri        ^~开头表示普通字符串匹配上以后不再进行正则匹配,一般用来匹配目录
location   ~        pattern     ~开头表示区分大小写的正则匹配
location   ~*       pattern     ~*开头表示不区分大小写的正则匹配
location   /uri                 不带任何修饰符,表示前缀匹配,大小写敏感
location   /                    通用匹配,任何未匹配到其他location的请求都会匹配到

以上规则简单总结就是优先级从高到低依次为(序号越小优先级越高)

1. location =    # 精准匹配
2. location ^~   # 带参前缀匹配
3. location ~    # 正则匹配(区分大小写)
4. location ~*   # 正则匹配(不区分大小写)
5. location /a   # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location /    # 任何没有匹配成功的,都会匹配这里处理

location 实际使用,必备3项

1. 网站首页(转发或者直接设置静态页面)

location = / {
    proxy_pass http://tomcat:8080/index
}

2. 静态文件

location ^~ /static/ {
    root /webroot/static/;
}

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

3. 动态请求(转发给后端应用处理)

location / {
    proxy_pass http://tomcat:8080/
}

 

5. nginx直接返回文本或json

location ~ ^/text {
    default_type text/plain;
    return 200 '测试文本';  
}

location ~ ^/json {
    default_type application/json;
    return 200 '{"status":"success","result":"nginx json"}';
}

location ~ ^/text {
    default_type text/html;
    add_header Content-Type 'text/html; charset=utf-8'
    return 200 '测试文本';  
}

6. proxy_pass

proxy_pass的作用是代理到其他服务器,与rewrite的区别是,rewrite代理到当前域名下,通常是同一个服务器。proxy_pass代理到其他的域名和服务器。

读写分离

#写服务器集群
upstream write {
    server172.168.1.77 weight=1 fail_timeout=10s max_fails=2;
}
#读服务器集群
upstream read {
    server172.168.1.111 weight=1 fail_timeout=10s max_fails=2;
}

location / {
    root   html;
    index  index.html index.htm;
    if($request_method = PUT) { (当请求方法为PUT的时候,那么分发到写服务器)
        proxy_pass http://write;
    }
    proxy_pass http://read/; (请他请求都转发到读服务器)
}

nginx proxy_pass路径后带/与不带/的区别

7. upstream

upstream代表上游的服务器集群,表示nginx作为代理客户端,将请求转发到上游服务器,并且能返回上游服务器的返回的内容。