目录
前言
带着问题学java系列博文之java基础篇。从问题出发,学习java知识。
Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,*使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
在后台业务开发中,常常需要用到一些组件,利用组件提供的功能完成一些特定的需求。Nginx就是常常用到的一个组件之一,我们主要利用它来实现三大功能:反向代理、负载均衡和web服务器(动静分离)。
下载安装
windows:http://nginx.org/en/download.html 下载稳定版本
下载之后直接解压即可(注意全路径不要包含中文,否则启动可能会报错):
双击nginx.exe运行。在浏览器输入localhost:80/
linux: http://nginx.org/en/download.html 下载稳定版本
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
出现如上图红框信息则表示支持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/;
以上系个人理解,如果存在错误,欢迎大家指正。原创不易,转载请注明出处!