Nginx反向代理学习

2020-10-31 05:36发布

1. Nginx是什么?

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

\

nginx可以作为web服务器,但更多的时候,我们把它作为网关,因为它具备网关必备的功能:

- 反向代理
- 负载均衡
- 动态路由
- 请求过滤
  • Web服务器分2类:

    • web应用服务器,如:
      • tomcat
      • resin
      • jetty
    • web服务器,如:
      • Apache 服务器
      • Nginx
      • IIS
  • 区分:web服务器不能解析jsp等页面,只能处理js、css、html等静态资源。

  • 并发:web服务器的并发能力远高于web应用服务器。

  • 为什么高于web应用服务器呢?

因为Nginx是用的 NIO:not-blocking-IO 非阻塞IO

而tomcat则是用的BIO:blocking-IO 阻塞IO

nginx+tomcat搭配起来使用,可以很大的提升效率,nginx只处理js、css、html。tomcat只处理其他的请求。

2. Nginx的安装

2.1 下载

下载安装包: 
官网地址:
http://nginx.org/en/download.html

百度网盘--已经下载好的-- 1.16.1 版, 里面还有个工具,等下我们测试要用
链接:https://pan.baidu.com/s/1z4BnGjd-nVQqzrXJSJIP8g
提取码:s63f

2.2 安装

咳咳,这个嘛,解压即可使用,比较舒服

2.3 目录结构

3. Nginx的简单使用

启动: start nginx.exe

  • 启动成功

有没有启动成功表面是看不出来的,因为只会闪一下。但打开任务管理器是可以看到的,nginx默认进程是两个,可以修改。如果启动进程不是2个,说明是有问题的。

还有就是访问浏览器,直接访问localhost,可以看到一些信息。为什么会到这个页面,我们后面将配置的时候进行解释

停止: nginx.exe -s stop

也是看不出任何变化,但再看任务管理器就看不到nginx的进程了

重新加载: nginx.exe -s reload

nginx有个强大的功能,就是修改了nginx中的东西,不需要重新启动,7*24小时在线,甚至是更新了版本也不需要重新启动。运行nginx.exe -s reload重新加载即可。 我们在后面使用的时候进行演示

4.反向代理

4.2 解释

  • 代理:

说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;此时就涉及到两个角色,一个是被代理角色,一个是目标角色。

被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店,客人到 “华为” 专卖店买了个手机,这个专卖店就是代理,被代理角色就是 “华为” 厂家,目标角色就是用户。

  • 反向代理:

给大家举个例子:比如说华为官网,有很多人买华为,然后把服务器挤爆了,人太多了,服务器响应时间慢。然后怎么解决呢?就出现了大家熟悉的分布式集群。

通过上图可以看出,多个客户端给服务器发送的请求,Nginx 服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。

此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx 扮演的就是一个反向代理角色。

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息

  • 反向代理的作用:

保证内网的安全,通常将反向代理作为公网访问地址,Web 服务器是内网。负载均衡,通过反向代理服务器来优化网站的负载。

4.2 配置

我们来配置一个代理,将本地路径通过域名的方式进行访问

一:配置映射

通过我在上面百度网盘分享的工具,将127.0.0.1映射到指定的域名

通过工具

  • 步骤一:

  • 步骤二:

  • 步骤三:

测试是否映射成功

打开cmd,我们ping一下刚刚映射的路径, ok,成功

二:配置nginx

步骤一: 编辑该文件

步骤二: 解释server意思

# nginx默认的的配置, 一个server就是一个代理
server {
  listen       80; # 监听的端口号
  server_name  localhost;  # 监听的域名
  # 监听的路径,  / 是表示所有,  这里可以写正则表达式
  location / {
    root html; # root代表本地(nginx的本地,就是nginx的安装路径), 这里表示的html目录
    index index.html index.htm; # 然后指向了index.html文件, 
				# 这就是为什么访问localhost为什么会跳转到那个页面的原因了,
				# 你可以看一下nginx安装目录下的html目录,里面都有什么。
  }
  # 监听的错误响应码
  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root html;
  }
}

步骤三:配置我们自己的代理

将如下配置复制配置文件中即可,要会自己修改

server{ # 反向代理
  listen 80; # 监听的端口号
  server_name www.manlu.com; # 监听的域名

  # 一些头信息
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  # 监听的路径, / 是表示所有,  这里可以写正则表达式
  location / {
   proxy_pass http://127.0.0.1:10010; # proxy_pass 代表是代理到那个端口
   proxy_connect_timeout 1000; # 连接超时时间
   proxy_read_timeout 1000; # 超时超时时间
  }
}

其它配置- 设置进程数量

可以修改试试,修改完成后,不需要重新启动,输入重新加载命令即可,然后看你的任务管理器进程是不是变了。

注意: 记得重新加载

三:创建项目-测试反向代理

创建一个简单的项目-springboot,通过域名访问接口

步骤一:maven构建

步骤二:项目名

步骤三:项目地址

步骤四:pom依赖

修改pom文件,添加springboot启动器

    <!--springboot启动器-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
    </dependencies>

步骤五:端口号配置

创建配置文件

server:
  port: 10010 # 端口号

步骤六:启动器

创建启动器

package com.manlu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author manlu
 */
@SpringBootApplication
public class NginxApplication {
    public static void main(String[] args) {
        SpringApplication.run(NginxApplication.class,args);
    }
}

步骤七:控制器

创建控制器controller

package com.manlu.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 漫路h
 */
@RestController
@RequestMapping("/nginx")
public class NginxController {
    /**
     * 测试
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public String testNginx(@PathVariable Integer id){
        System.out.println(id);
        return "nginx返回参数:"+id;
    }
}

步骤八:启动

步骤九:访问

路径: http://www.manlu.com/nginx/123

nginx与其它web服务器的对比

哈哈我们今天就到这里。大家想多了解就多百度百度啦~~

标签: