Java EE--组件篇 Nginx

目录

前言

Nginx

下载安装

一、反向代理

二、负载均衡

三、动静分离(Http服务器)

四、网页压缩和图片压缩

***:什么是网页压缩和图片压缩?

***:如何配置网页压缩和图片压缩

***:开放跨域限制

***:配置Https

***:修改请求体大小

***:复用nginx,多项目分开配置

***:root和alias的区别


前言

带着问题学java系列博文之java基础篇。从问题出发,学习java知识。


Nginx

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,*使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

在后台业务开发中,常常需要用到一些组件,利用组件提供的功能完成一些特定的需求。Nginx就是常常用到的一个组件之一,我们主要利用它来实现三大功能:反向代理、负载均衡和web服务器(动静分离)。

下载安装

windows:http://nginx.org/en/download.html    下载稳定版本   

Java EE--组件篇 Nginx

下载之后直接解压即可(注意全路径不要包含中文,否则启动可能会报错):

Java EE--组件篇 Nginx

双击nginx.exe运行。在浏览器输入localhost:80/

Java EE--组件篇 Nginx

linux: http://nginx.org/en/download.html    下载稳定版本 

Java EE--组件篇 Nginx

Nginx安装配置:

***如果已经安装过nginx,需要重新安装,首先执行如下命令,卸载当前nginx

ps -ef | grep nginx 查询nginx当前运行的进程id

kill -9 id1 id2 杀死nginx进程

rm -rf /usr/local/nginx 删除所有安装文件(这个与本机nginx安装路径一致)

一.安装依赖库 pcre

1.下载 link:https://ftp.pcre.org/pub/pcre/

2. 上传 rz -y 选择压缩包

3.解压缩 tar -zxvf pcre-8.40.tar.gz

4.进入解压文件夹 cd pcre-8.40

5.执行configure ./configure

6.编译安装 make && make install

7.检查是否安装成功 pcre-config --version (显示8.40版本号,表示安装成功)

二.安装nginx

1.下载 link:http://nginx.org/en/download.html 

2.上传 rz -y 选择压缩包

3.解压缩 tar -zxvf nginx-1.17.6.tar.gz

4.进入解压文件夹 cd nginx-1.17.6

5.执行configure

(先创建安装目录 mkdir -p /usr/local/nginx)

***这里注意:如果是与fdfs整合,安装的同时要安装fdfs插件(前提是已经安装配置好了fastdfs-nginx-module)

执行命令:

./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src

命令解释:--prefix=/usr/local/nginx 这句指定nginx的安装路径是/usr/local/nginx

--add-module=/root/fastdfs-nginx-module/src 这句是添加插件后面是fdfsmodule的具体路径,如果仅仅是安装nginx,只需要执行命令 ./configure --prefix=/usr/local/nginx

6.编译安装 make && make install

7.检查是否成功

i.在/usr/local/nginx 下生成4个文件夹

conf nginx配置文件存放处

html nginx页面存放处

logs nginx日志存放处

sbin nginx脚本存放处

ii.启动 cd /usr/local/nginx/sbin => ./nginx

(ps -ef | grep nginx 查看是否有root和nobody两个进程已启动)

iii.浏览器中输入ip直接访问出现的是nginx页面

 

 

一、反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。反向代理的工作原理是,代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。

最常见的使用场景:研发服务器无法被外网访问,而此时产品经理想在外网环境体验一下后台系统服务,此时就可以借助一台可以访问研发服务器,并且自身支持外网访问的代理服务器。通常测试服务器具备这一条,我们可以在测试服务器上安装nginx,然后由nginx反向代理到研发服务器,这样就满足了产品经理的需求。

需求:研发服务器后台服务:192.168.10.107:8080     测试服务器:172.137.10.11   反向代理

修改conf/nginx.conf文件:

server {  
        listen       80;                                                         
        server_name  172.137.10.11;                                               
       
        location / {
            proxy_pass http://192.168.10.107:8080;
        }
}

访问172.137.10.11:80相当于访问192.168.10.107:8080

 

二、负载均衡

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。

后台部署有多个服务实例对外提供统一接口和服务,依赖nginx的反向代理和负载均衡,实现调用nginx的ip+port可以均衡访问各个服务实例。负载均衡的使用可以有效提高服务吞吐量,也可以合理利用服务器资源,还极大增强了抗风险能力(其中某一服务停了也不影响整体系统)。nginx支持自带的3种负载均衡策略和2种常用三方策略:

 

①RR(nginx默认策略):每个请求按时间顺序逐一分配到不同的服务器,如果某个服务不可达,会自动剔除。

 

upstream test {
        server localhost:8080;
        server localhost:8081;
}

server {
  listen       81;                                                         
  server_name  localhost;                                               

  location / {
    proxy_pass http://test;
  }
}

访问nginx的ip+81相当于均衡访问localhost:8080和localhost:8081

②权重:指定轮询几率,权重和访问率成正比,权重越高被访问几率越大

upstream test {
        server localhost:8080  weight=9;
        server localhost:8081  weight=1;
}

server {
  listen       81;                                                         
  server_name  localhost;                                               

  location / {
    proxy_pass http://test;
  }
}

访问nginx的ip+81相当于均衡访问localhost:8080和localhost:8081,访问10次中,有很大可能实际访问了9次8080端口的服务,1次8081的服务。

 

 

 

③ip_hash:策略1和2有个问题,下一次请求无法指定访问某个服务实例;对于要在session中保存信息的场景,就不适用了。使用ip_hash策略之后,每个请求会按照ip的hash结果进行分配,这样就可以保证同一个客户端的所有请求都固定访问某一个服务器。

upstream test {
        ip_hash;
        server localhost:8080;
        server localhost:8081;
}

server {
  listen       81;                                                         
  server_name  localhost;                                               

  location / {
    proxy_pass http://test;
  }
}

 

比如两个客户浏览器访问nginx服务器的ip+81,客户ip分别是xxx.xxx.xxx.10和xxx.xxx.xxx.11,则由ip_hash策略负载均衡后,xxx.xxx.xxx.10的所有请求可能都访问到localhost:8080,xxx.xxx.xxx.11的所有请求都访问到localhost:8081。

④fair:第三方策略,按后端服务器响应时间来分配请求,响应时间短的优先分配。(注意需要安装第三方插件)

 

upstream test {
        fair;
        server localhost:8080;
        server localhost:8081;
}

server {
  listen       81;                                                         
  server_name  localhost;                                               

  location / {
    proxy_pass http://test;
  }
}

⑤url_hash:第三方策略,按访问url的hash结果来分配请求,每个url定向到同一个后端服务器。(注意需要安装第三方插件)

 

upstream test {
        hash $request_uri;
        hash_method crc32;
        server localhost:8080;
        server localhost:8081;
}

server {
  listen       81;                                                         
  server_name  localhost;                                               

  location / {
    proxy_pass http://test;
  }
}

 

三、动静分离(Http服务器)

使用SpringBoot开发后台服务之后,官方就一直推荐前后端分离,也不再推荐使用jsp。前后端分离,字如其意,是指将前端页面和后端代码分离开来。我们之前的后台服务,一般都是在web-app目录下放置页面资源,前端代码和后台代码是在一个项目中,也是运行在一个tomcat容器中。这样做的缺点是不利于联合开发,也不好单独调试,前端的同时修改一下代码,需要上传之后,让后端同事去部署才能测试;后端同事也需要注意合并前端代码,并在代码中处理一些页面代码(jsp常常就是这样)。为了实现前后端分离,可以借助nginx将页面静态资源单独部署运行,与后台分离开来,互不影响。nginx此时就相当于一个web容器,只是它仅仅部署的是前端页面静态资源。

server {  
    listen       80;  
    server_name  localhost;  
    location / {  
        root   e:\wwwroot;  
        index  index.html;  
    }  
    # 所有静态请求都由nginx处理,存放目录为html  
    location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
       root    e:\wwwroot;  
    } 
    # error_page   500 502 503 504  /50x.html;  
    location = /50x.html {  
        root   e:\wwwroot;  
    }
}

如上,访问nginx ip+80/,相当于访问 e:/wwwroot/下面的资源。

 

四、网页压缩和图片压缩

***:什么是网页压缩和图片压缩?

实际应用中,存在某些网页中含有大量高清图片资源,或者含有大量信息,从而导致Tomcat容器压力较大,并且用户访问的时候也需要更大的带宽,加载速度也比较慢。为了解决这些问题,优化用户体验,因此引入了网页压缩和图片压缩。旨在通过压缩技术,将原本过大的网页进行压缩,再返回给浏览器,图片压缩也是一样。

 

***:如何配置网页压缩和图片压缩

1.开启网页压缩(修改nginx.conf)

# 开启gzip压缩功能
gzip on;  
# 设置允许压缩的页面最小字节数;
gzip_min_length 1;
# 设置压缩比率,最小为1,处理速度快,传输速度慢;9为最大压缩比,处理速度慢,传输速度快; 这里表示压缩级别,可以是0到9中的任一个,级别越高,压缩就越小,节省了带宽资源,但同时也消耗CPU资源,所以一般折中为6
gzip_comp_level 6;
# 指定压缩的类型,线上配置时尽可能配置多的压缩类型
gzip_types text/plain application/x-javascript test/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; 

2.开启图片压缩

图片压缩nginx本身不具备,需要依赖一个第三方插件支持。

①安装图片压缩插件:

# 安装插件
yum install gd-devel-2.0.35-26.el7.x86_64.rpm 
# 配置载入图片压缩插件
./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_image_filter_module=dynamic
# 编译
make

②修改配置(修改nginx.conf)

# 添加图片插件(在最外面进行配置,include同级)
load_module  modules/ngx_http_image_filter_module.so; 

# 以web服务器为例,展示配置开启图片压缩
server{
    listen 80;
    server_name localhost;
    
    location / {
        root  html;
        index index.html index.htm;
        # 配置图片压缩,改为50*100的尺寸
        image_filter resize 50 100;
    } 
}

 

***:开放跨域限制

有时候后台服务没有做开放跨域,除了修改后台服务代码,进行跨域开放处理之外,还可以利用nginx通过反向代理的同时,进行跨域开放配置。

#1.在http标签体中配置:(在http标签中配置,相当于在http中配置的所有代理都开放了跨域限制)
http {
    # 配置允许的Origin
    add_header 'Access-Control-Allow-Origin' '*'; 
    # 配置允许的方法
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
    # 配置允许的header
    add_header 'Access-Control-Allow-Headers' '*'; 
    
    #省略其它
    ...
}

#2.在server标签中配置:(在server标签中配置,相当于当前代理开放了跨域限制)
server{
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://localhost:8081/
        # 配置允许的Origin
        add_header 'Access-Control-Allow-Origin' '*'; 
        # 配置允许的方法
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
        # 配置允许的header
        add_header 'Access-Control-Allow-Headers' '*';
    }
}


 

***:配置Https

HTTPS证书即SSL证书,是数字证书的一种,bai类似于驾驶证、护照和营业执照的电子副本。

HTTPS证书的作用:

1、提升企业网站排名

目前Google、百度等主流搜索引擎表示会优先收录以HTTPS开头的网站,并赋予网站高权重,有效提高网站关键词的排名。网站安装SSL证书便可以实现网站从HTTP升级到HTTPS。

2、网站隐私信息加密

对网站传输的数据进行加密,包括网站用户的账户密码、身份证等隐私信息,防止被黑客监听、窃取和篡改。目前大部分网站都会涉及到用户的隐私数据传输,安装SSL证书很有必要。

3、浏览器受信任

如果没有安装SSL证书,用户通过谷歌、火狐等浏览器访问企业网站时会提示不安全,这必然会影响到用户的访问体验,而安装由受信任的证书颁发机构签发的SSL证书,会成为谷歌、火狐等主流浏览器受信任站点。

4、防止流量劫持

普通的http网站非常容易遭受网络攻击,尤其是流量劫持,会强制用户访客其他网站,从而造成网站流量损失。而安装受信任的SSL证书,你的网站就能有效避免流量劫持。

 

如果我们后台服务没有配置https,可以通过nginx进行反向代理,同时配置https,实现https访问,代理到实际的后台服务http接口。

没有证书的可以免费申请一个:https://certmall.trustauth.cn/Free (证书和后台服务域名或者公网ip是一一绑定的),拿到证书之后,就可以进行配置了:

在配置前建议先查看下是否开启了ssl:

# 查看配置
./nginx -V 

Java EE--组件篇 Nginx

出现如上图红框信息则表示支持ssl,可以进行https代理配置:

	server {
        # 80端口开启ssl
		listen       80 ssl;
		server_name  localhost;       
        # 证书crt文件(或者pem文件)所在路径
	    ssl_certificate      ssl/server.crt;
        # 证书key文件所在路径
       	ssl_certificate_key  ssl/server.key;
        # 缓存大小1MB
        ssl_session_cache    shared:SSL:1m;
        # 缓存超时时长5分钟
        ssl_session_timeout  5m;
        # 加密算法
        ssl_ciphers  HIGH:!aNULL:!MD5;
        # 使用客户端首选的加密算法
	    ssl_prefer_server_ciphers  on;

        location /{
            proxy_pass http://localhost:8080
        }
    }

如上相当于localhost:80开启https,代理实际的服务localhost:8080的http接口。

 

***:修改请求体大小

nginx默认的请求大小限制是1M,支持自定义配置。为了避免请求体过大,超出限制,而报403错误,可以配置大一点。

# 在server标签体中配置
server{
    listen 8080;
    server_name localhost;
    # 配置请求大小限制100M
    client_max_body_size 100M;

    # 省略其它
    ...
}

 

***:复用nginx,多项目分开配置

有时候我们有多个服务都需要进行代理,或者动静分离等,而我们又不想为每个服务都去安装一个nginx组件。这是就需要复用一个nginx,完成多个服务的业务功能。当然最简单的,我们可以在nginx.conf中直接配置多个 server。但这样就会导致频繁修改nginx.conf,而且会导致nginx.conf越来越大。一不小心误删了别人的配置,导致其他的服务出问题的事情常有发生。为了避免以上问题,可以使用include标签,做到分文件配置,一个服务一个配置文件,互不影响。

#实现反向代理、动静分离、负载均衡等都是在http标签中添加 server,所以引入其他配置文件也是在http标签中
http{
    
    # 引入当前路径的myconf文件夹下的所有conf文件
    include  myconf/*.conf
}


# myconf/static.conf
# 因为这里是被引入的配置文件,直接进行server配置即可
server {
    listen 80;
    server_name www.test.com;
    client_max_body_size 1024m;
    
    location /{
        proxy_pass http://localhost:8081;
    }
}

如上例,在nginx.conf中使用include标签,引入了myconf文件夹下的所有conf配置文件,所以我们之后的服务需要用nginx,只用在myconf文件夹下新建一个conf文件,在里面配置server即可。这样就实现了一个服务一个conf,大家互不影响,也支持多人并发开发。

 

***:root和alias的区别

在配置反向代理时,有两个标签可以使用,分别是root和alias:

server{
    listen 80;
    server_name localhost;

    location /static {
        root /usr/local/demo/html;
    }
}

如上,使用root标签进行代理路径配置,当浏览器访问 ip+80/static 时,相当于访问 /usr/local/demo/html/static 下的资源。使用root配置,nginx可以智能识别“/”,所以上面可以是 “/static/”或者“/usr/local/demo/html”;多余的“/”或者缺少的“/”,nginx都可以自动添加,组合成正确的路径。

server{
    listen 80;
    server_name localhost;

    location /static {
        alias /usr/local/demo/html/;
    }
}

如上,使用alias标签进行代理路径配置,当浏览器访问 ip+80/static 时,相当于访问 /usr/local/demo/html/ 下的资源。使用alias标签配置,相当于是简单的路径替换,即请求路径:

/static  <=> /usr/local/demo/html/;所以要访问其下的index.html,即/static/index.html,实际访问的是/usr/local/demo/html/index.html。

由于alias仅是一个字符串替换,所以要求alias后面的路径必须配置正确,且最后一个路径分隔符也必须添加(nginx不会自动添加,如果没有,则上面的路径就是/usr/local/demo/htmlindex.html,显然它是错误的)。

小贴士:注意windows下的路径配置,其分隔符不能是\,必须是/. 正确的路径配置:root D:/test/html/;


以上系个人理解,如果存在错误,欢迎大家指正。原创不易,转载请注明出处!

上一篇:context包


下一篇:Java EE,放马过来