Nginx
我们知道随着互联网网民的增多,我们的服务的压力也在增大,那么单独靠着增加硬件资源去提升应用性能是一种成本比较高的手段,这个时候Nginx应运而生,他是一个轻量级的Http Server,和我们平常使用的tomcat的区别是:Tomcat是存放系统程序的服务器叫做application server,而Nginx则是http server,是用来访问静态资源的。但是其实他们两个都可以做到对方可以做到的功能,存放系统程序和静态资源。因为平常http服务器跑在应用服务器之前,所以也叫代理服务器。一般来说,nginx部署在多个tomcat前面做负载,或者把静态资源放在ngxin中。本篇聊聊他的使用,和一些和它相关的知识。
相关名词
【IP和端口】:
ip是分配给每个计算机的地址,在互联网中我们可以通过ip去查询电脑所在的地方。因为一台电脑上有多个应用程序,我们想找到指定的应用程序,就需要给每个程序分配一个端口。
【域名】:
因为ip比较难记住,我们就发明的域名,他有特殊的含义,比如www.baidu.com,很好记,并且有特殊含义(众里寻他千百度)。
【DNS】:
我们在浏览器中输入域名,他就会自动转化成ip,然后跳转到相应的服务器上,这个把域名转化成ip的东西就叫做DNS。
nginx相关点
网上很多搭建教程,这里不写搭建的教程了。
- 如果配置中有空格,需要使用单引号或者双引号括住配置项的值
- 每行配置的结尾必须加上分号,否则启动不成功
常用命令
- nginx -s reopen #重启Nginx
- nginx -s reload #重新加载Nginx配置文件,然后重启
- Nginx nginx -s stop #强制停止Nginx服务
- nginx -s quit #停止Nginx服务(即处理完所有请求后再停止服务)
- nginx -t #检测配置文件是否有语法错误,然后退出
Nginx相关文件
【日志文件】:一般进入nginx后就有一个日志的文件夹
- 【error.log】:错误日志
- 【access.log】:访问日志,这个我们可以进行配置显示的内容。nginx提供了一些变量,我们可以获取到相关的内容。
- 具体做法:在他的配置中的http模块中这样配置。log_format 指的是输出的内容,这些变量时nginx提供的,access_log 后面配置的是访问日志的输出路径。
Nginx 实现虚拟主机
虚拟主机(virtual host):听着挺抽象的,实际上就是同一个服务器的不同的磁盘的路径,这些虚拟主机是在实际的机器上,并且和实际的机器是同一个ip。
首先我们假设有三个域名,并且在域名中建立和我们实际ip的对应关系。在host文件中加上就行。
编写别名,在~/.bashrc 中为我们的启动命令加上别名,因为我有不同的nginx的配置文件,所有这里直接用别名(懒得敲)【./niginx -c 是指定配置文件启动】,这里我们创建的配置文件为nginx.domains.conf. 修改完别名后要执行 【source ~/.bashrc】
为这三个域名创建三个文件夹,
并且每个文件夹中有一个index.html文件,里面其实没有什么,只有他们相关的名称。
然后我们在nginx.domains.conf中对这三个虚拟主机进行配置
View Codeworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # 进行不同域名的转发 server { listen 80; server_name www.lizi.com; root /usr/local/nginx/data/lizi; location / { index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name www.guoxuan.com; root /usr/local/nginx/data/guoxuan; location / { index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name www.glen.com; root /usr/local/nginx/data/glen; location / { index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }效果如下:
Nginx 实现反向代理
反向代理和正向代理是相反的,
正向代理指的是:如果我们无法访问某个网站,那可能因为我们的ip被限制了,VPN就是一个典型的正向代理的例子,VPN可以连接目标服务器, 我们可以连接VPN,这样VPN就为我们进行了正向代理,可以说他是为我们的客户端服务的,
反向代理:就是我们访问服务端,首先访问到的是他,然后他把我们的请求转发到不同的服务端(服务端可能是集群),他是为服务端服务的。
那我们要进行反向代理,
整体流程为:
- 我们访问nginx
- nginx把我们的请求转发到别的服务器上
- 别的服务器返回数据给我们
【具体做法】:
在nginx中配置我们的转发地址(我本地有一个springBoot的项目,端口为9096,我想让nginx把请求转发到我本地的服务上(43.81 ))
View Codeworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_user [$time_local] $http_x_Forwarded_for $remote_addr $request ' '$http_x_forwarded_for ' '$upstream_addr ' 'ups_resp_time: $upstream_response_time ' 'request_time: $request_time \n'; access_log /usr/local/nginx/logs/access.log main buffer=1k; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { proxy_pass http://192.168.43.81:9096; proxy_method POST; proxy_set_header Host $host; #获取客户端的ip地址设置到header中 proxy_set_header X-Real-IP $remote_addr; #获取所有转发请求的ip信息列表 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }然后在浏览器中访问nginx。43.5是我本地虚拟机的地址(也就是nginx的部署地址) 43.81 我本地微服务的地址。
Nginx 实现负载均衡
他默认使用的是权重轮询,就是根据我们下面表格中的weight进行访问的。
下面是相关配置,我们只用把我们要进行负载的服务器写在里面即可
View Codeworker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #我们的服务组 upstream ecif { server 192.168.43.81:12673; server 192.168.43.81:12674; server 192.168.43.81:12675; } server { listen 80; server_name localhost; location / { proxy_pass http://ecif; } } }
nginx还可以做的事情
【实现http缓存】:为了避免每次客户端都去访问我们服务端,从而造服务器的压力过大,我们可以把一些特定的资源放在nginx中的缓存中,但是这可能引发一个问题,就是每次他都命中了缓存,那如果服务端更新了缓存怎么办?我们可以引入一个缓存清理插件(ngx_cache_purge),当服务端修改的时候,主动去请求一个地址,nginx中的缓存文件会被清除。
【动静分离】:我们的jsp,php这些都是动态的,图片这些都是静态的。流程为:当客户端访问到nginx的时候,nginx把请求转发到我们的某个服务上。比如说请求到一个jsp中,这个jsp中需要图片,那我们就可以把这个文件放在nginx服务所在的服务器上,或者放在其他的服务器上。jsp中的src目录前加上【../】即可访问。
【数据压缩】:nginx默认继承了gzip的压缩机制,可以对各种资源进行压缩。提高响应性能。
【跨域访问】:在浏览器中我们默认是不能通过一个域名访问当另外一个域名的,这样可以规避诈骗等事情的发生。比如我们访问一个假的银行网站,输入我们的密码后,他发送我们的密码去真的银行网站,然后真的银行返回了一些我们的信息或者其他的东西,这样就可能造成信息泄露等问题的发生。
【方法一】:把两个服务都使用nginx进行代理,当两个服务在同一个域下,就不会产生跨域问题了。
【方法二】:当A访问nginx的时候,nginx访问到B的时候,B返回了数据之后,nginx给返回值上加上允许访问的属性,这样浏览器就可以渲染数据了。
【其他方法一】:前端请求使用jsonp的方式,底层其实是使用了类似image这种标签的src的请求方式,这种方式不被浏览器限制。
【其他方法二】:在目标服务器的controller的方法上加上@CrossOrigin注解,这样再返回给浏览器的时候,会给响应头上加上可以被访问的属性,浏览器解析到这个属性则不会对数据拦截。
【其他方法三】:使用WebMvcConfigAdapter配置可以访问的白名单。