欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

静态资源和反向代理服务器的 Nginx 实现

最编程 2024-07-16 12:32:13
...

安装

安装Nginx之前需要做一些准备:

  • 安装GCC编译器:yum install -y gcc
  • G++编译器:yum install -y gcc-c++
  • 安装PCRE库:yum install -y pcre pcre-devel
  • 安装zlib库:yum install -y zlib zlib-devel
  • 安装OpenSSL开发库:yum install -y openssl openssl-devel

然后下载Nginx压缩包路径:Nginx官网 我这里选择的是稳定版。 在这里插入图片描述 解压:tar -zxvf nginx-1.20.1.tar.gz 在这里插入图片描述 解压之后的目录结构是这样的: 在这里插入图片描述

进入目录后执行命令:./configure 这个命令主要作用是检测操作系统的内核以及是否安装了需要的环境,参数的解析,以及中间目录和Makefile等文件的生成。 执行configure命令之后会生成一个objs的中间目录。

随后执行命令:make 这个命令是根据configure命令生成的Makefile文件编译Nginx工程,并生成目标文件、最终的二进制文件。

最后执行命令:make install make install命令将Nginx部署到指定的安装目录,如果执行configure的时候没有指定Nginx的部署目录的话,就会默认的部署在/usr/local/nginx这个目录下。 可以通过--prefix=PATH,指定Nginx安装部署后的目录位置。

如何启动Nginx: 进入部署目录中,执行sbin/nginx,即可启动Nginx: 在这里插入图片描述 停止Nginx命令:sbin/nginx -s stop 重启Nginx命令:sbin/nginx -s reload

简单原理介绍

在安装步骤的时候,可以看到,当Nginx被启动之后,会显示两个进程。一个是master,一个是worker。默认worker是一个,worker数量可以通过配置文件进行修改。

Nginx是使用一个master进程来管理多个worker进程。一般情况下, worker进程的数量与服务器上的CPU数量相等。实际上,Nginx中提供服务的就是worker进程,而master只是负责监控和管理worker进程。 Nginx进程间的关系

静态资源服务器

Nginx可以实现静态文件和应用程序的独立访问。也就是说,可以不通过应用程序去访问我们的静态资源,例如图片,pdf文件啊又或者说我们的前端代码啊(前后端分离项目)。

我是有遇到过一些老旧的项目,请求静态文件都是需要通过java接口去请求的。这样的实现方式不仅仅会导致安全性的降低(应用程序挂了,或者重新发布了,静态资源都会访问不了),还会很大程度影响我们的访问效率。

所以我们可以根据实际的业务场景,来选择使用Nginx作为静态资源服务器,那么如何实现静态资源服务器呢,主要是通过对nginx.conf文件的http块进行配置:


worker_processes  1;    #worker进程的数量,默认是1
 
events {
    worker_connections  1024; #每个worker进程的最大连接数
}

http {
    include       mime.types; #设定mime类型,类型由mime.type文件定义
    default_type  application/octet-stream; 

    sendfile        on; #指定nginx 是否调用sendfile 函数zero copy 方式)来输出文件
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65; #keepalive超时时间

    #gzip  on;

    server {
        listen       80; 		 #监听的端口
        server_name  localhost;  #监听的地址信息
        location /images/ {      #监听地址信息为localhost:80/images/* 的请求
            root   /usr/local/static;  #将符合条件的请求请求到真实的资源目录,/usr/local/static/images/*
            autoindex on;
        }

        location /pdf/ { #匹配路径为localhost:80/pdf/*的请求
            root   /usr/local/static;
            autoindex on;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }
}

效果: 在这里插入图片描述

在这里插入图片描述 关于location其他的匹配表达式: 语法:location[=|~|~*|^~|@]/uri/{...}

  • location = / #只有当用户请求是/时,才会使用该location下的配置
  • ~ 表示匹配URI的时候是区分大小写的
  • ~* 表示匹配URI的时候不区分大小写
  • ^~ 表示匹配URI的时候只需前半部分与uri参数匹配即可,location ^~ images {} ,以images开始的请求都会匹配上
  • @ 表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请 求

location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会 被第一个location处理。

反向代理服务器

Nginx除了可以用来当做静态资源服务器之外,还能够用来作为反向代理服务器。那么在说明如何配置反向代理服务器之前,先来简单说一下,什么是正向代理,什么是反向代理

所谓正向代理,例如我们现在需要访问某个网站,但是由于种种原因,我们的请求无法直接请求到目标服务器。此时,我们可以借助另一台在国外的服务器(用作代理,代理服务器),由这台服务器去访问目标服务器,而我们的客户端只需要请求这一台代理服务器即可。这个过程,就是正向代理。正向代理,隐藏了真实的客户端信息,服务器并不清楚实际是哪一个客户端发送来的请求,因为都是代理服务器直接与服务端进行请求和数据交互。 【图片来源在参考资料】 图片来源在参考资料 而反向代理,则是隐藏真实的服务端。例如我们客户端直接访问百度baidu.com,实际上baidu.com对应的就是一台代理服务器,它背后有大量的,真正提供服务的服务器来对请求进行处理和响应,但是对于客户端来说,它不知道是哪一台具体的服务器提供的服务。这个过程就是反向代理,反向代理隐藏了真实的服务端。

【图片来源在参考资料】 图片来源在参考资料 所以,Nginx在反向代理中,起到的作用就是充当反向代理服务器,用来将客户端的请求转发到真正提供服务的服务器上。

当客户端发送请求时,Nginx不会立刻转发到提供服务的服务器,而是先把用户的请求完整地接收,然后再向服务端发起连接,把缓存的客户端请求进行转发。Nginx这个工作方式优点在于,降低了服务端的负载压力,尽量把压力放在Nginx服务器上。缺点在于延长了请求的处理时间。

开始配置: 事前准备: 因为要测试Nginx转发到不同的服务器,所以我打包了三个jar包,并分别以8081,8082,8083三个端口来启动。 在这里插入图片描述 配置nginx.conf


#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;


events {
    worker_connections  1024;
}


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;
    #
    upstream nginx_demo_colony{
	server yourip:8081;
	server yourip:8082;
	server yourip:8083;	
    }

    server {
        listen       80;
        server_name  yourip;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
     
	location /nginxLoadBalanceDemo/{
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		proxy_pass http://nginx_demo_colony;   #upstream 声名的服务器集群
	}	
   
	location /images/ {
            root   /usr/local/static;
            autoindex on;
        }
        
        location /pdf/ {
            root   /usr/local/static;
            autoindex on;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }
}

调用接口的代码:

@RestController
@RequestMapping(value = "/nginxLoadBalanceDemo")
public class HelloWorld {
    @Value("${server.port}")
    private String serverPort;

	/**
	* 获取当前应用的端口号
	*/
    @GetMapping (value = "/getServerPort")
    public String getServerPort(){
        return this.serverPort;
    }

效果: 在这里插入图片描述 这里默认的负载均衡算法是轮询。 目前暂时到这吧,未来谁说得准,也许我还会回来完善,有缘再见。

参考资料

  1. 《深入理解Nginx:模块开发与架构解析(第2版》(网上找不到免费的就去买,不丢人)
  2. Nginx实战(共十一章)总述&汇总
  3. 正向代理与反向代理

推荐阅读