负载均衡和会话保持---------春风又绿江南岸,明月何时照我还
Nginx实现动静分离
一、概述
1.1、Nginx动静分离基本概述
动静分离,通过中间件将'动态请求'和'静态请求'进行分离
通过中间件将动态请求和静态'请求分离',可以'节省不必要的请求消耗',同时能'减少请求的延时'。
动静分离是指在web服务器架构中,将'静态页面'与'动态页面'或者说是 '静态内容接口'和'动态内容接口'分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
# 动静分离只有好处:
# 动静分离后,即使动态服务不可用,但静态资源不会受到影响
1.2、前后分离
# 接口与视图分开部署,专业的人做专业的事。
例如:前端使用vue.js,后端只需要提供接口即可。前端项目于后端项目都是独立部署的
如果我们静态资源与动态资源存放在同一台服务器上面,当静态资源不断增多的时候,我们的服务器访问是扛不住的,因为静态资源消耗过多的带宽,导致静态资源无法访问或者访问的非常慢。
CDN扩展知识
CDN的全称是Content Delivery Network ,即'内容分发网络'。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置'节点服务器'所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据'网络流量'和各节点的连接、'负载状况'以及到用户的'距离'和响应时间等综合信息将用户的请求'重新导向'离用户'最近'的服务节点上。其目的就是使用户可'就近取得所需内容',解决internet网络拥挤的状况,'提高'用户访问网站的'响应速度'。
在一个网站中,静态资源(js,css,img)是比较占宽带资源的,动态资源占带宽很小。1M带宽=128k/s
所以网站中的静态资源一般都存放在第三方存储平台上,例如:七牛云、阿里云、腾讯云等,这些第三方存储平台内置CDN,进行内容分发,采用就近访问原则。
# CDN内容分发:就是将静态资源服务器部署在全国各个服务器节点上。
静态资源在前端页面直接配置的是静态服务器上面的资源地址,直接走第三方服务器,而不再走我们本地的服务器
二、配置动静分离
2.1、单台机器的动静分离
# vim /etc/nginx/conf.d/www.djfl.com
server {
listen 80;
server www.dkfl.com;
location {
root /mnt/wordpress;
index index.php
}
location ~* \.(jpg|png|gif)$ {
root /mnt/wordpress/wp-content
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /mnt/wordpress$fastcgi_script_name;
include fastcgi_params;
}
}
2.2、多台机器的动静分离
2.2.1、环境准备
主机 | 作用 | 服务 | IP |
---|---|---|---|
lb01 | 负载均衡 | nginx | 172.16.1.5 |
web01 | 静态资源 | nginx | 172.16.1.7 |
web02 | 动态资源 | nginx | 172.16.1.8 |
2.2.2、配置web01的静态资源
vim /etc/nginx/conf.d/www.djfl.com.conf
server {
listen 80;
server_name www.djfl.com;
}
location ~* \.(jpg|png|gif)$ {
root /mnt/wordpress;
}
2.2.3、配置web02的动态资源
1.下载tomcat
2.在/usr/share/tomcat/webapps/创建'ROOT'目录
3.创建动态文件,代码如下。
4.启动tomcat
5.配置本地host文件
6.访问测试
详细步骤
1.安装tomcat
[root@web02 ~]# yum install -y tomcat
2.配置动态资源
[root@web02 ~]# cd /usr/share/tomcat/webapps
[root@web02 webapps]# mkdir ROOT
[root@web02 webapps]# vim ROOT/java_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<HTML>
<HEAD>
<TITLE>测试动态资源</TITLE>
</HEAD>
<BODY>
<%
Random rand = new Random();
out.println("<h1>随机数:<h1>");
out.println(rand.nextInt(99)+100);
%>
</BODY>
</HTML>
3.启动方式
[root@web02 ~]# systemctl start tomcat
4.访问测试动态页面
1)配置hosts
10.0.0.8 linux.dj.com
2)访问
http://linux.dj.com:8080/java_test.jsp
2.2.4、配置负载均衡
1.配置文件
vim /etc/nginx/conf.d/www.djfl.com
upstream jt {
server 172.16.1.7:80;
}
upstream dt {
server 172.16.1.8:8080;
}
server {
listen 80;
server_name www.djfl.com;
location / {
root /mnt/wordpress;
index index.html;
}
location ~* \.(jpg|png|mp4)$ {
proxy_pass http://jg;
include proxy_params;
}
location ~* \.(php|jsp)$ {
proxy_pass http://dt;
include proxy_params;
}
}
2.重启nginx
3.配置本地hosts文件
3.单独访问动态文件和静态文件测试
2.2.5、整合动态和静态资源
1.创建站点目录
[root@lb01 ~]# mkdir /code/dj -p
2.编辑html文件
[root@lb01 ~]# vim /code/dj/index.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>测试ajax和跨域访问</title>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://linux.dj.com/java_test.jsp",
success: function(data){
$("#get_data").html(data)
},
error: function() {
alert("哎呦喂,失败了,回去检查你服务去~");
}
});
});
</script>
<body>
<h1>测试动静分离</h1>
<img src="http://linux.dj.com/1.jpg">
<div id="get_data"></div>
</body>
</html>
3.授权
[root@lb01 ~]# chown -R www.www /code/
4.访问域名测试
结论:静态资源出现问题不影响动态资源,动态资源出问题不影响静态资源
三、Nginx资源分离
3.1、准备环境
主机 | IP | 功能 |
---|---|---|
lb01 | 172.16.1.4 | 负载均衡 |
web01 | 172.16.1.7 | Android |
web02 | 172.16.1.8 | iphone |
web03 | 172.16.1.9 | pc端 |
3.2、配置web01服务器 |
1.配置文件
vim /etc/nginx/conf.d/www.sj.com
server {
listen 80;
server_name www.sj.com;
charset utf8;
location /{
root /mnt;
index index.html;
}
}
2.创建文件
echo "我是andorid" > /mnt/index.html
3.文件授权
chown -R www.www /mnt/index.html
4.重启
3.3、配置web02服务器
1.配置文件
vim /etc/nginx/conf.d/www.sj.com
server {
listen 80;
server_name www.sj.com;
charset utf8;
location /{
root /mnt;
index index.html;
}
}
2.创建文件
echo "我是ipone" > /mnt/index.html
3.文件授权
chown -R www.www /mnt/index.html
4.重启
3.4、配置web03服务器
1.配置文件
vim /etc/nginx/conf.d/www.sj.com
server {
listen 80;
server_name www.sj.com;
charset utf8;
location /{
root /mnt;
index index.html;
}
}
2.创建文件
echo "我是pc" > /mnt/index.html
3.文件授权
chown -R www.www /mnt/index.html
4.重启
3.4、配置负载均衡
1.配置文件
upstream android {
server 172.16.1.7;
}
upstream iphone {
server 172.16.1.8;
}
upstream pc {
sercer 172.16.1.9;
}
server {
listen 80;
server_name www.sj.com;
locaotion / {
if ($http_user_agent ~* "Android"){
proxy_pass http://android;
}
if ($http_user_agent ~* "iPhone"){
proxy_pass http://iphone;
}
proxy_pass http://pc;
include proxy_params;
}
}
2.nginx -t
3.重启
4.配置本地hosts文件
5.测试
实际线上配置
server {
listen 80;
server_name www.drz.com;
if ($http_user_agent ~* "Android|Iphone") {
rewrite ^/$ https://sj.drz.com redirect;
}
}
四、Nginx的Rewrite重写
4.1、Rewrite基本概述
1)什么是Rewrite?
Rewrite主要是实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程
2)Rewrite使用场景
1.地址跳转,用户访问www.linux.com这个URL时,将其定向至一个新的域名www.baidu.com
2.协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
3.伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时防止动态URL地址对外暴露过多的参数,提升更高的安全性
4.搜索引擎,SEO优化依赖于URL路径,好记得URL便于搜索引擎录入
3)Rewrite语法
Syntax:rewrite regex replacement [flag];
Context:server ,location , if
rewrite #模块命令
regex #请求的连接(直接正则表达式)
replacement #跳转的链接
[flag] #标签
示例:
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
4.2、Rewrite标记flag
Rewrite 指令根据表达式来重定向URL,或者修改字符串,可以应用于server,location,if环境下,每行Rewrite指令最后跟一个flag标记,支持的flag标记有如下类型:
flag | 作用 |
---|---|
last | 本条规则匹配完成后,停止匹配,不在匹配后面的规则 |
break | 本条规则匹配完成后,停止匹配,不在匹配后面的规则 |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址 |
break和last的区别
# break 只要匹配到规则,则会去本地配置路径的目录中寻找请求的文件;
# last 只要匹配到规则,会对其所在的server(...)标签重新发起请求
# break请求:
1.请求linux.rewrite.com/break
2.匹配 location ~ ^/break 会跳转到 linux.rewrite.com/test
3.请求跳转后,会去查找本地站点目录下的/test
4.如果找到了,则返回/code/test/index.html的内容
5.如果没有找到该目录则报错404,如果找到该目录没找到对用的文件则403;
# last请求:
1.请求linux,rewrite.com/lasr
2.匹配 location ~ ^/last 会跳转到 lunux.rewrite.com/test
3.如果找到了,则返回/code/test/index.html的内容
4.如果没有找到,会重新对当前server发起请求,这个时候访问地址就编程 linux.rewrite.com/test
5.重新请求server会匹配到 location /test/ 直接返回location的内容
6。如果也没有 location 匹配,在返回404;
4.3、redirect和permanent的区别
1)配置nginx
vim /etc/nginx/conf.d/linux.rewrite.com
server {
listen 80;
server_name linux.rewrite.com;
root /code;
location /test {
rewrite ^(.*)$ https://www.baidu.com redirect;
# rewrite ^(.*)$ https://www.baidu.com permanent;
}
}
2)总结
# redirect 302 临时重定向
# permanent 301 永久重定向
# redirect:
每次请求都会询问服务器,如果服务器不可用时,则跳转失败。
# permanent
第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器跳转。
ps:关掉服务器,照样继续跳转。在服务器关闭的情况下,清除缓存后无法跳转
4.4、Rewrite规则补充
1.限制性server块的rewrite指令
2.其次执行location匹配规则
3.最后执行location中的rewrite
4.5、Rewrite与Nginx的全局变量
$server_name #当前用户请求的域名
$request_filename #请求的文件路径名(带网站的主目录/code/images/test,jpg)
$request_uri #当前请求的文件路径(不带网站的主目录/images/test.jpg)
# 大多数用于http协议转gttps协议
server {
listen 80;
server_name php.hpp.com;
return 302 https://$server_name$request_uri;
}
$scheme #使用的协议,比如http或者https
如何更加规范的书写Rewrite规则
server {
listen 80;
server_name www.drz.com drz.com;
if ($http_host = drz.com){
rewrite (.*) http://www.drz.com$1;
}
}
#推荐书写格式
server {
listen 80;
server_name drz.com;
rewrite ^ http://www.drz.com$request_uri;
}
server {
listen 80;
server_name www.drz.com;
}
五、Rewrite案例
5.1、将 http 请求跳转到 https
server {
listen 80;
server_name linux.rewrite.com;
rewrite ^(.*)$ https://$server_name$1 redirect;
# return 302 https://$server_name$request_uri;
}
server {
listen 443;
server_name www.papacnb.com;
ssl on;
}
URL:http://www.baidu.com:80//code/index.html
URI:/code/index.html