听说微信搜索《Java鱼仔》会变更强哦!
本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦
(一)概述
最近做的一个项目在迁移公网环境的时候出了一个问题,明明服务都起来了,但是怎样都访问不进来。后来才发现是Nginx的配置出了问题。无奈自己关于Nginx的学习在大学毕业后就差不多遗忘了,当时又紧急找不到运维人员,差点就只能以失败结束迁移。
因此觉得就算是干后端开发,对于基本的nginx配置依旧需要有所了解,于是写了这篇后端人员应该懂的nginx文章,希望对大家有所帮助。
(二)Nginx入门
nginx是一个高性能的WEB服务器,Nginx可以实现正向代理、反向代理、负载均衡等功能。比如我现在正在做的一个项目有11台应用服务器,就是用nginx做的反向代理。
关于正向代理和反向代理,两者在概念上有区别,但是在技术实现上完全没有区别。
正向代理:代理服务器放在客户端和服务都能连接到的位置,我们通过访问代理服务器从而访问到目标服务。
反向代理:通过访问代理服务器,代理服务器将请求分发给其他服务,这就是反向代理。
但是在技术上都只需要配置location中的proxy_pass即可。
2.1 安装
这里的安装都在Linux环境下进行,nginx虽然也有window版本,但是还没有见过哪个项目把nginx放在windows服务器上的。
运行nginx需要一些环境,这里需要先安装完毕:
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel
接着下载nginx的压缩包,版本视情况而定,这里用的是1.14.2:
wget http://nginx.org/download/nginx-1.14.2.tar.gz
采用默认的方式安装:
./configure make make install
分别执行完成之后,nginx运行文件就会安装到/usr/local/nginx中
通过下面的代码检查是否成功:
/usr/local/nginx/sbin/nginx -V
2.2 基本命令
#配置文件启动./sbin/nginx-c/conf/nginx.conf#指定nginx程序目录启动./sbin/nginx-p/usr/local/nginx#停止:第二种更加优雅./sbin/nginx-sstop./sbin/nginx-squit#重载配置文件./sbin/nginx-sreload
2.3 代理的相关参数
proxy_pass#代理服务proxy_redirectoff;#是否允许重定向proxy_set_headerHost$host;#转发时传header参数proxy_set_headerX-Forwarded-For$remote_addr;#设置请求的ip地址proxy_connect_timeout90;#连接代理服务超时时间proxy_send_timeout90;#请求发送最大时间proxy_read_timeout90;#读取最大时间#缓存相关proxy_buffer_size4k;proxy_buffers432k;proxy_busy_buffers_size64k;proxy_temp_file_write_size64k;
2.4 设置代理
location/javayz/{proxy_passhttp://127.0.0.1:8080;}
设置完之后当访问 /javayz时就会代理到本机的8080端口上。
proxy_pass后的url是否加/也有讲究,如果加了/则代表绝对根路径,不带就是相对根路径,比如我访问http://127.0.0.1/javayz/index.html,按照上面的配置会转发到:
http://127.0.0.1:8080/javayz/index.html。如果配置改成这样:
location/javayz/{proxy_passhttp://127.0.0.1:8080/;}
转发后的地址变成:http://127.0.0.1:8080/index.html
(三)nginx负载均衡
nginx用的最多的就是负载均衡,通过upstream就能实现负载均衡。
首先我在服务器上部署了两个很简单的SpringBoot项目,其中一个访问8081端口时返回8081,另一个访问8082端口时返回8082
publicclassIndexController { value="/",method=RequestMethod.GET) (publicStringindex(){ return"8081"; } }
接着配置nginx的负载均衡:
#配置集群,这段代码写在http块中 upstream backend { server 127.0.0.1:8081; server 127.0.0.1:8082; } #配置在server块中 location / { proxy_pass http://backend/; }
接着通过curl命令进行访问:
8081和8082以轮询的方式运行,如果遇到一台服务器的配置比较好,希望负载的时候更多请求打在那台服务器上,可以给不同的服务增加比重:
upstream backend { server 127.0.0.1:8081 weight=2; server 127.0.0.1:8082 weight=1; }
再次执行curl命令:
upstream的相关参数如下:
server 服务ip:端口 weight 权重 max_fails 最多失败连接的次数,超过就认为主机挂掉了 fail_timeout 重新连接的时间 backup 备用服务 max_conns 允许的最大连接数 slow_start 节点恢复后,等待多少秒后再加入
(四)Nginx负载均衡算法
Nginx采用的默认负载均衡算法是轮询+权重,也就是按照设置的权重逐个轮询。除此之外,还有许多其他的负载均衡算法。
ip_hash算法:对于访问的ip,他会做一次hash运算,并对当前的负载应用数量做一次取余运算,这种算法能保证同一个ip访问的是同一台应用服务器。
upstream backend { ip_hash; server 127.0.0.1:8081; server 127.0.0.1:8082; }
url_hash算法:对于请求的url进行hash运算,这种算法能保证同一个url访问的是同一台应用服务器。
upstream backend { url_hash; server 127.0.0.1:8081; server 127.0.0.1:8082; }
least_conn算法:将请求分发到连接数最少的节点上。
least_time算法:将请求分配到响应最快的节点上。
(五)Nginx缓存
如果每次请求都需要反向代理给应用服务器,那对带宽和性能的压力是很大的,Nginx中有对缓存的支持,它可以将那些变化不大的前端静态页面加载到缓存中,增强整体的性能。
5.1 在http元素下添加缓存声明
该语句放在http元素下
proxy_cache_path /www/javayz/cache levels=1:2 keys_zone=cache_javayz:500m inactive=20d max_size=1g; #proxy_cache_path 缓存存放的路径 #levels 缓存层级及目录的位数,1:2表示两级目录,第一级目录用1位16进制表示,第二级目录用2位16进制表示 #keys_zone 缓存区内存大小 #inactive 有效期,如果缓存有效期内未使用,则删除 #max_size 存储缓存的硬盘大小
5.2 在location中设定缓存策略
该语句放在location元素中
#指定缓存区,就是上面设置的key_zone proxy_cache cache_javayz; #缓存的key,这里用请求的全路径md5做为key proxy_cache_key $host$uri$is_args$args; #对不通的http状态码设置不同的缓存时间,下面的配置表示200时才进行缓存,缓存时间12小时 proxy_cache_valid 200 12h;
5.3 访问生成缓存
可能会出现缓存生成不了的情况,这时候把user切换成root
访问一次后缓存文件就在上面的路径下生成了。
5.4 缓存的清除
下载模块:
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
解压
tar -zxvf ngx_cache_purge-2.3.tar.gz
在nginx的安装目录下配置
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_cache_purge-2.3
重新编译:
make
编译好后会在nginx安装目录下多出一个/objs目录,该目录下有个nginx文件,将这个文
件替换到/usr/local/nginx/sbin/中。
检查是否安装成功
重新运行后,只需要访问http://ip:80/clear/,即可清除缓存
(六)总结
如果你的公司职责区分严格,那么对于后端开发来说知道nginx的这些概念足够理解整个架构的运行流程了。如果你同时身兼开发和运维的工作,那么这些还不够。学习总是需要不断向前,我们下期再见。