我们先前将静态资源放到NFS,动态资源放到MySQL,一是为了提高我们Web服务器性能,减轻它的压力,另一面如果Web宕机了,我们的静态和动态资源还可以访问到。但是之前方式不管是静态还是动态文件,都是走的代码文件,通过代码文件调取的资源,那么我们越过代码文件去访问我们的资源,效率不是更高吗,如果服务器没出问题,但是代码出了问题,我们依旧可以访问到我们的资源。
本篇文章介绍Nginx动静分离,通过中间件将动态请求和静态请求进行分离,减少不必要的请求和请求时长,这样做提升了服务器运行效率,即使动态服务不可用了,但是静态资源不会收到影响。
使用Web01配置静态资源的文件
[root@Web01 wordpress]# vim /etc/nginx/conf.d/jing.conf
server {
listen 80;
server_name jing.koten.com;
root /code;
index index.html;
location ~* .*\.(jpg|png|gif)$ {
root /code/images;
}
}
~
~
~
~
~
~
<g.conf" [New] 10L, 199C written
[root@Web01 wordpress]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@Web01 wordpress]# systemctl restart nginx
[root@Web01 wordpress]# echo 'Web01' > /code/index.html
[root@Web01 wordpress]# mkdir /code/images/
[root@Web01 wordpress]# cd /code/images/
[root@Web01 images]# rz
[root@Web01 images]#
使用Web02配置动态资源的文件
[root@web02 ~]# yum install -y tomcat
[root@web02 ~]# mkdir /usr/share/tomcat/webapps/ROOT
[root@web02 ~]# cat /usr/share/tomcat/webapps/ROOT/java_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<HTML>
<HEAD>
<TITLE>koten JSP Page</TITLE>
</HEAD>
<BODY>
<%
Random rand = new Random();
out.println("<h1>随机数:<h1>");
out.println(rand.nextInt(99)+100);
%>
</BODY>
</HTML>
[root@web02 webapps]# systemctl start tomcat
LB01负载均衡上调度静态文件和动态文件的配置文件
[root@LB01 conf.d]# vim proxy_jingdong.conf
upstream webs {
server 172.16.1.7;
}
upstream static {
server 172.16.1.7:80;
}
upstream java {
server 172.16.1.8:8080;
}
server {
listen 80;
server_name jingdong.koten.com;
location / {
proxy_pass http://webs;
}
location ~* \.(jpg|png|gif)$ {
proxy_pass http://static;
proxy_set_header Host $http_host;
}
location ~ \.jsp {
proxy_pass http://java;
proxy_set_header Host $http_host;
}
}
[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# systemctl restart nginx
修改本地hosts后测试
修改LB01的配置文件并在LB01上整合动态和静态的html文件
[root@LB01 ~]# cat /etc/nginx/conf.d/proxy_jingdong.conf
upstream static {
server 172.16.1.7:80;
}
upstream java {
server 172.16.1.8:8080;
}
server {
listen 80;
server_name jingdong.koten.com;
location / {
root /code;
index index.html;
}
location ~* \.(jpg|png|gif)$ {
proxy_pass http://static;
proxy_set_header Host $http_host;
}
location ~ \.jsp {
proxy_pass http://java;
proxy_set_header Host $http_host;
}
}
[root@LB01 ~]# systemctl restart nginx
[root@LB01 ~]# cat /code/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://jingdong.koten.com/java_test.jsp",
success: function(data){
$("#get_data").html(data)
},
error: function() {
alert("哎呦喂,失败了,回去检查你服务去~");
}
});
});
</script>
<body>
<h1>测试动静分离</h1>
<img src="http://jingdong.koten.com/小兔.jpg">
<div id="get_data"></div>
</body>
</html>
动静分离测试
关闭Web01的静态资源服务,查看动态资源是否收到影响
[root@Web01 code]# systemctl stop nginx
关闭Web02的动态资源服务,查看静态资源是否收到影响
[root@Web01 code]# systemctl start nginx
[root@Web02 conf.d]# systemctl stop tomcat
Nginx负载均衡实现手机和PC调度至不同的后端节点
1、准备一台LB01(10.0.0.5、172.16.1.5)一台Web01(172.16.1.7)开发9090、9091、9092端口分别为安卓、苹果、电脑提供服务。
2、配置Web的Nginx文件
[root@Web01 ~]# cat /etc/nginx/conf.d/phone.conf
server {
listen 9090;
location / {
root /code/android;
index index.html;
}
}
server {
listen 9091;
location / {
root /code/iphone;
index index.html;
}
}
server {
listen 9092;
location / {
root /code/pc;
index index.html;
}
}
[root@Web01 ~]# systemctl restart nginx
3、在Web上创建对应网站目录及代码
[root@Web01 ~]# mkdir /code/{android,iphone,pc}
[root@Web01 ~]# echo '我是安卓' > /code/android/index.html
[root@Web01 ~]# echo '我是苹果' > /code/iphone/index.html
[root@Web01 ~]# echo '我是电脑' > /code/pc/index.html
4、配置负载均衡服务
[root@LB01 ~]# cat /etc/nginx/conf.d/proxy_phone.conf
upstream android {
server 172.16.1.7:9090;
}
upstream iphone {
server 172.16.1.7:9091;
}
upstream pc {
server 172.16.1.7:9092;
}
server {
listen 80;
server_name phone.koten.com;
charset 'utf-8';
location / {
#如果客户端来源是Android则跳转到Android的资源;
if ($http_user_agent ~* "Android") { #只要是日志里的都可以进行判断
proxy_pass http://android;
}
#如果客户端来源是Iphone则跳转到Iphone的资源;
if ($http_user_agent ~* "Iphone") {
proxy_pass http://iphone;
}
#如果客户端是IE浏览器则返回403错误;
if ($http_user_agent ~* "Edg") {
return 403;
}
#默认跳转pc资源;
proxy_pass http://pc;
}
}
也可以进行如下设置
server {
listen 80;
server_name www.koten.com;
if ($http_user_agent ~* "Android|Iphone") {
rewrite ^/$ http://m.koten.com redirect;
}
}
5、用浏览器进行测试
电脑端
安卓端
苹果端
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!