• nginx的基础学习+实战



    参考视频:尚硅谷Nginx教程(2019发布)
    参考链接:Windows下Nginx负载均衡实现

    一、前言

    Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,特点是占有内存少,并发能力强。在百度、腾讯、淘宝等网站广泛应用。有测试表明,nginx能支持高达50000个并发连接数。

    在官网下载nginx,直接下载zip解压

    在这里插入图片描述
    我们打开conf/nginx.conf,这是nginx的配置文件,里面分成三块:

    1、全局块


    范围:从开始到events块

    中间有这样一句配置worker_processes 1;,这个值越大,可以支持的并发处理量越大。

    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    



    2、events块(主要影响nginx和用户的网络连接)


    范围:events部分

    events {
        worker_connections  1024;
    }
    



    3、http块(包含http全局块server块


    范围:http部分(配置最频繁的部分)

    http全局块

        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    

    server块

    server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ .php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ .php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /.ht {
            #    deny  all;
            #}
        }
    



    二、反向代理

    (1)首先了解正向代理,国内用户正常情况下不能直接使用google搜索,如果要使用需要先请求代理服务器(浏览器需配置代理服务器),然后通过代理服务器向www.google.com发送请求,这个过程就是正向代理。代理服务器代表的是客户端。

    在这里插入图片描述

    (2)反向代理,反向代理服务器代理的是服务端,用户只需要将请求发送给反向代理服务器,反向代理服务器会自己去寻找对应的服务器。这时服务器的地址就不会暴露给用户

    在这里插入图片描述



    接下来我们来实现简单的反向代理

    需求:准备两个tomcat作为服务器,一个通过访问www.tomcat1.com:8080可以访问主页,一个通过访问www.tomcat2.com:8081看到主页,配置nginx反向代理后,只需要发送www.tomcat1.com和www.tomcat2.com就可以访问到各自主页。

    1. 配置DNS。首先要在windows系统的host文件里配置DNS,使得访问www.tomcat1.comwww.tomcat2.com就和访问localhost一样,见tomcat学习中有详细方法(因为我没有服务器,nginx也在window系统中,所以只能用端口号来区别两个服务器了),windows下host文件添加配置如下:
    # localhost name resolution is handled within DNS itself.
    #	127.0.0.1       localhost
    #	::1             localhost
    	127.0.0.1		www.tomcat1.com
    	127.0.0.1		www.tomcat2.com
    
    1. 修改其中一个server.xml文件,将端口号设置为8081(其余两个端口都要改变!!!否则无法同时启动两个tomcat)。删除两个tomcat下webapps下的所有文件,只留下ROOT文件夹,文件夹中都只留下一个index.html文件(以下是tomcat2服务器下的)
    <html>
    	<meta charset="UTF-8">
    	<head>
    		<title>tomcat2</title>
    	</head>
    	<body>
    		<h1>这是tomcat2</h1>
    	</body>
    </html>
    
    1. 此时启动两个tomcat,分别输入www.tomcat1.com:8080和www.tomcat2.com:8081可以访问到各自服务器下的index.html
    2. 配置nginx。打开conf/nginx.conf,(先复制保存原版本)删除原来的server{…},添加以下代码:
    	server {
            listen       80; 
            server_name  www.tomcat1.com;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location  / {
            proxy_pass   http://127.0.0.1:8080;
            index  index.html index.htm;
            }
        }
    	server {
    			listen       80;
    			server_name  www.tomcat2.com;
    			#charset koi8-r;
    			#access_log  logs/host.access.log  main;
    			location / {
    			proxy_pass   http://127.0.0.1:8081;
    			index  index.html index.htm;
    		}
    	}
    
    1. 点击nginx.exe启动。

    输入www.tomcat1.com和www.tomcat2.com,也可以显示页面了



    三、负载均衡

    平常我们开发web项目时,请求和响应的流程满足三层c/s架构如下:
    在这里插入图片描述
    但是当并发量很大时,单一的服务端很难及时响应。

    负载均衡就是增加服务器数量,把大量的请求分散在各个服务器上(将负载分布在多个服务器)

    在这里插入图片描述
    windows平台下nginx负载均衡的实现

    1. 配置nginx文件
      在这里插入图片描述
      所有动态请求都是通过localhost:8999转发。我们创建两个web项目,分别配置不同的tomcat服务器。只贴关键代码(两个web项目只有返回的字符串不同):
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>indexServlet</servlet-name>
            <servlet-class>indexServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>indexServlet</servlet-name>
            <url-pattern>/index</url-pattern>
        </servlet-mapping>
    </web-app>
    
    import java.io.IOException;
    import java.util.Date;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class indexServlet extends HttpServlet{
    
        public void doGet(HttpServletRequest request, HttpServletResponse response){
    
            try {
                response.getWriter().println("<h1>This is tomcat server 2!</h1>");
                response.getWriter().println(new Date().toLocaleString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    

    然后访问localhost:8999/index,不断刷新,结果在这两个页面中不断变化(可以设置权重来设置两个服务器的访问频率):
    在这里插入图片描述
    在这里插入图片描述

    四、动静分离

    为了加快网站的解析速度,可以把动态页面和静态页面由不同服务器来解析,加快解析速度,降低单个服务器的压力。

    在一般的web应用中,一个服务器tomcat管理所有的动态资源和静态资源
    在这里插入图片描述
    动静分离:
    在这里插入图片描述
    在windows下实现nginx与springboot的动静分离

    1. nginx配置动态请求的拦截静态资源的拦截
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
    	
    	server {
           listen       8999;	#监听8999端口
           server_name  localhost;
          
          #拦截动态请求
          location / {
            proxy_pass http://localhost:8080;
            proxy_set_header X-Real-IP $remote_addr;
          }
    
          #拦截静态资源(设置主页为html文件夹下的index.html)
          location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            root 	html;
    		index	index.html	index.htm;
          }
    
        }
    
    }
    
    1. 在nginx的html文件夹下放置如下文件作为静态资源
      在这里插入图片描述
      在这里插入图片描述
    2. 编写主页index.html代码(作用:向后端发送请求,将返回值打印到界面):
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
      {{result.data}}
    </div>
    
    <script type="text/javascript" src="./vue.min.js"></script>
    <script type="text/javascript" src="./axios.min.js"></script>
    <script>
    new Vue({
      el: '#app',
      data(){
        return {
    		result: null
    	}
      },
       mounted () {
        axios
          .get('index/list')
          .then(response => (this.result = response))
          .catch(function (error) { // 请求失败处理
            console.log(error);
          });
      }
    })
    </script>
    </body>
    </html>
    
    1. springboot后台indexController代码如下(返回一个list):
    @RestController
    @RequestMapping(value = "/index")
    public class IndexController {
    
    
        @RequestMapping(value = "/list",method = RequestMethod.GET)
        public List<Integer> list(){
           List<Integer> list = new ArrayList<>();
           for(int i = 0; i < 10; i++){
               list.add(i);
           }
            return list;
        }
    }
    
    
    1. 运行springboot项目(端口号8080)和nginx(端口号8999),发送请求到localhost:8999/index.html,nginx会把html文件夹下的index.html返回(静态资源),index.html中向后台使用了get方法,所以属于动态请求。nginx把请求发送给localhost:8080/index/list,获取返回数据后发送到前端。
      在这里插入图片描述
  • 相关阅读:
    sharepoint部署
    继承实体类出现传值时值不能保留
    面试经历
    sharepoint更换数据库链接
    asp.net c# 打开新页面或页面跳转
    sharepoint中配置工作流
    AD添加组织单位
    常用正则表达式
    删除多级非空目录
    C#实现对Word文件读写
  • 原文地址:https://www.cnblogs.com/theory/p/11884305.html
Copyright © 2020-2023  润新知