15.Nginx static and dynamic separation Rewrite

1. What is the static and dynamic separation?

将动态请求和静态请求区分访问, 

2. Why do static and dynamic separation?

静态由Nginx处理, 动态由PHP处理或Tomcat处理....
因为Tomcat程序本身是用来处理jsp代码的,但tomcat也能处理静态资源.
tomcat本身处理静态效率不高,还会带来资源开销.

3. How to achieve static and dynamic separation?

Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理。
如果请求的url是.php或者.jsp等等,这个时候这个请求是动态的,将转发给tomcat处理。

总结来说,Nginx是通过url来区分请求的类型,并转发给不同的服务端。

4. Single achieve actual separation of static and dynamic

1.安装  【 tomcat监听在8080端口】
[root@web01 ~]# yum install java tomcat -y

2.创建主站点目录
[root@web01 ~]# mkdir /usr/share/tomcat/webapps/ROOT        -->主要站点根目录

3.写入jsp代码
[root@web01 ~]# vi /usr/share/tomcat/webapps/ROOT/index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <html>
      <head>
        <title>Nginx+Tomcat</title>
      </head>
      <body>
          <%
            Random rand = new Random();
            out.println("<h2>动态资源</h2>");
            out.println(rand.nextInt(99)+100);
        %>
        <h2>静态图片</h2>
        <img src="nginx.png" />
      </body>
    </html>
4.下载图片至站点目录 
[root@web01 ~]# wget -O /usr/share/tomcat/webapps/ROOT/nginx.png http://nginx.org/nginx.png
5.重启tomcat服务
[root@web01 ~]# systemctl start tomcat
6.浏览器输入10.0.0.7测试验证

Here Insert Picture Description

4.1 Nginx configuration to achieve static and dynamic separation

[root@web01 conf.d]# cat ds.cheng.com.conf 
server {
    listen 80;
    server_name ds.cheng.com;
    
    location / {
    proxy_pass http://127.0.0.1:8080;
    }
    
    location ~*\.(png|gif|jpg|mp4)$ {
        root /images;
        expires 1d;
    }
}

The static and dynamic clusters to achieve actual separation

1.停止10.0.0.7nginx服务
[root@web01 conf.d]# systemctl stop nginx
2.10.0.0.8操作
[root@web02 conf.d]# cat ds.cheng.com.conf 
server {
    listen 80;
    server_name ds.cheng.com;
    expires 2d;
    
    location / {
    root /images;
    }
}

3.创建静态资源存放的路径以及上传图片
[root@web02 ~]# mkdir /images/

4. 负载配置:
[root@lb01 conf.d]# cat proxy_ds.cheng.com.conf 
upstream java {
    server 172.16.1.7:8080;
    }

upstream static {
    server 172.16.1.8:80;
    }

server {
    listen 80;
    server_name ds.cheng.com;
    
    location / {
    proxy_pass http://java;
    include proxy_params;
    }
    
    location ~* \.(png|jpg|gif|jpeg)$ {
    proxy_pass http://static;
    expires 2d;
    include proxy_params;
    }
}

6. This chapter outlines the course content

1. What is Rewrite?
2.Rewrite usage scenarios?
3.Rewrite implementation principles?
4.Rewrite rewrite the URL of deployment scenarios?
10 cases
5.Rewrite URL rewriting falg mark?
6.Rewrite rewrite the URL of production practices?

1.set set variables

1.将用户请求的url.cheng.com.cn重定向到url.cheng.com/zh
[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com.cn;
    
    set $language zh;
    rewrite ^/$ http://url.cheng.com/$language/;
    
}

server {
    listen 80;
    server_name url.cheng.com;

    location / {
    root /data;
    }

}

[root@web01 conf.d]# mkdir -p /data/{zh,jp,en}
[root@web01 conf.d]# echo "zh" > /data/zh/index.html
[root@web01 conf.d]# echo "jp"> /data/jp/index.html
[root@web01 conf.d]# echo "en"> /data/en/index.html
重启服务
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
域名解析
10.0.0.7 url.cheng.com  url.cheng.com.cn

测试【通过域名来实现跳转效果】

Exemplary binding if 2.set

1.将用户请求的url.cheng.com.jp跳转至url.cheng.com/ip
[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com.cn url.cheng.com.jp;
    
    #判断
    if ($http_host ~* cn) { 
    set $language zh;
    }
    if ($http_host ~* jp) {
    set $language jp;
    }
    
    rewrite ^/$ http://url.cheng.com/$language/;
    
}

server {
    listen 80;
    server_name url.cheng.com;

    location / {
    root /data;
    }

}
域名解析:


2.根据用户浏览器使用的语言,自动判断并跳转至不同的语言界面
中国          url.cheng.com    ---> url.cheng.com   --->中文
english     url.cheng.com    ---> url.cheng.com  --->english

[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com;

    location / {
    if ($http_accept_language ~* "en") {
    set $language en;
    }
    
    if ($http_accept_language ~* "zh|zh-CN") {
    set $language zh;
    }

    root /data/$language;
    }

}

3.nginx过滤请求中包含a1=3526的http请求到10.0.0.7的8080端口处理
[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com;

    location / {
    default_type text/html;
    if ($request_uri ~* "a1=3526") {
    return 200 "OK";    
    }
    
    if ($http_accept_language ~* "en") {
    set $language en;
    }
    
    if ($http_accept_language ~* "zh|zh-CN") {
    set $language zh;
    }

    root /data/$language;
    }

}

浏览器输入url.cheng.com/?a1=3526 进行测试!

3.return Case

[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com;

    location / {
    default_type text/html;
    if ($request_uri ~* "a1=3526") {            ---->一场景
    return 200 "https://www.jd.com";    
    }
    
    if ($request_uri ~* "git") {                ---->二场景
    return 403;
    }

    if ($request_uri ~* "^/test") {              ---->三场景
    return 302 "https://www.jd.com";
    }
    
    if ($http_accept_language ~* "en") {
    set $language en;
    }
    
    if ($http_accept_language ~* "zh|zh-CN") {
    set $language zh;
    }

    root /data/$language;
    }

}

4.break Case

[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com;
    root /code;

    location / {
        rewrite /1.html /2.html 
    break;
        rewrite /2.html /3.html;
    }

    location /2.html {
        rewrite /2.html /a.html;
    }

    location /3.html {
        rewrite /3.html /b.html;
    }
}

[root@web01]# echo "1.html" >/code/1.html
[root@web01]# echo "2.html" >/code/2.html
[root@web01]# echo "3.html" >/code/3.html
[root@web01]# echo "a.html" >/code/a.html
[root@web01]# echo "b.html" >/code/b.html
测试结果:当请求/1.html,最终会访问/2.html
因为在location{ }内部,遇到break,本location{ }内以及后面的所有location{ }内的所有指令都不在执行
set
if
return
    状态码
    状态码 字符串
    状态码 URL    301 302
break
    停止后续操作:
rewrite

关键字   正则  替代内容     flag标记
Syntax: rewrite regex replacement    [flag];

跳转  :
重定向:
#flag
last            #本条规则匹配完成后,继续向下匹配新的location URI规则   (开发| 伪静态)
break           #本条规则匹配完成即终止,不再匹配后面的任何规则        (挂维护页)
redirect        #返回302临时重定向, 地址栏会显示跳转后的地址
permanent       #返回301永久重定向, 地址栏会显示跳转后的地址
中国          url.cheng.com    ---> url.cheng.com/zh   --->中文
english         url.cheng.com    ---> url.cheng.com/cn   --->english

5.rewrite case of a [jump to a different domain name, depending on the browser language]

[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com;
    root /data;

    set $language /default;
    if ($http_accept_language ~* zh) {
    set $language /zh;
    }
    if ($http_accept_language ~* en) {
    set $language /en;
    }
    if ($http_accept_language ~* ja) {
    set $language /jp;
    }

    rewrite ^/$ $language;

    location / {
        index index.html;
    }
} 

6. permanent maintenance

[root@web01 conf.d]# cat url.cheng.com.conf
server {
    listen 80;
    server_name url.cheng.com;
    root /data;

    rewrite ^(.*)$ /wh.png break;
    set $language /default;
    if ($http_accept_language ~* zh) {
    set $language /zh;
    }
    if ($http_accept_language ~* en) {
    set $language /en;
    }
    if ($http_accept_language ~* ja) {
    set $language /jp;
    }

    rewrite ^/$ $language;

    location / {
        index index.html;
    }
} 

7. temporary maintenance (jump to the specified domain name)

[root@web01 conf.d]# cat url.cheng.com.conf
server {
    listen 80;
    server_name url.cheng.com;
    root /data;

    set $language /default;
    if ($http_accept_language ~* zh) {
    set $language /zh;
    }
    if ($http_accept_language ~* en) {
    set $language /en;
    }
    if ($http_accept_language ~* ja) {
    set $language /jp;
    }

    rewrite ^/$ $language;

    location / {
        index index.html;
    }

    #error_page 403 404 500 502 /wh.png;
    #error_page 403 404 500 502 $http_host; 

    error_page 403 404 500 502 @temperror;

    location @temperror {
    rewrite ^(.*)$ http://yinwucheng.com;
    } 
    
}

8. Demand: user access via mobile devices url.cheng.com, jump to url.cheng.com/m

server {
    listen 80;
    server_name url.cheng.com;
    root /data;

    if ($http_user_agent ~* "android|iphone|ipad") {
            rewrite ^/$ /m;
    }
}

9. Requirements: url.cheng.com user access via mobile devices, go to m.cheng.com

server {
    listen 80;
    server_name url.cheng.com;
    root /data;

    if ($http_user_agent ~* "android|iphone|ipad") {
        rewrite ^/$  http://m.cheng.com;
    }
}
server {
    listen 80;
    server_name m.cheng.com;
    root /data/m;
    
    location / {
        index index.html;
    }
}

10. Requirement: user access cheng.com/test, jump to https://xuliangwei.com

location方法:
        location /test {
                #rewrite ^(.*)$ https://www.xuliangwei.com/;
                return 302 https://www.xuliangwei.com/;
        }
if方法:
    server {
        listen 80;
        server_name url.cheng.com;
        root /data;

        if ($request_uri ~* "^/test") {
            #rewrite ^(.*)$ https://www.xuliangwei.com/;
            return 302 https://www.xuliangwei.com/;
        }
        location / {
            index index.html;
        }
    }

Go to https protocol agreement 11.http

return 302 https://$http_host$request_uri;

11.rewrite example scenario: Development

需求: 用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
[root@web01 conf.d]# cat url.cheng.com.conf 
server {
    listen 80;
    server_name url.cheng.com;
    root /data;
    location /  {
        index index.html;
                #用户访问的url       #文件真实位置
        rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html;
    }
}

Guess you like

Origin www.cnblogs.com/yinwu/p/11616443.html