美文网首页
44笔记---nginx

44笔记---nginx

作者: 口口帅日日 | 来源:发表于2019-09-25 08:29 被阅读0次

今日内容

1.什么是动静分离?
将动态请求和静态请求区分访问
2.为什么要做动静分离
静态由nginx处理,动态由php或Tomcat处理
因为tomcat本身是用来处理jsp代码的,但是tomcat也能处理静态资源。
tomcat本身处理静态效率不高,还会带来资源开销。
3.如何实现
Nginx根据客户端的请求url来判断请求的是否是静态资源,如果请求的包含url包含jpg,png则由nginx处理
如果请求的url是.php或者jsp这个时候的请求是动态的,则会发给tomcat处理。
总结:nginx是通过url区分请求的类型。并转发给不同的服务端。

单机实现静态分离

[root@web02 ~]# yum install java tomcat -y
[root@web02 ~]# mkdir /usr/share/tomcat/webapps/ROOT  #创建主要站点目录
[root@web02 ~]# cat /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>

[root@web02 ~]# wget -O /usr/share/tomcat/webapps/ROOT/nginx.png http://nginx.org/nginx.png
[root@web02 ~]# systemctl start tomcat
tomcat监听在8080端口上:
tcp6       0      0 :::8080                 :::*                    LISTEN      27923/java  
Ip:8080直接访问web站点测试

#配置Nginx 
[root@web02 ~]# cd /etc/nginx/conf.d/
[root@web02 conf.d]# cat ds.oldxu.com.conf 
server {
listen 80;
server_name ds.lsc.com;
location / {
    root /images;
}
}

做host劫持,并访问网站
image.png
image.png
image.png

集群实现动静态分离

1.停止本机的nginx
2.测试访问tomcat是否正常
3.配置lb负载均衡
    实现动态请求调度至动态集群
    实现静态请求调度至静态资源
4.准备一台另一台提供静态资源访问


1.停止本机的nginx
[root@web02 images]# systemctl stop nginx
2.ip+端口访问,静态和动态都正常
3.配置代理 可以配置缓存日期
  [root@lb01 conf.d]# cat     /etc/nginx/conf.d/proxy_ds.lsc.com.conf 
upstream java {

server 172.16.1.8:8080;

}
upstream static {
server 172.16.1.7:80;

}
server {
listen 80;
server_name ds.lsc.com;
location / {
    proxy_pass http://java;
    include proxy_params;

}
location ~* \.(png|gif|jpeg)$ {
    proxy_pass http://static;
    include proxy_params;
}

}

  java端:
  [root@web02 conf.d]# cat /etc/nginx/conf.d/ds.lsc.com.conf 
server {
listen 80;
server_name ds.lsc.com;

location / {
    proxy_pass http://127.0.0.1:8080;
}
location ~* \.(png|gif|jpg|mp4)$ {
    root /images;
    expires 1d;  #缓存时间 1天
}
}

static端:


  [root@web01 ~]# cat /etc/nginx/conf.d/ds.lsc.com.conf 
server {
listen 80;
server_name ds.lsc.com;


location / {
    root /images;
}
}
[root@web01 ~]# ll /images/nginx.png 
-rw-r--r-- 1 root root 118296 Sep 23 00:36 /images/nginx.png

Rewrite跳转

1.什么是Rewrite?
将用户请求web服务器的url地址重新修改为其他的url地址的过程   360buy.com --> jd.com

 2.Rewrite使用场景?
  1.地址跳转
  2.协议跳转,将http协议重新跳转到https协议
  3.url静态化,将动态url地址显示为静态url的一种技术
3.Rewrite实现原理?(图一)
4.Rewrite URL重写配置场景?
  set设置变量
  if负责语句中的判断
  return返回返回值或url
  break终止后相比的rewrite规则
  rewrite重定向url
10案例
5.Rewrite URL重写falg标记?
6.Rewrite URL重写生产实践?
image.png

2.url重写实例

1.set自定义变量
1.语法指令
  Syntax: set $variable value;
  Default: -
  Context:server, location ,if
2.将用户请求的url.lsc.com.cn重新定向到url.lsc,com/zh
[root@web02 conf.d]# cat /etc/nginx/conf.d/url.lsc.com.conf 
server {
listen 80;
server_name url.oldxu.com.cn;

set $language zh;       #设定变量
rewrite ^/$ http://url.lsc.com/$language/;  #默认以'/'结尾的

}
server {
listen 80;
server_name url.lsc.com;

location / {
    root /data;
}

}
[root@web02 conf.d]# mkdir /data/zh -p
[root@web02 conf.d]# mkdir /data/jp -p
[root@web02 conf.d]# mkdir /data/en -p
[root@web02 conf.d]# echo 'zh' /data/zh/index.htm^C
[root@web02 conf.d]# echo 'zh' >/data/zh/index.html
[root@web02 conf.d]# echo 'en' >/data/en/index.html
[root@web02 conf.d]# echo 'jp' >/data/jp/index.html
host劫持  ip url.lsc.com url.lsc.com.cn
请求url.lsc.com.cn
image.png
2.if指令
需求一:将用户请求的url.lsc.com.cn跳转至url.lsc.com/zh
需求二:将用户请求的url.lsc.com.jp跳转至url.lsc.com/jp
及不同的域名访问到的wen主站不同
synctax:if (condition)  {…}
Default: -
Context:server,location
# ~  模糊匹配
# ~* 不区分大小写的匹配
# !~ 不匹配
#=   精确匹配


  [root@web02 conf.d]# cat url.lsc.com.conf 
server {
listen 80;
server_name url.oldxu.com.cn url.oldxu.com.jp;
#判断来自不同国家的url请求,cn来自中国,匹配   
if ($http_host ~* cn) { 
    set $language zh;       #设定变量
    
}
#判断jp,来自日本,匹配
if ($http_host ~* jp) {
    set $language zh;
}   
 rewrite ^/$ http://url.lsc.com/$language/;


}
server {
listen 80;
server_name url.lsc.com;

location / {
    root /data;
}

}
image.png
image.png
需求三:根据用户请求浏览器的语言,自动判断并跳转不同的语言界面。
中国          url.oldxu.com    ---> url.oldxu.com   --->中文
english         url.oldxu.com    ---> url.oldxu.com   --->english


需求四:Nginx过滤请求中包含a1=3526的http请求到10.16.3.5的8080端口处理。
  server {
listen 80;
server_name url.oldxu.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;
}
}
image.png

return 返回数据

Syntax: return code [text];
return code URL;
return URL;
Default:-
 Context:server.location,if

1.返回状态码
if ($request_uri ~* "a1=3526"){
                            return 403;
            }
2.返回一个字符串
if ($request_uri ~* "a1=3526"){
                            return 200 “anything”;
            }

3.返回一个URL
if ($request_uri ~* "a1=3526"){
                            return 302 "http://www.jd.com";
            }      #302 跳转到某个url

if ($request_uri ~* "^/test") {
                    return 302 "http://www.jd.com";
            }      #请求网站的一个test目录,跳转到jd 

break跳出本次的循环

前提:需要pcre-devel库
Syntax: break;
Default:    —
Context:    server, location, if
server {
listen 80;
server_name url.lsc.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@web02]# echo "1.html" >/code/1.html
[root@web02]# echo "2.html" >/code/2.html
[root@web02]# echo "3.html" >/code/3.html
[root@web02]# echo "a.html" >/code/a.html
[root@web02]# echo "b.html" >/code/b.html
break结束,会看到2.html
last 结束当前的匹配,假设在2.html结束,结束当前,重新请求url,到location /2.html下

rewrite

#       关键字   正则  替代内容     flag标记
Syntax: rewrite regex replacement    [flag];
#flag
last            #本条规则匹配完成后,继续向下匹配新的location URI规则   (开发| 伪静态)
break           #本条规则匹配完成即终止,不再匹配后面的任何规则        (挂维护页)
redirect        #返回302临时重定向, 地址栏会显示跳转后的地址
permanent       #返回301永久重定向, 地址栏会显示跳转后的地址

实现场景

中国          url.oldxu.com    ---> url.oldxu.com/zh   --->中文
english         url.oldxu.com    ---> url.oldxu.com/cn   --->english

[root@web02 data]# echo "123456" >/data/default/index.html
 server {
listen 80;
server_name url.oldxu.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;
}
}

在网站不改变的情况下进入到一个维护页面(永久维护)
server {
listen 80;
server_name url.oldxu.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;
}
}
临时维护
    #error_page 403 404 500 502 /wh.png;
#error_page 403 404 500 502 http://$http_host;

error_page 403 404 500 502 @temperror;
location @temperror {
        rewrite ^(.*)$ http://$http_host;
}

需求:用户通过手机设备访问url.oldxu.com跳转至url.oldxu.com/m

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

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

访问lsc.com/test 跳转到https://www.jd.com
location------------------------------------------------------------------
    location /test {
            #rewrite ^(.*)$ https://www.xuliangwei.com/;
            return 302 https://www.xuliangwei.com/;
    }
if ------------------------------------------------------------------------
server {
    listen 80;
    server_name url.oldxu.com;
    root /data;

    if ($request_uri ~* "^/test") {
        #rewrite ^(.*)$ https://www.xuliangwei.com/;
        return 302 https://www.xuliangwei.com/;
    }
    location / {
        index index.html;
    }
}
    3.rewrite场景示例: 开发
需求: 用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
[root@web01 conf.d]# cat url.oldxu.com.conf 
server {
listen 80;
server_name url.oldxu.com;
root /data;
location /  {
    index index.html;
            #用户访问的url       #文件真实位置
    rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html;
}
}

相关文章

网友评论

      本文标题:44笔记---nginx

      本文链接:https://www.haomeiwen.com/subject/tojbuctx.html